pg_dump / pg_restoreを使用してPostgreSQLデータベースをバックアップおよび復元していますが、pg_restoreからいくつかのエラーメッセージ(およびゼロ以外の終了ステータス)を取得しています。私は非常にシンプルなベースケース(以下に概説)を試しましたが、まだこれらのエラーが発生しました:
pg_restore:[アーカイバ(db)] TOC処理中のエラー: pg_restore:[archiver(db)] TOCエントリ5からのエラー。2615 2200 SCHEMAパブリックポストグレス pg_restore:[アーカイバ(db)]クエリを実行できませんでした:エラー:スキーマ "public"は既に存在します コマンドは:CREATE SCHEMA public;
再現する手順:
- 新鮮なバニラUbuntu 14.04ディストリビューションをインストールします(このVagrantボックスで Vagrantを使用しています)。
- PostgreSQL 9.3をインストールし、LinuxユーザーからのPostgreSQLユーザー「postgres」としてローカル接続を許可するように設定します。
テストデータベースを作成します。私はただやっている:
vagrant @ vagrant-ubuntu-trusty-64:〜$ psql --username = postgres postgres psql(9.3.5) ヘルプを表示するには「help」と入力します。 postgres =#データベースmydbを作成; データベース作成 postgres =#\ q vagrant @ vagrant-ubuntu-trusty-64:〜$ psql --username = postgres mydb psql(9.3.5) ヘルプを表示するには「help」と入力します。 mydb =#create table data(entry bigint); テーブルを作成 mydb =#データ値に挿入(1); 挿入0 1 mydb =#データ値に挿入(2); 挿入0 1 mydb =#データ値に挿入(3); 挿入0 1 mydb =#\ q
次のようにデータベースのバックアップを作成します。
PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
mydbのデータテーブルからいくつかの行を削除して、データが正常に復元されたかどうかを確認できるようにします。
以下を使用してデータベースを復元します。
PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump
データは復元されますが、手順6のpg_restoreコマンドはステータス1
で終了し、次の出力を表示します。
pg_restore:[アーカイバ(db)] TOC処理中のエラー: pg_restore:[archiver(db)] TOCエントリ5からのエラー。2615 2200 SCHEMAパブリックポストグレス pg_restore:[アーカイバ(db)]クエリを実行できませんでした:エラー:スキーマ "public"は既に存在します コマンドは:CREATE SCHEMA public; 警告:復元時に無視されるエラー:1
このコマンドをプログラムで実行しており、終了ステータスを使用して復元が失敗したかどうかを判断する必要があるため、これを無視することはできません。最初は、この問題がデータベースをパブリック(デフォルトのスキーマ)にしたためかどうか疑問に思いました。私--create
は、データが復元される前にpg_restoreによるオプションの結果としてパブリックが作成されると推論しました(これは私のテーブルがある場所なので、スキーマを作成しようとする可能性があります)が、テーブルで上記の手順を試したとき異なるスキーマでは、結果は同じで、エラーメッセージは同じでした。
私は何か間違っていますか?このエラーが表示されるのはなぜですか?
--create
せclean
ずに問題を解決することはできません。