Skip to content

PostgreSQL pg_basebackup使用与最佳实践

pg_basebackup 配置

主库配置

sql
-- 启用流复制
ALTER SYSTEM SET wal_level = 'replica';
ALTER SYSTEM SET max_wal_senders = '10';
ALTER SYSTEM SET wal_keep_size = '1GB';
ALTER SYSTEM SET hot_standby = 'on';

-- 创建复制用户
CREATE ROLE replication_user WITH REPLICATION LOGIN PASSWORD 'strong_password';

-- 配置 pg_hba.conf
host replication replication_user 0.0.0.0/0 md5

-- 重新加载配置
SELECT pg_reload_conf();

从库配置

sql
-- 配置从库参数
ALTER SYSTEM SET hot_standby = 'on';
ALTER SYSTEM SET max_standby_streaming_delay = '30s';
ALTER SYSTEM SET wal_receiver_status_interval = '10s';
ALTER SYSTEM SET hot_standby_feedback = 'on';

-- 重新加载配置
SELECT pg_reload_conf();

pg_basebackup 使用方法

基本用法

bash
# 执行全量备份
pg_basebackup -h localhost -U replication_user -D /backup/postgresql/full -F p -X stream -R -P

# 参数说明:
# -h:主库主机地址
# -U:复制用户名
# -D:备份目录
# -F p:使用纯文本格式
# -X stream:流式传输 WAL 文件
# -R:自动生成恢复配置
# -P:显示备份进度

压缩备份

bash
# 使用 gzip 压缩
pg_basebackup -h localhost -U replication_user -D /backup/postgresql/full -F p -X stream -R -P -z

# 使用自定义压缩级别
pg_basebackup -h localhost -U replication_user -D /backup/postgresql/full -F p -X stream -R -P -Z 9

# 备份为 tar 格式并压缩
gpg_basebackup -h localhost -U replication_user -F t -X stream -R -P -z -D - > /backup/postgresql/full_backup.tar.gz

并行备份

bash
# 使用 4 个并行进程
pg_basebackup -h localhost -U replication_user -D /backup/postgresql/full -F p -X stream -R -P -j 4

# 并行备份并压缩
pg_basebackup -h localhost -U replication_user -D /backup/postgresql/full -F p -X stream -R -P -j 4 -Z 5

增量备份准备

bash
# 创建基础备份
pg_basebackup -h localhost -U replication_user -D /backup/postgresql/base -F p -X stream -R -P

# 记录备份的 WAL 位置
cat /backup/postgresql/base/backup_label

pg_basebackup 恢复方法

从全量备份恢复

bash
# 停止 PostgreSQL
systemctl stop postgresql-15

