回答:
これは、pg_restoreが機能する方法だからです。
pg_restoreマニュアルは次のように読み取ります。
-C、--createデータベースを復元する前に作成します。--cleanも指定されている場合は、接続する前にターゲットデータベースを削除して再作成します。
このオプションを使用すると、-dで指定されたデータベースは、最初のDROP DATABASEおよびCREATE DATABASEコマンドを発行するためにのみ使用されます。すべてのデータは、アーカイブに表示されるデータベース名に復元されます。
-Cが使用されていない場合にのみ、-dは指定されたデータベースに復元します。-Cを使用すると、データベースは宛先としてではなく「起動パッド」として使用されます。
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"'
要するに、次のいずれかが必要です(既存のものを消去):(データベース名はであることに注意してください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の発言をご覧ください。
pg_restore: [archiver] -C and -c are incompatible options
pg_restore -C -d postgres db.dump
恐ろしく見えるかもしれませんが、postgresデータベースには何もしません。最初の接続にのみ使用します。
もう少し明確にするために、これは私が問題を解決したことです:
希望する名前で空のデータベースを作成します:(私の場合、ユーザー名は 'postgres'でした)
psql -U [username]
次に、パスワードの入力を求められます。この時点で、[ユーザー名]としてログインします。次を入力します。
CREATE DATABASE [dbname];
セッションを終了し、通常のターミナルセッションに戻ります。
作成したデータベース名としてターゲットデータベース名を設定しているファイルからデータベースを復元します。
cat [your_file_path/filename] | psql -U [username] [dbname]
[your_file_path / filename]は、復元するdbファイルまたはテキストファイルの場所です。
-F
オプションを使用してバックアップを作成するときは、pg_restoreを使用してバックアップを復元する必要があります。-F p
これを使用すると、SQL文を含むプレーンテキストファイルが生成されます。
pg_restore
。-Cオプションは、名前がダンプファイル内のデータベース名と一致するデータベースのみを作成できます。任意のデータベースに復元するには、を実行CREATE DATABASE new_db;
する前にpsqlで実行する必要がありますpg_restore --dbname=new_db
。