CodeGym /课程 /SQL SELF /pg_restore恢复数据

pg_restore恢复数据

SQL SELF
第 43 级 , 课程 3
可用

当你作为一个负责任的数据库管理员,已经做好了备份,接下来就是关键时刻:数据恢复。这时候主角登场了——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_dumpcustomdirectory格式生成的备份文件。

比如你想用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

恢复示例

  1. 完整恢复数据库。

最常见的场景:你想把整个数据库从备份恢复回来:

pg_restore -U postgres -d university backup.dump
  1. 恢复指定表。

比如你只丢了courses表的数据,可以单独恢复它:

pg_restore -U postgres -d university --table=courses backup.dump
  1. 恢复数据库结构。

只恢复表结构(不带数据):

pg_restore -U postgres -d university --schema-only backup.dump
  1. 带清理的恢复。

如果你需要覆盖已有数据:

pg_restore -U postgres -d university --clean backup.dump

恢复时的常见错误和预防方法

  • 版本不兼容。 如果你用一个版本的PostgreSQL做备份,想在另一个(尤其是更老的)版本恢复,可能会遇到兼容性错误。解决办法:尽量用同样版本的PostgreSQL做备份和恢复。

  • “Role does not exist”错误。 如果备份里有的角色(用户)在恢复服务器上没有,就会报这个错。解决办法:提前在新服务器上建好需要的角色。

  • “Table already exists”错误。 如果你恢复的表已经存在,就会报这个错。用--clean参数可以避免冲突。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION