21

次の手順でテストケースを実行するPHPスクリプト(Linuxのbashコマンドも使用)を作成しています。

PostgreSQLデータベース(8.4.2)を使用しています...

1.)DBを作成します2.)DBを変更します3.)DBのデータベースダンプを保存します(pg_dump)

4.)ステップ1.)および2.)を実行して回帰テストを実行し、次に別のデータベースダンプを取得して、ステップ番号3.)の元のデータベースダンプと比較します(差分)。

ただし、pg_dumpが常に同じ方法でデータベースをダンプするとは限らないことがわかりました。毎回異なる順序で物をダンプします。したがって、2つのデータベースダンプで差分を実行すると、2つのファイルが実際には同じである場合に、順序が異なるだけで、2つのファイルが異なる結果になります。

pg_dumpを実行するための別の方法はありますか?

ありがとう!

4

7 に答える 7

15

pg_dump出力を前処理して、バージョン管理での比較と保存に適したものにするための便利なスクリプトを次に示します。

https://github.com/akaihola/pgtricks

pg_dump_splitsort.pyダンプを次のファイルに分割します。

  • 0000_prologue.sql: 最初の COPY まで
  • 0001_<schema>.<table>.sql
    .
    . :最初のフィールドでソートされた
    NNNN_<schema>.<table>.sql各テーブルのデータ
  • 9999_epilogue.sql: 最後の COPY の後のすべて

テーブル データのファイルには番号が付けられているため、すべてのファイルを単純に並べ替えて連結すると、データベースを再作成できます。

$ cat *.sql | psql <database>

ダンプ間の違いを簡単に調べる良い方法は、meldディレクトリ全体でツールを使用することです。

$ meld old-dump/ new-dump/

ダンプをバージョン管理に保存すると、相違点についても適切なビューが得られます。差分で色を使用するように git を構成する方法は次のとおりです。

# ~/.gitconfig
[color]
        diff = true
[color "diff"]
        frag = white blue bold
        meta = white green bold
        commit = white red bold

注:テーブルを作成/削除/名前変更した場合.sqlは、新しいダンプを後処理する前にすべてのファイルを削除することを忘れないでください。

于 2010-04-22T07:00:22.230 に答える
14

ここでスキーマとデータを区別する価値があります。スキーマはかなり決定論的な順序でダンプされます。ほとんどのオブジェクトはアルファベット順に、オブジェクト間の依存関係によって制約されます。順序が完全に制約されておらず、外部の観察者にはランダムに見える場合がありますが、次のバージョンで修正される可能性があります。

一方、データはディスク順にダンプされます。これは通常、ダンプを高速化し、並べ替えに非常に多くのリソースを使用しないようにするためです。あなたが観察しているのは、「DBを変更する」ときにUPDATEを実行していることです。これにより、実際には古い値が削除され、最後に新しい値が追加されます。もちろん、それはあなたの差分戦略を覆します。

目的により適したツールはpg_comparatorです。

于 2010-02-01T19:16:39.220 に答える
10

pg_dump が特定の順序でデータをダンプするように強制することは不可能です。これは、ディスクの順序でデータをダンプするためです。この方法の方がはるかに高速です。

pg_dump に「-a -d」オプションを使用してから「ソート」出力を使用できますが、データに改行があると、ソートされた出力が使用できなくなります。しかし、基本的な比較では、何かが変わったとしてもそれで十分です。

于 2010-02-01T19:02:55.027 に答える
3

スキーマだけに興味がある場合:

一度に 1 つのテーブルのみのスキーマをダンプするために、これらのオプションの組み合わせを使用してテーブルごとに diff テーブルを実行できます。次に、それらを個別に比較するか、すべてを既知の順序で 1 つのファイルにまとめます。

-s, --schema-only           dump only the schema, no data
-t, --table=TABLE           dump the named table(s) only

上記にフィードするテーブルのリストを生成するには、 query information_schema.tables.

于 2010-02-01T19:54:25.197 に答える
3

2010 年5 月現在、 pg_dump へのパッチが存在し、この問題に関心のあるすべての人に役立つ可能性があります。これは、このユーティリティに「--ordered」オプションを追加します。

--ordered を使用すると、主キーまたは一意のインデックスが存在する場合はデータが並べ替えられ、「最小」の順序付け (つまり、一意の順序に必要な列の最小数) が使用されます。

--ordered は、非常に大きなテーブルを並べ替えようとすると、データベース サーバーがクラッシュする可能性があるため、慎重に使用してください。

私はそれをテストしませんでしたが、試してみる価値があると思います。

于 2010-08-10T11:55:39.593 に答える
1

PostgreSQL が非決定論的に動作することは珍しいことではありません。タイマーによってトリガーされる再編成プロセスまたはそのようなものがバックグラウンドで発生する可能性があります。さらに、連続実行時に pg_dump にビット同一の出力を強制的に再現させる方法を知りません。

誤った動作をしているのは比較であるため、比較ロジックを変更することをお勧めします。両方のダンプが同じデータベース状態を表しているにもかかわらず、違いが報告されます。もちろん、これは追加の作業を意味しますが、私の意見では、問題を解決する正しい方法です。

于 2010-02-01T18:16:06.767 に答える