为什么pg_restore忽略--create?错误:失败:致命:数据库“ new_db”不存在


16

我正在尝试运行以下命令:

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

我得到:

failed: FATAL:  database "new_db" does not exist

Answers:


19

这是因为它是pg_restore的工作方式。

pg_restore手册内容如下:

-C,--create在还原到数据库之前创建数据库。如果还指定了--clean,请在连接到目标数据库之前删除并重新创建目标数据库。

使用此选项时,以-d命名的数据库仅用于发出初始DROP DATABASE和CREATE DATABASE命令所有数据都将还原到存档中显示的数据库名称中

当且仅当不使用-C时,-d才会在给定的数据库中还原。如果使用-C,则数据库将用作“启动板”,而不用作目标。


6
需要说明的是:无法创建任意数据库名称并使用还原到该名称pg_restore。-C选项只能创建名称与转储文件中的数据库名称匹配的数据库。要还原到任意数据库,必须先CREATE DATABASE new_db;在psql中运行pg_restore --dbname=new_db
路加福音

我的命令docker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
srghma

5
为什么工具在容易使用时必须引起混淆?
奥古斯丁·里丁格

8

简而言之,您需要(清除现有的):(注意数据库名称为postgres

pg_restore -c -d postgres db.dump

或(新建)

pg_restore -C -d postgres db.dump

或(明确创建新的)

createdatabase the_database
pg_restore -d the_database db.dump

有关更多详细信息,请参见SCO所说的内容。


您的第一个建议在9.1上pg_restore: [archiver] -C and -c are incompatible options
无效

我可以确认这是可行的(在编辑之后,并修复了“ postgres”的拼写错误)。pg_restore -C -d postgres db.dump可能看起来很吓人,但是它对postgres数据库没有任何作用,它仅用于初始连接。
Zilk

0

更明确地说,这就是我为我解决的问题:

  1. 使用所需名称创建一个空数据库:(在我的情况下,用户名是“ postgres”)

    psql -U [username]

然后,它将提示您输入密码。此时,您将以[用户名]登录。输入以下内容:

    CREATE DATABASE [dbname];

现在退出会话并返回到常规的终端会话。

  1. 从将目标数据库名称设置为刚创建的数据库名称的文件中还原数据库。

    cat [your_file_path/filename] | psql -U [username] [dbname]

其中[your_file_path / filename]是要还原的db文件或文本文件的位置。


使用de -F选项创建备份时,除非使用-F p产生带有sql语句的纯文本文件,否则必须使用pg_restore还原备份。
EAmez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.