外观
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_labelpg_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-15pg_basebackup 性能优化
备份性能优化
- 使用并行备份:根据 CPU 核心数调整
-j参数 - 使用压缩:减少备份大小和传输时间
- 在低峰期执行备份:减少对生产环境的影响
- 使用本地备份:避免网络延迟
恢复性能优化
- 使用快速文件系统:如 ext4、XFS 或 ZFS
- 调整 shared_buffers:根据内存大小调整
- 使用并行恢复:PostgreSQL 14+ 支持并行恢复
- 预加载数据:使用
pg_prewarm扩展预加载数据到内存
pg_basebackup 最佳实践
生产环境建议
- 定期执行备份:根据数据重要性设置备份频率
- 验证备份完整性:使用
pg_verifybackup验证备份 - 测试恢复流程:确保备份可以正常恢复
- 监控备份进度:使用
-P参数或监控工具 - 文档化备份策略:记录备份频率、保留周期和恢复流程
备份保留策略
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 备份实现增量恢复。可以使用以下方法:
- 定期执行全量备份
- 持续备份 WAL 文件
- 恢复时先恢复全量备份,再应用 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:处理备份失败的方法:
- 检查错误日志,找出失败原因
- 检查主库和备份服务器的网络连接
- 检查复制用户权限
- 检查备份目录权限和磁盘空间
- 尝试使用不同的备份参数
Q:pg_basebackup 与 pg_dump 有什么区别?
A:主要区别:
- pg_basebackup:物理备份,备份整个数据库集群,支持增量恢复
- pg_dump:逻辑备份,备份单个数据库,不支持增量恢复
- pg_basebackup:恢复速度快,适合大规模数据库
- pg_dump:备份灵活,适合小规模数据库和数据迁移
Q:如何使用 pg_basebackup 构建从库?
A:使用 pg_basebackup 构建从库的步骤:
- 配置主库的流复制参数
- 创建复制用户
- 配置 pg_hba.conf
- 使用 pg_basebackup 备份主库
- 配置从库参数
- 启动从库
- 验证复制状态
Q:如何优化 pg_basebackup 的备份速度?
A:优化备份速度的方法:
- 使用并行备份(-j 参数)
- 使用快速存储设备
- 减少备份数据量(如清理无用数据)
- 优化网络连接
- 使用本地备份
Q:如何验证 pg_basebackup 备份的完整性?
A:验证备份完整性的方法:
- 使用
pg_verifybackup工具 - 测试恢复流程
- 比较备份前后的数据库大小
- 检查备份目录结构完整性
