北在南方
2022/09/12阅读:125主题:默认主题
深入浅出 PG 备份工具 pg_basebackup
一简介
pg_basebackup
是一款针对 PostgreSQL 的备份工具,它可以针对正在运行的PostgreSQL数据库进行备份,不阻塞数据库的读写操作。该工具只能用作全实例备份,不能单独备份某个数据库。
基础工作原理
1)创建检查点,打开FPW (full-page-write) ,创建备份标签(存储检查点位置,时间等信息) 2)通过流复制协议与数据库建立连接,主库的WAL Sender进程向pg_basebackup发送数据库物理文件 3)pg_basebackup接收到文件后写入目标位置(压缩或不压缩)
二 相关参数
pg_basebackup --help
用法:
pg_basebackup [选项] ...
控制输出的选项:
-D, --pgdata=DIRECTORY 接收基本备份到目录,如果不存在会自动创建
-F, --format=p|t 输出格式(plain,直接拷贝数据文件,tar 配合 -z -Z 进行打包压缩)
-r, --max-rate=RATE 传输数据目录的最大传输速率(以 kB/s 为单位,或使用后缀“k”或“M”)
-R,--write-recovery-conf 是否输出recovery-conf文件,方便后续使用备份快速搭建出从节点
-T, --tablespace-mapping=OLDDIR=NEWDIR 将 OLDDIR 中的表空间重定位到 NEWDIR
--waldir=WALDIR 预写日志目录的位置
-X, --wal-method=none|fetch|stream 包含指定方法所需的 WAL 文件
-z, --gzip 压缩 tar 输出
-Z, --compress=0-9 使用给定的压缩级别压缩 tar 输出
常规选项:
-c, --checkpoint=fast|spread 设置快速或扩展检查点
-C, --create-slot 创建复制槽
-l, --label=LABEL 设置备份标签
-n, --no-clean 出错后不清理
-N, --no-sync 不等待更改安全写入磁盘
-P, --progress 显示进度信息
-S, --slot=SLOTNAME 要使用的复制槽
-v, --verbose 输出详细信息
-V, --version 输出版本信息,然后退出
--no-slot 防止创建临时复制槽
--no-verify-checksums 不验证校验和
-?, --help 显示此帮助,然后退出
连接选项:
-d, --dbname 数据库名称
-h, --host 数据库服务器主机ip或套接字目录
-p, --port 数据库口号
-s, --status-interval=状态包发送到服务器的间隔时间(以秒为单位)
-U, --username 连接用户,要有super权限
-w, --no-password 从不提示输入密码
三 实践
3.1 开启备份
PG 实例需要打开wal log归档以及设置相关参数才能开启备份 。
-
创建备份存储的目录以及wal log 存储的目录。
mkdir -p /data/backups/20220910
mkdir -p /data/archive_wal_log/
-
设置参数
archive_mode = on
archive_command = 'cp %p /data/postgresql/archive_wal_log/%f ' #直接拷贝到本机指定的归档目录
wal_level = 'replica'
wal_level 说明
pg 10 以后的版本,wal_level 的可选值为 minimal、replica、logical。
minimal :不能通过基础备份和wal日志恢复数据库。
replica = 9.6版本以前的archive和hot_standby --该级别支持wal归档和复制。
logical :在replica级别的基础上添加了支持逻辑解码所需的信息
然后重启数据库实例。
3.2 全量备份
在本机使用打包备份并且压缩备份的方式,将备份文件存放到 /data/backups/202209061500
pg_basebackup -Ft -Pv -Xf -z -Z5 -p 5435 -U polardb -D /data/backups/2022090616
/data/backup/202209061500 里面的文件如下:
当然也可以使用拷贝文件的方式
pg_basebackup -Fp -Pv -Xf -p 5435 -U polardb -D /data/backups/2022090616
[polardb@db2 ~]$ pg_basebackup -Fp -Pv -Xf -p 5435 -U polardb -D /data/backups/2022090616/
pg_basebackup: initiating base backup, waiting for checkpoint to complete
WARNING: skipping special file "./.s.PGSQL.5435"
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 471/4000CEC8 on timeline 3
WARNING: skipping special file "./.s.PGSQL.5435"/2022090616/base/16384/16433)
10545487/10545487 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 471/4000D078
pg_basebackup: base backup completed
3.3 恢复
恢复的类型基本分为两种 全量恢复 和 按照时间点/LSN 来恢复。
PG 12 版本以前
1 创建新的实例 data 目录,将备份目录的数据文件等拷贝到目录 /u01/pg5436/data
2 在 /u01/pg5436/data 文件下中增加 recovery.conf 文件并且添加如下内容:
restore_command = 'cp /data/backups/archive_wal_/%f %p'
recovery_target_timeline = 'latest'
注意:
配置recovery_target_timeline参数, 便于判断是否已经到达还原点. (可选, 仅做PITR时需要.一般都是恢复到最新)
备份完成后recovery.conf文件名会自动修改为 recovery.done
PG 12 以后 从PG 12开始,针对此问题进行了改进,取消 recovery.conf 并且把 recovery.conf 中的参数合到 postgresql.conf 配置文件中,但在非恢复模式这些参数将被忽略。另外就是增加两个新文件进行替换:
recovery.signal:告诉PostgreSQL进入正常的归档恢复
standby.signal:告诉PostgreSQL进入standby模式
如果两个文件都存在,则standby.signal优先。
具体的恢复步骤
1 创建目标实例的 PGDATA 目录,
mkdir -p /u01/pg5446/data
chmod 0600 /u01/pg5446/data
2 拷贝备份集合到 $PGDATA 目录
3 生成touch $PGDATA/recovery.signal
4 修改 postgresql.conf 文件中 restore_command 和 recovery_target 参数
5 重启实例
pg_ctl start -D /u01/pg5446/data
四 使用注意事项
-
pg_basebackup 不仅可以备份主库,也可以备份从库。
注意:
要对从库进行备份。需要设置备用参数
setmax_wal_senders
和hot_standby
,还需要在主库上启用full_page_writes
。 -
归档日志需要单独备份, 经常遇到WAL log 备份的空间问题。
-
使用复制协议 REPLICATION权限或者是超级用户的用户 ID 建立连接,并且pg_hba.conf必须允许复制连接。
-
服务器还必须配置
max_wal_senders
设置得足够高,以提供至少一个用于备份的 walsender 和一个用于 WAL 流式传输(如果使用)。 -
如果在备份期间将备用数据库提升为主数据库,则备份将失败。
推荐阅读
http://mysql.taobao.org/monthly/2018/08/06/
作者介绍