web-dev-qa-db-ja.com

-Cオプションを指定したpg_restoreはデータベースを作成しません

Postgresデータベースのバックアップと復元にpg_dumpとpg_restoreを使用しています。

この質問に関連するドキュメントの情報を次に示します。Pg_restoreの場合、-Cオプションは次のように説明されます

-C

-作成

復元する前にデータベースを作成します。 --cleanも指定されている場合、>>接続する前にターゲットデータベースを削除して再作成します。このオプションを使用すると、-dで指定されたデータベースは、最初のDROP DATABASEコマンドとCREATE DATABASEコマンドを発行するためにのみ使用されます。すべてのデータは、アーカイブに表示されるデータベース名に復元されます。

しかし、pg_restoreでこのオプションを使用しても、次のエラーが発生します

pg_restore:[アーカイバ(db)]データベース "test"への接続に失敗しました:致命的:>データベース "test"は存在しません

説明に従って、-Cオプションは欠落しているデータベースを作成しているはずです。しかし、それは私の場合ではありません。

バックアップと復元のために行った手順は次のとおりです。

  1. Pg_dumpを使用してデータベースをバックアップする
pg_dump -N backup -d test --format custom -v -h xxhostxx -p 5432 -U xxuserxx --lock-wait-timeout 300000 -f test_pg_dump.dmp

注:-Cオプションはプレーンテキスト形式でのみ意味があるため、使用しません

  1. testデータベースを削除しました

  2. pg_resoreを使用してデータベースを復元する

    pg_restore -C -d test -v -h xxhostxx -p 5432 -U xxuserxx test_pg_dump.dmp**
    

ここで何が問題なのか理解できません!私は何か悪いことをしていますか?さらに情報が必要な場合はお知らせください。

14
Swapnil17

@Eelkeが言ったとおり-スクリプトを実行しているときにこのデータベースは存在しないため、ファイルに「create database」が書き込まれています...これは、常に「postgres」データベースがあるためです。これを試して:

pg_restore -C -d postgres -v -h xxhostxx -p 5432 -U xxuserxx test_pg_dump.dmp**

そしてこれは:

  1. postgresデータベースに接続する
  2. テストデータベースを作成する
  3. Postgresから切断し、テストに接続します
  4. データベースにデータをアップロードする

もちろん、postgresデータベースの所有者を確認してください-ほとんどの場合、これをユーザー 'postgres'として実行する必要があります。

4
Jendrusk

次の引用は、あなたがそれが何を意味すると考えているかを意味するものではありません。彼らが言っていることに気づく前に、私はそれを3回も読まなければなりませんでした。

このオプションを使用すると、-dで指定されたデータベースは、最初のDROP DATABASEコマンドとCREATE DATABASEコマンドを発行するためにのみ使用されます。すべてのデータは、アーカイブに表示されるデータベース名に復元されます。

これは、pg_restoreが最初に-dで指定されたデータベースに接続することを意味します。そのデータベースは作成されません。復元するアーカイブから名前を付けてデータベースを作成し、データをそのデータベースに復元します。

4
Eelke

それは私のために機能しなかったので、このコマンドはデータベースを作成します

createdb -h Host -U USER -W DB_NAME

次に、pg復元を実行します

pg_restore -d DB_NAME -v -h Host -p PORT -U USER DUMP_FILE.dump**

物語の終わり

0