当你作为一个负责任的数据库管理员,已经做好了备份,接下来就是关键时刻:数据恢复。这时候主角登场了——pg_restore命令。如果pg_dump是你备份的超级英雄,那pg_restore就是它的搭档,能把备份的数据“复活”回来。
pg_restore用来从用pg_dump生成的二进制格式(custom或者directory)文件里恢复数据。如果你的数据库因为某些原因坏掉了,或者你想把数据迁移到新服务器,这个工具绝对是你的好帮手。
你为什么需要pg_restore:
- 它可以恢复整个数据库,也可以只恢复部分内容(schema、表、数据)。
- 这是一个强大的工具,适合需要精细控制恢复过程的复杂场景。
命令的基本语法
用pg_restore,先从最基础的命令语法开始:
pg_restore -U username -d database_name backup_file.dump
命令参数:
-U username:指定连接PostgreSQL的用户名。-d database_name:要恢复数据的数据库名。backup_file.dump:之前用pg_dump以custom或directory格式生成的备份文件。
比如你想用postgres用户,把backup.dump文件恢复到university数据库,命令是:
pg_restore -U postgres -d university backup.dump
运行这个命令后,pg_restore就会开始恢复,把数据还原到数据库里!
备份类型和兼容性
并不是所有备份都一样。你可能还记得,用pg_dump备份时可以选不同的格式。有些格式能用pg_restore恢复,有些则不行。
| 备份格式 | 描述 | pg_restore支持 |
|---|---|---|
plain(文本) |
包含恢复命令的SQL脚本。 | ❌ 不支持 |
custom |
PostgreSQL专有格式的压缩备份。 | ✅ 支持 |
directory |
以目录形式保存的多文件备份。 | ✅ 支持 |
tar |
TAR格式的归档。 | ✅ 支持 |
注意,对于文本备份(plain),你不能用pg_restore。这种文件要用psql手动恢复。例如:
psql -U username -d database_name -f backup.sql
pg_restore的灵活性:恢复参数
pg_restore这么受欢迎,主要是因为它很灵活。你可以用它恢复整个数据库,也可以只恢复一部分。
只恢复数据结构。 如果你只想恢复数据库结构(表结构、索引、触发器等),用--schema-only参数:
pg_restore -U postgres -d university --schema-only backup.dump
这个很适合你想分析数据库结构,或者想建一个“空壳”副本的时候。
只恢复数据。 如果你只关心数据(不需要结构),用--data-only参数:
pg_restore -U postgres -d university --data-only backup.dump
这种方式适合结构已经有了,只想恢复表内容的情况。
恢复前先清理。 有时候表或schema已经存在。想在恢复前先删掉它们,用--clean参数:
pg_restore -U postgres -d university --clean backup.dump
加了这个参数,pg_restore会先删掉已有对象,再从备份恢复数据。
对象过滤。 pg_restore允许你选择只恢复备份里的某些对象。用--table参数:
pg_restore -U postgres -d university --table=students backup.dump
这个例子只会恢复students表。
把SQL输出到控制台
如果你想看看恢复时会执行什么,但又不想马上改数据库,可以用--list参数:
pg_restore -l backup.dump
想看详细的SQL命令,加上--verbose:
pg_restore -U postgres --verbose --schema-only backup.dump
恢复示例
- 完整恢复数据库。
最常见的场景:你想把整个数据库从备份恢复回来:
pg_restore -U postgres -d university backup.dump
- 恢复指定表。
比如你只丢了courses表的数据,可以单独恢复它:
pg_restore -U postgres -d university --table=courses backup.dump
- 恢复数据库结构。
只恢复表结构(不带数据):
pg_restore -U postgres -d university --schema-only backup.dump
- 带清理的恢复。
如果你需要覆盖已有数据:
pg_restore -U postgres -d university --clean backup.dump
恢复时的常见错误和预防方法
版本不兼容。 如果你用一个版本的PostgreSQL做备份,想在另一个(尤其是更老的)版本恢复,可能会遇到兼容性错误。解决办法:尽量用同样版本的PostgreSQL做备份和恢复。
“Role does not exist”错误。 如果备份里有的角色(用户)在恢复服务器上没有,就会报这个错。解决办法:提前在新服务器上建好需要的角色。
“Table already exists”错误。 如果你恢复的表已经存在,就会报这个错。用
--clean参数可以避免冲突。
GO TO FULL VERSION