没有 -d 开关的 pg_restore:它起什么作用?

没有 -d 开关的 pg_restore:它起什么作用?

版本:postgresql 9.6,macos 10.14

作为postgres用户,我运行了 pg_restore 命令:

pg_restore -C backup.curated.20190901.0.bup

即根据转储文件中的内容创建数据库。

这似乎工作正常,它在屏幕上闪现了一堆 SQL 命令。

但是...没有创建数据库。

为了真正创建它,我必须更改命令以添加-d指定数据库。

pg_restore -d postgres -C backup.curated.20190901.0.bup

行为相同,只是这次数据库被恢复。

来自pg_restore 文档

-C——创建

Create the database before restoring into it. If --clean is also specified, drop and recreate the target database before connecting to it.

When this option is used, the database named with -d is used only to issue the initial DROP DATABASE and CREATE DATABASE commands. All data is restored into the database name that appears in the archive.

基本上,我很好奇-d如果数据库恢复需要开关的话,为什么没有人抱怨没有开关。

这里做什么pg_restore?试运行预览?

如果相关的话,我使用的转储命令是:

sudo -u postgres $pgbin/pg_dump -o -Fc $dbname > $dirbackup/$dbname.bup;

答案1

基本上,我很好奇为什么没有人抱怨缺少 -d 开关,如果需要进行数据库恢复的话。

pg_restore 在这里做什么?试运行预览?

它输出脚本而不假定您要用它做什么。当然可以预览,但也可以将其传输到psql,或将ssh其传输到 以在您无法直接访问的远程实例上播放,或者只是保存到文件以进行编辑或将其传输到其他地方。

在最新版本的 PostgreSQL(12.0,于 2019 年 10 月 3 日发布)中,估计有太多人像你一样对pg_restore标准输出感到惊讶默认情况下,因此从该版本开始,我们现在需要指定一个-f -参数来获取该行为。您提到的第一个调用现在失败,并显示:

pg_restore: error: one of -d/--dbname and -f/--file must be specified

答案2

需要的标志pg_restore 取决于两者:

  • 开始恢复之前数据库/服务器的当前状态
  • 用于创建单个数据库备份的标志gd_dump
  • 用于创建完整服务器备份的标志pg_dumpall

最后一个是pg_restore -C不需要具有强制(单一)-d <database name>依赖关系的原因是,备份文件可以包含多个数据库的备份,在这种情况下,这些数据库的名称将包含在备份文件中。

相关内容