本文主要记录 PostgreSQL 常用备份与恢复命令:pg_dump、pg_dumpall、pg_restore 与 psql 的基本用法、格式选择以及验证思路。环境参数请替换为实际主机与账号。
背景说明
日常运维里最常用的是逻辑备份:
- 单库:
pg_dump - 全实例(含角色等全局对象):
pg_dumpall - 自定义格式恢复:
pg_restore
物理备份(pg_basebackup、连续归档)不在本文展开。
环境与前置
| 项目 | 说明 |
|---|---|
| 客户端工具 | 与服务器主版本尽量接近的 pg_dump / pg_restore |
| 权限 | 备份目标库的读权限;全量/pg_dumpall 通常需要更高权限 |
| 连通 | 主机、端口、pg_hba 与密码(或 .pgpass) |
备份单个数据库
SQL 明文(可管道压缩)
pg_dump -U <username> -h <host> -p <port> -d <database_name> > backup.sql
pg_dump -U <username> -h <host> -p <port> -d <database_name> | gzip > backup.sql.gz
自定义格式(推荐生产常用)
pg_dump -U <username> -h <host> -p <port> -Fc -d <database_name> -f backup.dump
| 参数 | 含义 |
|---|---|
-U | 用户 |
-h / -p | 主机 / 端口 |
-d | 数据库名 |
-Fc | 自定义压缩格式,便于并行恢复与选择性恢复 |
恢复单个数据库
从 SQL
# 目标库需已存在(或先 CREATE DATABASE)
psql -U <username> -h <host> -p <port> -d <target_database> < backup.sql
gunzip -c backup.sql.gz | psql -U <username> -h <host> -p <port> -d <target_database>
从自定义格式
# 恢复到已有库
pg_restore -U <username> -h <host> -p <port> -d <target_database> backup.dump
# 仅结构 / 并行加速(示例)
pg_restore --schema-only -d <target_database> backup.dump
pg_restore -j 4 -d <target_database> backup.dump
需要「备份里带建库」时,可查阅当前版本 pg_restore -C 行为,并在维护窗口验证。
备份整个实例
pg_dumpall -U <username> -h <host> -p <port> | gzip > full_backup.sql.gz
恢复时通常对空实例用 psql 导入(先确认不会覆盖生产)。超级用户权限与全局对象(角色、表空间)需单独评估。
测试验证
- 在非生产实例恢复一份备份。
- 检查:
psql -U <username> -h <host> -d <target_database> -c "\dt"
psql -U <username> -h <host> -d <target_database> -c "SELECT count(*) FROM <关键表>;"
- 应用连库冒烟(登录、核心查询)。
- 记录备份文件大小、耗时与版本号。
注意事项
- 大库优先
-Fc+ 定期恢复演练,而不是只备份不练恢复。 - 版本跨大版本恢复可能有兼容问题,升级路径单独设计。
- 备份文件含全量数据,权限与传输需按敏感数据保护。
- 主机与账号一律用占位符;勿把真实密码写进文档。
参考
- PostgreSQL 官方文档:
pg_dump/pg_dumpall/pg_restore - 可与站内/草稿
pgsql-hot-standby、pgsql-daily-ops对照使用