我正在尝试运行以下命令:
sshpass -p "pass" ssh [email protected] "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db
我得到:
failed: FATAL: database "new_db" does not exist
我正在尝试运行以下命令:
sshpass -p "pass" ssh [email protected] "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db
我得到:
failed: FATAL: database "new_db" does not exist
这是因为它是 pg_restore 的工作方式。
pg_restore 手册内容如下:
当且仅当不使用 -C 时,-d 才会在给定的数据库中恢复。如果使用 -C,则数据库用作“启动板”,而不是目标。
简而言之,您想要(干净的现有):(注意数据库名称是
postgres
)或(新建)
或(明确创建新的)
详情请参阅 SCO 所说的。
让我改写@Izap的答案,因为我必须一遍又一遍地阅读所有答案才能弄清楚......
数据库管理工具在某些情况下需要连接到数据库,以便执行维护操作。
pg_restore
例如,当被要求创建我们将恢复数据的数据库时需要一个。让我们在这里停下来定义一些术语:
所以我看到的问题
pg_restore
是它对两个完全不同的事物使用相同的语义(相同的选项参数)。-d
/在使用时--dbname
被理解为维护数据库--create
。但是不使用的时候,--dbname
突然变成了目标数据库。为了清楚起见,让我们在 shell 中定义它们:
所以你有了:
这意味着仅删除该
--create
选项,可能会无意中pg_restore
将维护数据库用作目标数据库。我希望他们选择使用
--maintenance-db
like increatedb
,始终使用--dbname
目标。更明确地说,这就是我所做的为我解决了问题的方法:
使用您想要的名称创建一个空数据库:(在我的情况下,用户名是“postgres”)
然后它将提示您输入密码。此时,您将以 [用户名] 身份登录。键入以下内容:
现在退出会话并返回到您的常规终端会话。
从您将目标数据库名称设置为刚刚创建的数据库名称的文件中恢复数据库。
其中 [your_file_path/filename] 是要恢复的 db 文件或文本文件的位置。