# 清理数据目录
rm -rf /var/lib/postgresql/15/main/*

# 从备份恢复
rsync -avz /backup/postgresql/full/ /var/lib/postgresql/15/main/

# 启动 PostgreSQL
systemctl start postgresql-15

从 tar 备份恢复

bash
# 停止 PostgreSQL
systemctl stop postgresql-15

# 清理数据目录
rm -rf /var/lib/postgresql/15/main/*

# 解压备份
mkdir -p /tmp/backup
tar -xf /backup/postgresql/full_backup.tar -C /tmp/backup
rsync -avz /tmp/backup/ /var/lib/postgresql/15/main/

# 启动 PostgreSQL
systemctl start postgresql-15

基于时间点的恢复

bash
# 配置 recovery.conf
cat > /var/lib/postgresql/15/main/recovery.conf <<EOF
restore_command = 'cp /backup/postgresql/wal/%f %p'
recovery_target_time = '2024-01-24 12:00:00'
recovery_target_inclusive = true
EOF

# 启动 PostgreSQL
systemctl start postgresql-15

pg_basebackup 性能优化

备份性能优化

  • 使用并行备份:根据 CPU 核心数调整 -j 参数
  • 使用压缩:减少备份大小和传输时间
  • 在低峰期执行备份:减少对生产环境的影响
  • 使用本地备份:避免网络延迟

恢复性能优化

  • 使用快速文件系统:如 ext4、XFS 或 ZFS
  • 调整 shared_buffers:根据内存大小调整
  • 使用并行恢复:PostgreSQL 14+ 支持并行恢复
  • 预加载数据:使用 pg_prewarm 扩展预加载数据到内存

pg_basebackup 最佳实践

生产环境建议

  1. 定期执行备份:根据数据重要性设置备份频率
  2. 验证备份完整性:使用 pg_verifybackup 验证备份
  3. 测试恢复流程:确保备份可以正常恢复
  4. 监控备份进度:使用 -P 参数或监控工具
  5. 文档化备份策略:记录备份频率、保留周期和恢复流程

备份保留策略

bash
# 保留最近 7 天的备份
find /backup/postgresql -name "full-*" -mtime +7 -delete

# 保留最近 3 个完整备份
ls -t /backup/postgresql/full-* | tail -n +4 | xargs rm -rf

安全最佳实践

  • 使用强密码:为复制用户设置强密码
  • 限制访问:在 pg_hba.conf 中限制复制用户的访问 IP
  • 加密传输:使用 SSL/TLS 加密备份传输
  • 加密存储:对备份数据进行加密存储
  • 访问控制:限制备份目录的访问权限

常见问题(FAQ)

Q:pg_basebackup 支持增量备份吗?

A:pg_basebackup 本身不直接支持增量备份,但可以结合 WAL 备份实现增量恢复。可以使用以下方法:

  1. 定期执行全量备份
  2. 持续备份 WAL 文件
  3. 恢复时先恢复全量备份,再应用 WAL 文件

Q:如何监控 pg_basebackup 的备份进度?

A:可以使用以下方法监控备份进度:

  • 使用 -P 参数显示进度
  • 监控备份目录大小变化
  • 使用 pg_stat_replication 视图监控 WAL 传输情况
  • 使用第三方工具如 pgBackRest 或 Barman

Q:pg_basebackup 备份会影响主库性能吗?

A:pg_basebackup 会对主库产生一定影响,但可以通过以下方法减少影响:

  • 在低峰期执行备份
  • 使用并行备份减少备份时间
  • 使用压缩减少 I/O 负载
  • 配置合适的 max_wal_senders 参数

Q:如何处理 pg_basebackup 备份失败的情况?

A:处理备份失败的方法:

  1. 检查错误日志,找出失败原因
  2. 检查主库和备份服务器的网络连接
  3. 检查复制用户权限
  4. 检查备份目录权限和磁盘空间
  5. 尝试使用不同的备份参数

Q:pg_basebackup 与 pg_dump 有什么区别?

A:主要区别:

  • pg_basebackup:物理备份,备份整个数据库集群,支持增量恢复
  • pg_dump:逻辑备份,备份单个数据库,不支持增量恢复
  • pg_basebackup:恢复速度快,适合大规模数据库
  • pg_dump:备份灵活,适合小规模数据库和数据迁移

Q:如何使用 pg_basebackup 构建从库?

A:使用 pg_basebackup 构建从库的步骤:

  1. 配置主库的流复制参数
  2. 创建复制用户
  3. 配置 pg_hba.conf
  4. 使用 pg_basebackup 备份主库
  5. 配置从库参数
  6. 启动从库
  7. 验证复制状态

Q:如何优化 pg_basebackup 的备份速度?

A:优化备份速度的方法:

  • 使用并行备份(-j 参数)
  • 使用快速存储设备
  • 减少备份数据量(如清理无用数据)
  • 优化网络连接
  • 使用本地备份

Q:如何验证 pg_basebackup 备份的完整性?

A:验证备份完整性的方法:

  • 使用 pg_verifybackup 工具
  • 测试恢复流程
  • 比较备份前后的数据库大小
  • 检查备份目录结构完整性