北在南方

V1

2022/09/12阅读:23主题:默认主题

深入浅出 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归档以及设置相关参数才能开启备份 。

  1. 创建备份存储的目录以及wal log 存储的目录。
 mkdir -p /data/backups/20220910
 mkdir -p /data/archive_wal_log/
  1. 设置参数
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

四 使用注意事项

  1. pg_basebackup 不仅可以备份主库,也可以备份从库。

    注意:

    要对从库进行备份。需要设置备用参数 setmax_wal_sendershot_standby,还需要在主库上启用full_page_writes

  2. 归档日志需要单独备份, 经常遇到WAL log 备份的空间问题。

  3. 使用复制协议 REPLICATION权限或者是超级用户的用户 ID 建立连接,并且pg_hba.conf必须允许复制连接。

  4. 服务器还必须配置 max_wal_senders 设置得足够高,以提供至少一个用于备份的 walsender 和一个用于 WAL 流式传输(如果使用)。

  5. 如果在备份期间将备用数据库提升为主数据库,则备份将失败。

推荐阅读

http://mysql.taobao.org/monthly/2018/08/06/

分类:

后端

标签:

后端

作者介绍

北在南方
V1