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

回答:


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
-peetasan

これが機能することを確認できます(編集後、および「postgres」のスペルミスを修正した後)。pg_restore -C -d postgres db.dump恐ろしく見えるかもしれませんが、postgresデータベースには何もしません。最初の接続にのみ使用します。
ジルク

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オプションを使用してバックアップを作成するときは、pg_restoreを使用してバックアップを復元する必要があります。-F pこれを使用すると、SQL文を含むプレーンテキストファイルが生成されます。
EAmez
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.