5

pg_dumps、DUMP1、DUMP2を作成しています。

DUMP1とDUMP2はまったく同じですが、DUMP2がDUMP1の逆順でダンプされた点が異なります。

とにかく、2つのDUMPファイルが完全に同じになるように2つのDUMPを並べ替えることができますか(diffを使用する場合)?

私はPHPとLinuxを使用しています。Linuxで「sort」を使ってみましたが、うまくいきません...

ありがとう!

4

5 に答える 5

9

前の質問から、あなたが本当にやろうとしていることは、データベースと比較して、データベースがデータを含めて同じであるかどうかを確認することだと思います。

そこで見たように、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微調整する必要がある場合があります。

于 2010-02-05T14:47:24.157 に答える
1

私の解決策は、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ファイル内にあります)

于 2013-06-06T09:51:53.760 に答える
0

ダンプを解析することはおそらく努力する価値がありません。

DUMP2を一時データベースに復元し、一時データベースを正しい順序でダンプする方がはるかに高速です。

于 2010-02-05T05:15:31.117 に答える
0

もしも

  • パフォーマンスは注文よりも重要ではありません
  • スキーマではなくデータのみを気にします
  • そして、あなたは両方のダンプを再作成する立場にあります(既存のダンプを操作する必要はありません)

次のように、データをCSV形式で決められた順序でダンプできます。

COPY (select * from your_table order by some_col) to stdout
      with csv header delimiter ',';

COPY(9.5)を参照してください

于 2017-07-19T14:28:29.973 に答える
0

この問題の別の解決策は次のとおりです:https ://github.com/tigra564/pgdump-sort

これにより、揮発性の値(シーケンス値など)をいくつかの標準的な値にリセットして、結果の差分を最小限に抑えるなど、DDLとDMLの両方を並べ替えることができます。

于 2019-02-18T17:20:16.020 に答える