PostgreSQL 数据库备份与恢复指南
在数据库管理中,备份和恢复是至关重要的操作,它们能确保数据的安全性和可恢复性。下面将为你详细介绍 PostgreSQL 数据库的备份和恢复操作。环境准备在进行备份和恢复操作之前,需要确保已经进入 PostgreSQL 的可执行文件目录。
PostgreSQL数据库备份与恢复全解析
一、备份与恢复的核心意义
数据库备份与恢复是保障数据安全的核心机制,尤其对于关键业务系统,需确保:
- 数据安全性:防止硬件故障、人为误操作或恶意攻击导致的数据丢失。
- 业务连续性:通过快速恢复减少停机时间。
- 合规要求:满足数据留存与审计规范。
二、PostgreSQL备份类型与适用场景
1. 逻辑备份(Logical Backup)
- 定义:导出数据库对象(表、视图、函数)的结构与数据为SQL脚本或归档文件。
- 工具:
pg_dump:备份单个数据库。pg_dumpall:备份所有数据库及全局对象(如角色、表空间)。
- 适用场景:
- 小型数据库(< 100GB)。
- 跨版本迁移或异构数据库同步。
2. 物理备份(Physical Backup)
- 定义:直接复制数据库集群的物理文件(数据目录、WAL日志)。
- 工具:
- 文件系统工具(
rsync、tar)。 - 持续归档(WAL Archiving)。
- 文件系统工具(
- 适用场景:
- 大型数据库(TB级)。
- 支持时间点恢复(Point-in-Time Recovery, PITR)。
三、逻辑备份操作详解
1. 使用pg_dump备份单个数据库
-
基本命令:
pg_dump -U postgres -d mydb -F c -f /backup/mydb.dump-F c:指定自定义压缩格式(支持并行恢复)。-f:输出文件路径。
-
常用选项:
-j N:启用多线程(需-F d目录格式)。--exclude-table-data:排除指定表数据(仅备份结构)。
2. 使用pg_dumpall备份全实例
- 命令示例:
pg_dumpall -U postgres -f /backup/full.sql - 注意事项:
- 备份包含所有数据库及全局对象(角色、表空间)。
- 恢复时需先创建全局对象,再恢复单个数据库。
3. 逻辑备份恢复
- 从SQL文件恢复:
psql -U postgres -f /backup/full.sql - 从自定义格式恢复:
pg_restore -U postgres -d mydb /backup/mydb.dump - 恢复特定对象:
pg_restore -U postgres -t my_table -d mydb /backup/mydb.dump
四、物理备份与持续归档
1. 基础物理备份步骤
- 启用归档模式:
# 修改postgresql.conf wal_level = replica archive_mode = on archive_command = 'test ! -f /archive/%f && cp %p /archive/%f' - 重启PostgreSQL:
systemctl restart postgresql - 创建基础备份:
pg_basebackup -U postgres -D /backup/base -Ft -z -Xs -P-Ft:生成tar格式。-Xs:流式传输WAL日志。
2. 持续归档与时间点恢复(PITR)
- 归档目录结构:
/archive/ |- 0000000100000001000000A1 |- 0000000100000001000000A2 |- ... - 恢复步骤:
- 停止PostgreSQL服务。
- 清空数据目录:
rm -rf /var/lib/pgsql/data/*。 - 解压基础备份到数据目录。
- 创建恢复配置文件
recovery.conf(PostgreSQL 12+为postgresql.auto.conf):restore_command = 'cp /archive/%f %p' recovery_target_time = '2024-01-01 12:00:00' - 启动服务,自动应用WAL日志至目标时间点。
五、备份策略与优化
1. 备份策略设计
| 策略类型 | 频率 | 保留周期 | 适用场景 |
|---|---|---|---|
| 完整逻辑备份 | 每日一次 | 7天 | 中小型数据库 |
| 基础物理备份 + WAL | 每周一次基础备份 + 持续归档 | 30天 | 大型数据库+PITR需求 |
| 增量逻辑备份 | 每小时一次 | 24小时 | 频繁变更的OLTP系统 |
2. 性能优化技巧
- 并行备份:
pg_dump -j 4 -F d -f /backup/mydb_dir - 压缩与分片:
pg_dump -F c -Z 9 -f /backup/mydb.dump.gz # 最高压缩比 split -b 1G /backup/mydb.dump.gz mydb.part - 备份验证:
pg_restore -l /backup/mydb.dump > /dev/null
六、常见问题与解决方案
1. 备份失败:权限不足
- 现象:
pg_dump: error: could not open output file "/backup/mydb.dump": Permission denied - 解决:
chown postgres:postgres /backup chmod 700 /backup
2. 恢复时表空间路径不一致
- 现象:
ERROR: tablespace "ts1" does not exist - 解决:
pg_restore --tablespace-map=old_ts1=new_ts1 -d mydb /backup/mydb.dump
3. WAL归档空间不足
- 现象:
archive command failed with exit code 1 - 解决:
- 清理过期WAL文件:
pg_archivecleanup /archive 0000000100000001000000A1 - 扩展归档存储或启用压缩。
- 清理过期WAL文件:
七、自动化与监控
1. 使用pgBackRest
- 安装与配置:
# 安装 apt-get install pgbackrest # 配置/etc/pgbackrest.conf [global] repo1-path=/backup/pgbackrest repo1-retention-full=2 - 全量备份:
pgbackrest --stanza=mydb --type=full backup
2. 监控备份状态
- 查询最近备份:
SELECT * FROM pg_stat_backup; - 日志分析:
grep "backup completed" /var/log/postgresql/postgresql-14-main.log
八、总结
PostgreSQL备份与恢复需根据业务需求选择逻辑或物理方案:
- 逻辑备份:灵活轻量,适合小规模数据迁移。
- 物理备份+PITR:高性能,支持精确到秒的恢复。
- 混合策略:结合逻辑与物理备份,平衡效率与安全性。
最佳实践:
- 定期验证备份可恢复性。
- 监控归档空间与备份任务状态。
- 文档化恢复流程并定期演练。
附录:常用命令速查表
# 逻辑备份
pg_dump -U user -d dbname -Fc -f backup.dump
pg_restore -U user -d dbname backup.dump
# 物理备份
pg_basebackup -U user -D /backup/base -Ft -Xs
pg_archivecleanup /archive 0000000100000001000000A1
# 监控
SELECT * FROM pg_stat_archiver;
pgbackrest --stanza=mydb info
备份实操
环境准备
在进行备份和恢复操作之前,需要确保已经进入 PostgreSQL 的可执行文件目录。在 Linux 系统中,通常可以使用以下命令进入该目录:
cd /opt/pgsql/bin
备份操作
1. 备份单个数据库到 SQL 文件
这种备份方式会将指定数据库的结构和数据以 SQL 语句的形式保存到文件中。
pg_dump -U postgresghp2db > "/opt/pgsql/pgsql-backup20221121.sql"
U:指定连接数据库的用户名,这里是 postgresghp2db。
>:将备份结果重定向到指定的文件,这里是 /opt/pgsql/pgsql-backup20221121.sql。
如果你需要备份远程服务器上的数据库,可以使用 -h 指定服务器的 IP 地址,-p 指定端口号,-W 表示在连接时需要输入密码:
bash
pg_dump.exe -U postgres -h *.*.*.* -p 5432 -W -d taobao >"E:\pgsql-backup20221212.dmp"
-h:指定远程服务器的 IP 地址,这里是 *.*.*.*。
-p:指定数据库服务的端口号,这里是 5432。
-d:指定要备份的数据库名称,这里是 taobao。
另外,还可以使用 -f 参数来指定备份文件的路径:
pg_dump -h 127.0.0.1 -U postgres -p 5432 -W ghp2db -f /opt/pgsql/pgsql-backup20221121.sql
pg_dump -h *.*.*.* -U p2 -p 5432 -W p2db -f /opt/pgsql/pgsql-backup20221121.sql
2. 备份所有数据库到 DMP 文件
pg_dumpall 命令可以备份 PostgreSQL 实例中的所有数据库,包括全局对象(如角色、表空间等)。
pg_dumpall -U postgres --port=5432 > "/opt/pgsql/pgsql-backup20221121.dmp"
--port:指定数据库服务的端口号,这里是 5432。
3. 备份指定数据库到 BAK 文件
pg_dump -h *.*.*.* -p 5432 -U postgres -d atwebgismap > c:\atwebgismap.bak
此命令用于备份远程服务器上的 atwebgismap 数据库到本地的 c:\atwebgismap.bak 文件。
恢复操作
使用 psql 命令可以将备份文件恢复到指定的数据库中。
psql -h localhost -p 5432 -U postgres -d ghp2db2 < "E:\pgsql-backup20221121.sql"
psql -h localhost -U postgres -d test < D:\postgres.bak
-h:指定数据库服务器的地址,这里是 localhost。
-p:指定数据库服务的端口号,这里是 5432。
-U:指定连接数据库的用户名,这里是 postgres。
-d:指定要恢复到的目标数据库名称,分别是 ghp2db2 和 test。
<:从指定的文件中读取 SQL 语句并执行,以恢复数据库。
注意事项
权限问题:在进行备份和恢复操作时,确保使用的用户具有足够的权限。通常,postgres 用户具有最高权限,但在实际生产环境中,建议创建具有适当权限的专用用户。
文件路径:在指定备份文件和恢复文件的路径时,要注意不同操作系统的路径格式。例如,Windows 使用反斜杠 \,而 Linux 使用正斜杠 /。
数据库状态:在备份和恢复过程中,要确保数据库处于正常运行状态。如果数据库出现故障或异常,可能会导致备份或恢复失败。
通过以上的备份和恢复操作,你可以有效地保护 PostgreSQL 数据库的数据安全,并且在需要时能够快速恢复数据。希望这些内容对你有所帮助!
更多推荐




所有评论(0)