pg_dumps、DUMP1、DUMP2を作成しています。
DUMP1とDUMP2はまったく同じですが、DUMP2がDUMP1の逆順でダンプされた点が異なります。
とにかく、2つのDUMPファイルが完全に同じになるように2つのDUMPを並べ替えることができますか(diffを使用する場合)?
私はPHPとLinuxを使用しています。Linuxで「sort」を使ってみましたが、うまくいきません...
ありがとう!
pg_dumps、DUMP1、DUMP2を作成しています。
DUMP1とDUMP2はまったく同じですが、DUMP2がDUMP1の逆順でダンプされた点が異なります。
とにかく、2つのDUMPファイルが完全に同じになるように2つのDUMPを並べ替えることができますか(diffを使用する場合)?
私はPHPとLinuxを使用しています。Linuxで「sort」を使ってみましたが、うまくいきません...
ありがとう!
前の質問から、あなたが本当にやろうとしていることは、データベースと比較して、データベースがデータを含めて同じであるかどうかを確認することだと思います。
そこで見たように、pg_dumpは決定論的に動作しません。一方のファイルがもう一方のファイルの逆であるという事実は、おそらく偶然です。
スキーマとデータを含む全体的な比較を行う方法は次のとおりです。
まず、このメソッドを使用してスキーマを比較します。
次に、一貫性のある順序ですべてのデータをファイルにダンプして、データを比較します。順序は、最初にテーブルを名前で並べ替え、次に各テーブル内のデータを主キー列で並べ替えることによって保証されます。
以下のクエリはCOPY
ステートメントを生成します。
select
'copy (select * from '||r.relname||' order by '||
array_to_string(array_agg(a.attname), ',')||
') to STDOUT;'
from
pg_class r,
pg_constraint c,
pg_attribute a
where
r.oid = c.conrelid
and r.oid = a.attrelid
and a.attnum = ANY(conkey)
and contype = 'p'
and relkind = 'r'
group by
r.relname
order by
r.relname
copy (select * from test order by a,b) to STDOUT;
そのクエリを実行すると、「すべてをテキストファイルに入れて、データベースごとにpsqlを実行し、出力ファイルを比較する」などのステートメントのリストが表示されます。に出力設定をCOPY
微調整する必要がある場合があります。
私の解決策は、pg_dump出力用に独自のプログラムをコーディングすることでした。ダンプを主キーでソートするPgDumpSortをダウンロードしてください。512MBのJavaデフォルトメモリでは、レコード情報(主キー値、ファイルオフセット)がメモリに保持されるため、テーブルごとに最大1,000万レコードで動作するはずです。
この小さなJavaプログラムを使用します。
java -cp ./pgdumpsort.jar PgDumpSort db.sql
そして、「db-sorted.sql」という名前のファイルを取得するか、出力ファイル名を指定します。
java -cp ./pgdumpsort.jar PgDumpSort db.sql db-$(date +%F).sql
そして、ソートされたデータは「db-2013-06-06.sql」のようなファイルにあります
これで、diffを使用してパッチを作成できます
diff --speed-large-files -uN db-2013-06-05.sql db-2013-06-06.sql >db-0506.diff
これにより、通常ははるかに小さい増分バックアップを作成できます。ファイルを復元するには、を使用して元のファイルにパッチを適用する必要があります
patch -p1 < db-0506.diff
(ソースコードはJARファイル内にあります)
ダンプを解析することはおそらく努力する価値がありません。
DUMP2を一時データベースに復元し、一時データベースを正しい順序でダンプする方がはるかに高速です。
もしも
次のように、データをCSV形式で決められた順序でダンプできます。
COPY (select * from your_table order by some_col) to stdout
with csv header delimiter ',';
COPY(9.5)を参照してください
この問題の別の解決策は次のとおりです:https ://github.com/tigra564/pgdump-sort
これにより、揮発性の値(シーケンス値など)をいくつかの標準的な値にリセットして、結果の差分を最小限に抑えるなど、DDLとDMLの両方を並べ替えることができます。