前置说明
- 恢复前建议:① 确认目标数据库/表不存在(或已备份);② 确保 PostgreSQL 服务正常运行;③ 恢复用户有足够权限(推荐用
postgres超级用户); - 替换命令中的
<>部分为你的实际环境信息; - 若本地连接,可省略
-h 127.0.0.1。
一、全库备份的恢复(对应 pg_dumpall 备份)
pg_dumpall 备份的是纯文本SQL文件,恢复需用 psql 命令(而非 pg_restore)。
1. 基础恢复命令
# 全库恢复(覆盖所有数据库、用户、权限)
psql -U <超级用户名> -h <数据库IP> -p <端口> -f <全库备份文件>.sql -v
2. 示例(对应上一轮全库备份示例)
# 恢复 full_backup_20260318.sql 到本地 PostgreSQL 实例
psql -U postgres -h 127.0.0.1 -p 5432 -f /backup/full_backup_20260318.sql -v
关键注意事项
- ❗ 全库恢复会覆盖实例中所有数据库、用户、角色,务必确认目标环境是测试环境/空实例;
- 若需跳过报错继续恢复(如重复创建用户),加
-v ON_ERROR_CONTINUE=on:psql -U postgres -h 127.0.0.1 -p 5432 -v ON_ERROR_CONTINUE=on -f /backup/full_backup_20260318.sql - 恢复时若提示“数据库已存在”:可先删除目标数据库(谨慎!),或用
--clean参数(备份时加的话,恢复会自动删除旧库)。
二、单库备份的恢复(对应 pg_dump 单库备份)
单库备份分两种格式,恢复命令不同:
场景1:备份为「自定义压缩格式(.dump)」(推荐)
用 pg_restore 命令(PostgreSQL 专用,支持灵活恢复):
# 1. 先创建空的目标数据库(若备份中不含 CREATE DATABASE 语句)
createdb -U <用户名> -h <数据库IP> -p <端口> <目标数据库名># 2. 恢复自定义格式备份到目标数据库
pg_restore -U <用户名> -h <数据库IP> -p <端口> -d <目标数据库名> -v <单库备份文件>.dump
示例(对应上一轮单库自定义格式备份)
# 步骤1:创建空数据库 mydb(若已存在,先删除:dropdb -U postgres mydb)
createdb -U postgres -h 127.0.0.1 -p 5432 mydb# 步骤2:恢复备份到 mydb
pg_restore -U postgres -h 127.0.0.1 -p 5432 -d mydb -v /backup/mydb_backup_20260318.dump
场景2:备份为「纯文本SQL格式(.sql)」
用 psql 命令(和全库恢复逻辑一致):
# 恢复纯文本单库备份到目标数据库
psql -U <用户名> -h <数据库IP> -p <端口> -d <目标数据库名> -f <单库备份文件>.sql -v
示例(对应上一轮单库纯文本备份)
# 恢复 mydb_backup_20260318.sql 到 mydb 数据库
psql -U postgres -h 127.0.0.1 -p 5432 -d mydb -f /backup/mydb_backup_20260318.sql -v
单库恢复关键参数(可选)
- 若备份时加了
-c(恢复前删除旧对象),恢复时会自动删除目标库中同名表/索引; - 并行恢复(提速):加
-j 4(仅兼容自定义格式):pg_restore -U postgres -h 127.0.0.1 -p 5432 -d mydb -j 4 -v /backup/mydb_backup.dump - 仅恢复结构/数据:加
-s(仅结构)/-a(仅数据):# 仅恢复表结构 pg_restore -U postgres -d mydb -s -v /backup/mydb_backup.dump
三、单表备份的恢复(对应 pg_dump 单表备份)
单表恢复同样分格式,核心是指定表名(避免恢复多余数据):
场景1:备份为「自定义压缩格式(.dump)」
# 恢复单表到目标数据库(需确保目标数据库已存在)
pg_restore -U <用户名> -h <数据库IP> -p <端口> -d <目标数据库名> -t <模式.表名> -v <单表备份文件>.dump
示例(对应上一轮单表自定义格式备份)
# 恢复 users 表到 mydb 数据库(public 为默认模式)
pg_restore -U postgres -h 127.0.0.1 -p 5432 -d mydb -t public.users -v /backup/mydb_users_backup.dump
场景2:备份为「纯文本SQL格式(.sql)」
# 恢复单表SQL备份到目标数据库
psql -U <用户名> -h <数据库IP> -p <端口> -d <目标数据库名> -f <单表备份文件>.sql -v
示例(对应上一轮单表纯文本数据备份)
# 恢复 orders 表的数据到 mydb 数据库
psql -U postgres -h 127.0.0.1 -p 5432 -d mydb -f /backup/mydb_orders_data.sql -v
单表恢复关键注意事项
- 若恢复时提示“表已存在”:
- 先删除旧表(谨慎!):
psql -U postgres -d mydb -c "DROP TABLE public.users;"; - 或备份时加
-c,恢复时自动删除旧表;
- 先删除旧表(谨慎!):
- 若仅恢复表数据(不含结构):确保目标表结构已存在,且字段/类型完全一致;
- 表名含特殊字符/大写:
-t参数需用双引号包裹(转义),如-t "\"UserInfo\""。
补充:不同格式恢复命令对比
| 备份格式 | 备份命令 | 恢复命令 | 核心特点 |
|---|---|---|---|
| 纯文本SQL | pg_dump -F p / pg_dumpall | psql -f 备份文件.sql | 通用、可编辑,恢复速度较慢 |
| 自定义压缩格式 | pg_dump -F c | pg_restore -d 库名 备份文件.dump | 压缩率高、恢复快、支持并行/精准恢复 |
| 目录格式 | pg_dump -F d | pg_restore -d 库名 备份目录 | 支持并行备份/恢复,适合大库 |
总结
- 全库恢复:用
psql -f 备份文件.sql,需超级用户,谨慎覆盖现有数据; - 单库恢复:自定义格式用
pg_restore -d 库名 备份文件.dump(推荐),纯文本用psql -d 库名 -f 备份文件.sql; - 单表恢复:自定义格式加
-t 模式.表名精准恢复,纯文本直接用 psql 执行SQL文件。
恢复后建议验证:① 查看数据库/表是否存在;② 抽查数据条数(如 SELECT COUNT(*) FROM users;),确保恢复完整。
