PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
第41讲:表空间备份与恢复
PostgreSQL第41讲:1月13日(周六)19:30,钉钉群(35822460)& 视频号(数据库老陈)直播 内容1:表空间备份与恢复的意义 内容2:PostgreSQL表空间概念 内容3:基于表空间备份 内容4:基于表空间的完全恢复
表空间备份与恢复的意义 PostgreSQL数据库备份所存在的问题: 1、PG备份工具备份的总是整个数据目录,数据量大,备份时间长。 2、PG备份工具恢复时总是恢复整个数据目录,数据量大,恢复时间长。 3、使用表空间的备份与恢复,可以减少备份数据,缩短备份与恢复的时间。
Tablespaces · PostgreSQL中的表空间是基本目录之外的附加数据区域,此功能已在版本8.0中实现。 · 初始化数据库后默认的表空间有pg_default、pg_global。 · pg_global表空间的物理文件位置在数据目录的global目录中,它用来保存系统表。 · pg_default表空间的物理文件位置在数据目录的base子目录中,是template0和template1数据库的默认表空间。 · 创建数据库时,默认从template1数据库进行克隆,因此除非特别指定了新建数据库的表空间,否则默认使用template1使用的表空间,即pg_default表空间。
PostgreSQL表空间物理文件位置
创建表空间时产生的目录命名规则: PG _ 'Major version' _ 'Catalogue version number' 例如: sampledb=# create tablespace new_tblspc location '/home/postgres/tblspc'; $ ls -l /home/postgres/tblspc/ total 4 drwx------ 4 postgres postgres PG_12_201909212
新建表空间的目录由pg_tblspc子目录中的软链接寻址,链接名与表空间的OID值相同。 postgres=# select oid,spcname from pg_tablespace; oid | spcname -------+------------ 1663 | pg_default 1664 | pg_global 90208 | new_tblspc (3 rows) $ ls -l $PGDATA/pg_tblspc/ total 0 lrwxrwxrwx. 1 postgres postgres 90208 -> /home/postgres/tblspc
· 如果在表空间下创建一个新的数据库(OID是90209),那么它的目录将在版本特定的子目录下创建: ls -l /home/postgres/tblspc/PG_12_201909212 total 4 drwxr-x---. 2 postgres postgres 4096 Mar 30 09:27 90209 · 在base目录下创建的数据库上创建新表指定到新建的表空间: testdb=# create table test1 (id int) tablespace new_tblspc; testdb=# SELECT pg_relation_filepath('test1'); pg_relation_filepath --------------------------------------------- pg_tblspc/90208/PG_12_201909212/16385/90210 #在新表空间目录下创建数据库目录
执行pg_basebackup备份 示例 产生压缩的tar包,-Ft参数指定: pg_basebackup -D bk1 -Ft -z -P 此备份花的时间比较长,但是节省空间。支持表空间文件存放在其它目录下。 产生跟源文件一样的格式,即原样格式,-Fp参数指定: pg_basebackup -D bk2 -Fp -P 此备份方式很快,但是不节省空间。如果有表空间路径放在其它目录下,则备份失败。
执行表空间备份 示例 数据库中执行开始备份函数 select pg_start_backup('tbs'); 使用tar命令进行备份(备份tblspc表空间所在的目录) cp -rf /home/postgres/tblspc /home/postgres/bk1 cp $PGDATA/backup_lable /home/postgres/bk1 数据库中执行结束备份函数 select pg_stop_backup();
执行一个基于表空间备份的完全恢复 PG支持基于表空间(除了pg_global之外)级别的完全恢复,因为pg_global表空间比较特殊,其中包括控制文件,而控制文件不能使用备份的进行恢复。 1、转储备份的表空间目录到目标位置 cp -rf /backup/PG_12_201909212 /home/postgres/tblspc 2、转储backup_lable文件到$PGDATA目录下 cp /backup/backup_lable $PGDATA 3、创建recovery.signal 4、修改postgresql.conf文件 restore_command = 'cp /home/postgres/archives/%f %p' recovery_target_timeline = 'latest' 5、启动数据库,表空间所包含的表能够实现完全恢复 pg_ctl start
总结 PostgreSQL数据库支持表空间的备份与完全恢复,不支持表空间下某个数据库的备份与恢复。 备份与恢复时针对的是整个表空间所在的目录。
执行表空间恢复后数据库正常使用,数据完整,证明表空间备份恢复是可行的。 CUUG PostgreSQL技术大讲堂系列公开课第41讲-表空间备份与恢复,往期视频及文档,请联系CUUG。
|