PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
第41讲:表空间备份与恢复
PostgreSQL第41讲:1月13日(周六)19:30直播
内容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数据库支持表空间的备份与完全恢复,不支持表空间下某个数据库的备份与恢复。
备份与恢复时针对的是整个表空间所在的目录。
执行表空间恢复后数据库正常使用,数据完整,证明表空间备份恢复是可行的。