12

約85以上のテーブルを持つpostgresql dbがあります。pg_dumpコピー モードで (php-pgadmin 経由で)定期的にバックアップを作成していますが、バックアップ ファイルのサイズはほぼ 10 ~ 12 MB です。今私が直面している問題は、データベースを復元しようとするたびに、外部キー制約の問題が発生することです。シナリオは次のとおりです。

users1)と 2) の2 つのテーブルがありますzonesusersユーザーのゾーンを識別するためにゾーンのIDをテーブルに保存し、それを外部キーとして設定しました。

db ダンプを取得すると、 table のエントリは table のエントリのzones後にのみ来ますusersuテーブル名の最初の文字が : の前にあることが原因だと思います。zそのため、データベースを復元すると、外部キー制約の問題が発生し、実行が停止します。db 構造を復元しようとすると、同じ問題が発生します。ダンプ ファイルの の構造の後にzonesの構造があるため、データベースにテーブルが存在しないと表示されます。zonesusers

これに対する解決策はありますか?他に実行可能なバックアップ方法はありますか?

4

6 に答える 6

9

からのバイナリ ダンプではなく、SQL ダンプを取得しているようですpg_dump。これにより、上部にスキーマ (FK を含む) を含む大量の SQL が生成され、その後に一連の INSERT が続き、データをリロードします。からのバイナリ ダンプのpg_dump方が適切です。PhpPgAdmin に場所を伝えるには、少し追加の構成が必要なようですpg_dump。次に、そのバイナリ ダンプをフィードしpg_restorepg_restore適切な順序ですべてを再構築して、参照整合性の問題を回避します (または、より正確には、pg_restoreすべてのデータを復元してから制約を追加します)。

PhpPgAdmin は、.xmlではなくプレーンな SQL ダンプで動作することを望んでいるようですpg_restore。これは信じがたいことですが、呼び出しに関するドキュメントには何も見つかりませんpg_restore。これが当てはまる場合は、おそらく SQL ダンプを手動で編集し、すべての FK を最後に移動する必要があります。

SQL ダンプの先頭に追加することもできSET CONSTRAINTS ALL DEFERRED;ます。これにより、トランザクションの最後まで制約チェックが遅れます。また、INSERT のブロック全体がトランザクション内に含まれていることを確認する必要があります。

PhpPgAdmin が本当に呼び出せない場合は、バックアップ手順を必要に応じて制御できるように、手動で使用pg_restoreする方がよいでしょう。申し訳ありませんが、FK を使用したデータベースのバックアップを処理できないデータベース管理ツールは役に立たないというよりも悪いです。PhpPgAdmin の使い方を知っている人が現れて、PhpPgAdmin の使い方を教えてくれることを願っています。pg_dumppg_restorepg_restore

于 2011-03-19T19:34:51.597 に答える
3

それが誰かに役立つ場合:以前に提案された解決策はどれもうまくいきませんでした(バイナリ形式の場合は独立して、後でダンプされたデータを参照するINSERTが作成された、またはプレーンSQLクエリがありました)。

私がしたこと: schemaspyを使用しました。これは、基になる ER モデルの非常に便利な html ダイアグラムなどの他の機能の中で、2 つの非常に便利なリストを生成するスクリプトです。「挿入順序」(すべてのテーブルが既存の制限と依存関係を考慮して、挿入を実行するための最適な順序)、および「削除順序」(テーブルを削除するために非常に便利)。

サンプルが必要な場合は、このhttp://schemaspy.sourceforge.net/sample/を確認してください。特に、先ほど触れた 2 つのサンプル リストがあります (直接リンクを投稿しようとしましたが、スパム防止メカニズムにより 2 つのリンクしか投稿できませんでした)。

于 2012-07-13T03:03:10.613 に答える
2

私は一度そのような状況に直面しました.構造とデータのバックアップを別々のファイルに持っていたので、これが情報を復元する方法でした:

ALTER TABLE table_name DISABLE TRIGGER ALL;

pg Admin からデータベースを復元します

ALTER TABLE table_name ENABLE TRIGGER ALL;
于 2019-12-19T03:38:26.783 に答える
1

pgdumpを使用する(php-pgadmin経由)

PhpPgAdminがpg_dumpを使用してバックアップを作成していることを確認しますか?pg_dumpによって作成されたダンプを見たことがなく、ダンプを復元するときに外部キーに問題があります。

PhpPgAdminは単なるPHPスクリプトであり、ほとんどの場合、pg_dumpなどのプログラムを起動するための権限はありません。

于 2011-03-19T07:38:21.540 に答える
0

fk の作成を前もって削除し、スクリプトの最後に追加します。

于 2011-03-19T18:52:03.297 に答える