核心工具:pg_dump(导出SQL脚本)、pg_dumpall(导出所有数据库及角色)。
常用命令:
pg_dump -U postgres -h localhost -p 5432 -F c -b -v -f /path/to/backup/mydb.dump mydb
pg_dumpall -U postgres -f /path/to/backup/all_databases.sql
pg_dump -U postgres mydb | gzip > /path/to/backup/mydb.sql.gz
特点:逻辑备份为文本或自定义格式,可跨PostgreSQL版本、跨操作系统恢复;但恢复速度较慢,不适合大型数据库。
核心工具:pg_basebackup(复制整个数据库集群文件)。
常用命令:
pg_basebackup -U postgres -h localhost -p 5432 -D /path/to/backup/full -F t -z -P
特点:物理备份是数据库文件的完整副本,恢复速度快;需配合WAL归档实现时间点恢复(PITR),适合大型数据库或需要快速恢复的场景。
原理:基于全量备份生成增量备份,仅备份自上次备份以来的WAL日志变化。
前提条件:开启WAL摘要进程(summarize_wal = on)。
常用命令:
pg_basebackup -U postgres -D /path/to/backup/full -F t -z -P
pg_basebackup -D /path/to/backup/incr1 --incremental /path/to/backup/full/backup_manifest -c fast -p 5432 -U postgres
特点:显著减少备份时间和存储空间,适合频繁备份的大型数据库。
作用:记录所有数据变更,支持恢复到任意时间点(如误删数据、故障前状态)。
配置步骤:
postgresql.conf:wal_level = replica       # 提高WAL日志级别
archive_mode = on         # 开启归档模式
archive_command = 'cp %p /path/to/wal_archive/%f'  # 归档命令(将WAL文件复制到指定目录)
sudo systemctl restart postgresql
注意:WAL归档需与物理备份结合使用,否则无法实现PITR。
工具:cron(Linux系统定时任务)。
配置示例:每天凌晨2点执行全量逻辑备份(压缩后保存到/backups目录):
crontab -e
添加以下内容:
0 2 * * * /usr/bin/pg_dump -U postgres -h localhost -p 5432 -F c -b -v -f /backups/pg_backup_$(date +\%Y\%m\%d).dump mydb
注意:测试定时任务是否正常执行,定期清理过期备份(如保留最近7天的备份)。
适用场景:恢复单个数据库、跨版本迁移或逻辑备份文件损坏较轻的情况。
常用命令:
*.sql):psql -U postgres -d target_db -f /path/to/backup/mydb.sql
*.dump/*.backup):pg_restore -U postgres -d target_db -v /path/to/backup/mydb.dump
.gz格式):gunzip < /path/to/backup/mydb.sql.gz | psql -U postgres -d target_db
注意:恢复前需确保目标数据库存在(若不存在,先用createdb创建)。
适用场景:数据库崩溃、磁盘损坏或需要完整恢复到某个全量备份点。
步骤:
sudo systemctl stop postgresql
/var/lib/postgresql/<version>/main):rm -rf /var/lib/postgresql/<version>/main/*
cp -r /path/to/backup/full/* /var/lib/postgresql/<version>/main/
sudo systemctl start postgresql
注意:若使用增量备份,需先恢复全量备份,再按顺序恢复增量备份(如incr1→incr2)。
适用场景:恢复到某个特定时间点(如误删表、数据错误提交)。
前提条件:已开启WAL归档并配置archive_command。
步骤:
/path/to/backup/full)。rm -rf /var/lib/postgresql/<version>/main/*
cp -r /path/to/backup/full/* /var/lib/postgresql/<version>/main/
postgresql.auto.conf(用于覆盖默认配置):echo "restore_command = 'cp /path/to/wal_archive/%f %p'" >> /var/lib/postgresql/<version>/main/postgresql.auto.conf
echo "recovery_target_time = '2025-10-01 14:30:00'" >> /var/lib/postgresql/<version>/main/postgresql.auto.conf  # 设置恢复时间点
echo "recovery_target_timeline = 'latest'" >> /var/lib/postgresql/<version>/main/postgresql.auto.conf
sudo systemctl start postgresql
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"  # 返回true表示正在恢复
关键步骤:
sudo systemctl start postgresql
sudo -u postgres psql -c "\l"  # 列出所有数据库
sudo -u postgres psql -d target_db -c "\dt"  # 列出目标数据库的所有表
sudo -u postgres psql -d target_db -c "SELECT COUNT(*) FROM critical_table;"
注意:定期测试备份文件的恢复流程,确保在真实故障时能快速恢复。
postgres用户所有(chown -R postgres:postgres /path/to/backup),防止未授权访问。cron日志),设置报警机制(如邮件通知),及时发现备份失败问题。