PostgreSQL pg_basebackup-阿里云开发者社区

开发者社区> 数据库> 正文

PostgreSQL pg_basebackup

简介: 本文探讨 pg_basebackup工具,本地备份、远程备份、单一表空间本地数据库的备份、表空间重定向

需要注意的地方:

1. pg_basebackup被用于获取一个正在运行中的pg数据库集簇的基础备份。该备份并不影响其他连接到该数据库的客户端。
2. 可以用做时间点恢复
3. 可以做流复制后备服务器的开始点
4. pg_basebackup创建数据库集簇文件的一份2进制副本。同时自动让系统进入和退出备份模式。
5. 备份整个数据库集簇,而不是单个数据库或数据库对象,如果你备份单个数据库,可以使用pg_dump
6. 备份是通过pg的网络连接进行的,而且要有权限,所以你要配置pg_hba.conf和使用postgres超级用户。
7. 如果你使用流复制,则max_wal_senders必须设置的足够高,你也必须保留一个会话、一个wal日志用于发送给流复制的备端。
8. 同一时间可以有多个pg_basebackup运行。但是从性能的角度来看,最好只有一个。
9. pg_basebackup也可以用于备机上的备份。但是在备机上备份有一些限制。有啥限制详细请参考http://postgres.cn/docs/11/app-pgbasebackup.html
10. 该工具是通过流复制来备份的,所以你的pg_hba.conf中得有replication权限。
11. 该工具并不用连接到任何数据库之中,所以不需要指定数据库名字
12. 当你备份的时候pg_wal下的任何归档文件都不会给你备份上。你需要用archive_command另存一份归档。
13. 当你备份的时候log目录下的log会给你备份上,但是该log日志一般用不到,可以提前删掉,或者备份的时候排除掉。

注意:

备份的时候,备份两部分,$PGDATA和自定义表空间;$PGDATA是会放到你指定的备份目录下;自定义表空间会放到跟它原来相同的路径下。比如说未备份前你的$PGDATA是/gao/data,表空间是/jia/ts;那你备份的时候pg_basebackup会把表空间还给你放在/jia/ts下,这样就会报错退出备份,同时提示你文件已存在。

所以,如果你在本机备份本机pg,会报目录下的文件已经存在,报错退出。因为PG默认就会这么存放。如果你想不存放相同路径,则可以用参数-Ft把表空间生成为tar文件,从而避免文件和路径同名的情况。默认参数是-Fp,就是放在同路径,叫同名字。

举例:
创建目录,用户,表空间,数据库,表,索引

数据创建好后,pg_hba.conf中要设置访问权限

是replication的,表示允许流复制连接,而不是允许连接到一个replication名字的数据库上。
没有允许流复制连接的规则,则报错。

需要注意的是你的这条访问规则要么写成

允许所有用户,所有IP地址访问

要么写成

指定用户或者all用户,指定具体的IP来访问

要么写成

所有用户,指定IP区间来访问

要么写成

虽然这里具体的IP 31.123跟/24不太搭,但是也可以使用,不信你就试试。

首先必须要写replicaton表示允许流复制连接,其次是没有0.0.0.0/24这种写法,
如果你写成0.0.0.0/24这种,那么你将无法使用pg_basebackup -h 主机名/IP 备份,会报你的pg_hba.conf里没有指定IP地址的设置。

实验1:本地备份
在自己的服务器上备份自己
[postgres@gao backup]$ pg_basebackup -D gaobk -Ft -z -P
40608/40608 kB (100%), 3/3 tablespaces

-D就是生成什么目录,可以写绝对路径,如果有重名路径则报错
-Ft -F就是输出格式,输出为t格式,就是将输出写成目标目录中的tar文件。pg的主数据目录被写入到一个名为base.tar文件中,其他表空间将已其OID命名
-z 启用对tar文件进行gzip压缩,使用默认的压缩级别,只有使用tar格式时才可用。压缩后在所有tar文件后加上.gz后缀。
-P 启用进度报告,备份期间生成一个大致的进度报告,会计算整个数据库尺寸、wal日志等、总数据量无法准确预估。启用该参数会增加一点点备份时间。

看上面的内容,显示大小,百分比,几个表空间;大小和百分比都是不准的。表空间数量是准确的。

有3个表空间被备份了,是哪3个呢?

16470、16471、base(就是pg_default表空间)

可是我有4个表空间,为啥pg_global没备份啊

pg_default是pg系统表空间,对应的物理位置为$PGDATA/base目录。template0和template1数据库默认表空间就是这个。用来存储系统目录对象、用户表、用户index、临时表、临时表index、内部临时表的默认表空间。相对来说比较重要,所以备份上。

pg_global是系统字典表都存在这,哪个PG都有,都一样。所以不备份。

实验2:远程备份
在A服务器上备份B服务器上的PG数据库集簇
[postgres@gao backup]$ pg_basebackup -h gao -D gaobk -Ft -z -P
-h 主机名或者IP地址

实验3:单一表空间本地数据库的备份
备份:
[postgres@gao backup]$ pg_basebackup -D --Ft -X fetch | bzip2 > backup.tar.bz2
如果在该数据库中只有一个表空间,则可以成功,如果有多个表空间,则失败。
我这个就是多表空间的,所以失败了,报错如下图

实验4:表空间重定向
备份:
[postgres@gao gaobkdata]$ pg_basebackup -D gaobkdata -T /pg/pg12/tablespace/gao_ts=/pg/pg12/tablespace2/gao_ts -T /pg/pg12/tablespace/jia_ts=/pg/pg12/tablespace2/jia_ts -Ft -P

把老表空间下的gao_ts、jia_ts重定向到了tablespace2目录下。
比如说新服务器实例的表空间路径要变化,可以用这个来搞。
必须写绝对路径。
如果以这种方法重定位一个表空间,祝数据目录中的符号链接会被更新成指向新位置。

注意:
每当你使用pg_basebackup工具备份后,将会生成一个备份历史文件。
文件存放两份,一份在$PGDATA/pg_wal中,名字叫做

每次你的pg_basebackup,都会生成一个新的备份历史文件中,覆盖老的(即使文件名不相同)。

一份在你自定义归档存放的地方,新的不会覆盖老的,跟放在pg_wal中不同。

该文件的命名分为3段式,用2个点来分隔。
第一段:你的pg_basebackup起始需要的归档文件叫什么名字
第二段:wal文件中的一个准确位置(PG知道就行,用户知道到没必要)
第三段:备份标识,知道是啥命令产生的就行。

向上图这样,我需要的第一个wal日志是1D,后面需要的是1E,1F等等;1D之前的归档就可以删掉了。
像1D和之后的wal日志是必须要保存的,为了方便使用pg_basebackup备份出来的东西恢复。所以你要考虑准备花多长时间来进行恢复,多次pg_basebackup备份之间的归档日志如何保留和删除。

解压缩可以用 tar -xzvf 来解压缩tar.gz文件

如果你用了-Ft参数,则备份出来的文件有4个,其中base.tar.gz目录中的pg_tblspc中是没有软连接文件的。
那我怎么知道表空间软连接哪个是哪个?pg_basebackup备份的时候会在base.tar.gz中生成一个文件叫做tablespace_map文件,查看该文件就会有oid对应表空间的解析

原来的长这样

所以你就可以根据这些信息来恢复$PGDATA和自定义表空间了。但是是手工来操作的,想要靠几条命令来恢复pg是不可能的。
image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章