玉溪市网站建设_网站建设公司_测试工程师_seo优化
2025/12/29 15:34:19 网站建设 项目流程

https://www.postgresql.org/docs/current/continuous-archiving.html#CONTINUOUS-ARCHIVING

在PG主从复制一文中,我们使用pg_basebackup进行了远程备份并通过-D指定了本地存储位置,生产上当然还需要额外的进行压缩和打包,本文讲述使用pg_basebackup进行PG的备份和恢复。

备份前提

wal_level = replica  # 或 logical
max_wal_senders >= 1

需使用replication用户或super user进行备份,并且建议pg_basebackup的版本与PG集群版本一致。

备份语句

https://www.postgresql.org/docs/current/continuous-archiving.html#BACKUP-BASE-BACKUP

pg_basebackup -D /path/to/backup/dir -Fp -Xs -P -v
  • -D /path/to/backup/dir:指定本地备份目标目录(必须为空或不存在)。
  • -Fp:使用 plain 格式(即直接复制数据文件,而不是 tar 格式, tar格式可以通过指定-Ft实现)。
  • -Xs:使用 流式传输 WAL-X stream 的简写),确保备份一致性,并自动包含所需 WAL。
  • -P:显示进度。
  • -v:verbose 模式,输出详细信息。

压缩备份

在 PostgreSQL 15 之前,pg_basebackup 不支持内置压缩,必须通过管道(如 | gzip)或先备份再手动压缩。

pg_basebackup -Ft -Xs -P -v -D - | gzip > backup.tar.gz
// 此处 -D - 表示输出到stdout之后通过管道压缩,如果指定了具体目录那么只能分开处理,先备份再压缩:
# 1. 备份到目录
pg_basebackup -Ft -Xs -P -v -D /tmp/pg_backup
# 2. 打包压缩整个目录
tar -czf /path/to/backup.tar.gz -C /tmp pg_backup
# 3. 清理(可选)
rm -rf /tmp/pg_backup

在 PostgreSQL 15 之后,可以指定--compress gzip选项实现直接压缩。

PGPASSWORD=your_password pg_basebackup -Ft -Xs -P -v -D /path/to/backup/dir -z
// pg的密码只支持交互式输入,因此脚本中必须使用~/.pgpass文件指定或者使用环境变量

这样会生成3个文件:

# 备份清单:backup_manifest  
# 全备文件:base.tar.gz  
# wal备份: pg_wal.tar.gz

进行恢复

https://www.postgresql.org/docs/current/continuous-archiving.html#BACKUP-PITR-RECOVERY

1. 直接恢复全备并启动

mkdir -p ${PGDATA}/wal
tar -zxf base.tar.gz -C ${PGDATA}
tar -zxf pg_wal.tar.gz -C ${PGDATA}/wal
cp backup_manifest ${PGDATA}
chown -R postgres.postgres ${PGDATA}

启动前可以额外先进行下文件校验(PG18+可以直接对包含.tar.gz文件的backup_manifest所在目录直接校验,无需先解压啦):

pg_verifybackup ${PGDATA}

2. PITR恢复

PITR恢复假设你的全备已经落后于当前WAL一段时间了,需要使用归档进行恢复,以便尽可能少的丢失增量数据。

mkdir -p ${PGDATA}/wal
tar -zxf base.tar.gz -C ${PGDATA}
tar -zxf pg_wal.tar.gz -C ${PGDATA}/wal
cp backup_manifest ${PGDATA}
chown -R postgres.postgres ${PGDATA}

然后创建recovery.signal文件PG12+,并指定restore_command以便恢复过程中可以获取归档:

su - postgres -c "touch ${PGDATA}/recovery.signal"
# vi postgresql.conf
restore_command = 'cp /mnt/archive/%f %p'
# 设置recovery_target_time可以做精确到时间点的PITR恢复
recovery_target_time = '2025-12-29 10:30:00'

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询