PostgreSQL的备份与恢复
一、备份工具概览
PostgreSQL 提供两套核心逻辑备份命令行工具:
- pg_dump:备份单个指定数据库,支持精确到表、Schema 粒度备份;
- pg_dumpall :一次性备份实例内所有 数据库,同时导出角色、表空间等系统全局数据。
二、密码处理方案
pg_dump、pg_dumpall 都不支持在命令行直接携带登录密码,自动化定时备份推荐两种免密方案:
- 在postgres操作系统用户家目录创建 .pgpass 密码文件存储账号密码;
- 通过环境变量PGPASSWORD 临时配置密码。
三、日常备份工具选型建议
每日定时备份优先选用 pg_dump,不推荐每日执行 pg_dumpall:
- pg_dump 支持精细化筛选:指定数据库、指定Schema、指定表;
- pg_dumpall 无细粒度筛选能力,仅能全实例导出。
四、pg_dump 四种备份格式
| 格式类型 | 参数标识 | 功能说明 |
|---|---|---|
| SQL文本格式 | -F p | 纯可读SQL,可导入低版本PostgreSQL、其他兼容SQL数据库 |
| 自定义压缩格式 | -F c | 压缩率高,支持并行恢复(PostgreSQL 8.4及以上) |
| TAR包格式 | -F t | 标准tar归档文件,支持并行恢复(PostgreSQL 8.4及以上) |
| 目录格式 | -F d | 拆分多文件存储,解决单文件超出操作系统大小限制问题,支持并行备份/恢复 |
补充:自定义压缩 、TAR格式备份文件,恢复时均可开启并行恢复提升速度。
五、pg_dumpall 使用限制
- 仅支持导出纯SQL文本,不支持压缩包、目录等其他格式;
- 可同步导出全库表结构、业务数据、角色、表空间等全局对象;
- 完整全实例SQL备份体积大,恢复耗时严重,不适合每日执行。
六、pg_dump 实操命令示例
统一连接参数:本地地址127.0.0.1,端口5432,登录用户postgres
- 单库自定义压缩备份
pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -f test.backup test
2. 导出SQL文本并自带建库语句
pg_dump -h 127.0.0.1 -p 5432 -U postgres -C -F p -b -v -f test.sql test
3. 仅备份名称以pay开头的全部表
pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -t '*.pay*' -f pay.backup test
4. 备份hr、payroll两个Schema
pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -n hr -n payroll -f hr.backup mydb
5. 排除public Schema,备份其余所有数据
pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -N public -f all_sch_except_pub.backup mydb
6. 生成带字段名标准INSERT语句(跨库/低版本迁移专用)
pg_dump -h 127.0.0.1 -p 5432 -U postgres -F p --column-inserts -f select_tables.backup mydb
7. 基础目录格式备份
pg_dump -h 127.0.0.1 -p 5432 -U postgres -F d -f /somepath/a_directory mydb
8. 多线程并行目录备份(-j 指定并发数)
pg_dump -h 127.0.0.1 -p 5432 -U postgres -j 3 -Fd -f /somepath/a_directory mydb
七、pg_dumpall 全局对象备份命令
使用规范
- 每日执行:仅备份角色、表空间等全局配置;
- 每月执行:完整全实例备份(仅SQL格式,恢复效率低,不建议高频)。
- 备份角色+表空间全部全局对象
pg_dumpall -h localhost -U postgres --port=5432 -f myglobals.sql --globals-only
2. 仅备份账号角色,不包含表空间
pg_dumpall -h localhost -U postgres --port=5432 -f myglobals.sql --roles-only
八、恢复工具对应关系
| 备份文件类型 | 配套恢复工具 |
|---|---|
| pg_dump / pg_dumpall 导出的.sql文本 | psql |
| pg_dump导出c压缩/tar/目录格式备份 | pg_restore |
九、psql 恢复SQL文本备份操作
1. 导入SQL,忽略执行过程报错
psql -U postgres -f myglobals.sql
2. 导入SQL,出现错误立即终止恢复(生产环境推荐)
psql -U postgres --set ON_ERROR_STOP=on -f myglobals.sql
- 指定目标数据库导入SQL文件
psql -U postgres -d mydb -f select_objects.sql
十、pg_restore 恢复二进制备份文件
1. 手动创建数据库后并行恢复
create database mydb;
pg_restore --dbname=mydb --jobs=4 --verbose mydb.backup
2. 自动创建目标数据库(无需提前建库)
pg_restore --dbname=postgres --create --jobs=4 --verbose mydb.backup
3. 仅恢复表结构、索引、约束,不导入业务数据
create database mydb2;
pg_restore --dbname=mydb2 --section=pre-data --jobs=4 mydb.backup
附录:pg_dump 核心参数速查表
| 参数 | 参数含义 |
|---|---|
| -h | 指定数据库服务主机地址 |
| -p | 指定数据库端口 |
| -U | 指定数据库登录用户 |
| -F | 设置备份输出格式:c自定义压缩/tTAR/p纯SQL/d目录 |
| -b | 备份包含大对象Blob数据 |
| -v | 开启详细日志输出 |
| -f | 指定备份文件/目录输出路径 |
| -C | SQL备份中生成CREATE DATABASE建库语句 |
| -t | 仅备份匹配名称的表,支持通配符 |
| -n | 仅备份指定Schema,可多次使用 |
| -N | 排除指定Schema,可多次使用 |
| --column-inserts | 生成带字段列表的标准INSERT语句 |
| -j | 设置并行备份/恢复线程数 |