web-dev-qa-db-ja.com

部分的なDBダンプ/復元

私のデータベース(PostgreSQL 9.3)の一部は、追加のテーブル(郡、市、町など)に依存しています。これらのテーブルは管理していません。サードパーティによって定期的に更新されています。新しいフルダンプを取得するたびに、変更をDBにプッシュバックするのが困難です。

私はpg_dump/restoreをいじって、いくつかの制約の問題に遭遇しましたduplicate key value violates unique constraintまたはcannot drop constraint ... because other objects depend on it でもで --disable-triggersまたは--cleanオプション。

私が見逃したオプションはありますか?制約をオン/オフにするいくつかの方法があることがわかりましたが、これがこれを解決するための良い方法なのか、それとも単なるハックなのかわかりませんか? (私はDBAの専門家ではありません。)正直なところ、これを実現する簡単な方法がないことにかなり驚いています。多分それを逃した!私は単純にpg_restoreを大きなトランザクションとして実行し、スクリプトの最後で制約をチェックできると思っていました。出来ますか?

8
ablm

UNIQUE制約はトリガーではありません一意のインデックスを介して実装されます。したがって、--disable-triggersでオフにすることはできません。

一意の制約に依存する「その他のオブジェクト」は、通常、外部キー制約です。これらは、参照される列に一意の(または主キー)制約がないと存在できません。復元を有効にするには、そのようなすべてのfk制約を一意の制約とともに削除します。

もちろん、参照整合性を復元するには、違反の重複を排除し、削除されたすべての制約を再作成する必要があります。一時的であっても、一貫性のない状態になる余裕がない場合は、すべてを単一の(自動的にブロックする)トランザクションで実行します。

関係するテーブルに排他ロックをかける余裕がない場合、残っている唯一の選択肢は、最初にデータを修正することです。これはどちらの方法でもおそらく最良のアクションです。 COPYを使用してデータを一時テーブルにインポートし、重複を削除してから、INSERTをターゲットテーブルにインポートできます。

一方、外部キーのmissing値に遭遇した場合は、NOT VALID fk制約で即席にすることができます。

最初から問題が発生することはありません。 UNIQUE制約が実際に設定されている場合、深刻な破損がない限り、ソースデータベースに重複した値を含めることはできません。その場合は、まずソースデータベースを修正してください...

2

この問題をポイントインタイムリカバリで解決しようとするとどうでしょうか。ダンプには、とにかく古いデータのセットを取得するという問題があります。より新しいバージョンのデータを提供するバックアップ方法を使用することを強くお勧めします。

簡単なテーブルで変更されたすべての情報を保存する簡単な変更ログトリガーを自分で作成することもできます。これがどのように機能するかです: http://www.cybertec.at/tracking-changes-in-postgresql/ サイトのコードはあなたに与えるはずですラフなプロトタイプで、修正に役立ちます。