開発スナップショットのテーブルの一部のみのPostgresダンプ


95

本番環境では、データベースのサイズは数百ギガバイトです。開発とテストのために、このデータベースのスナップショットを作成する必要があります。スナップショットは機能的には同等ですが、サイズは10または20ギガです。

課題は、ビジネスエンティティのデータが多くのテーブルに分散していることです。一部のエンティティのみがダンプに含まれるように、フィルター処理されたスナップショットを作成する必要があります。そうすれば、開発やテストのために毎月かそこらで新しいスナップショットを取得できます。

たとえば、次のような多対多の関係を持つエンティティがあるとします。

  • 会社にはN部門があります
  • 部門にはN人の従業員がいます
  • 従業員にはN回の出席記録があります

1000社、2500部門、175000人の従業員、そして数千万人の出席記録があります。たとえば、最初の100社とそのすべての構成部門、従業員、および出席記録を引き出す複製可能な方法が必要です。

現在、スキーマにはpg_dumpを使用しています。次に、pg_dumpを--disable-triggersおよび--data-onlyを指定して実行し、小さいテーブルからすべてのデータを取得します。開発サイクルが速く、カスタムスクリプトが壊れやすく、古くなる可能性が高いため、データの一部を取り出すためにカスタムスクリプトを作成する必要はありません。

どうすればこれを行うことができますか?データベースから論理パーティションを引き出すのに役立つサードパーティのツールはありますか?これらのツールは何と呼ばれますか?

一般的なアドバイスも歓迎します!

回答:


108

より大きなテーブルでは、COPYコマンドを使用してサブセットを取り出すことができます...

COPY (SELECT * FROM mytable WHERE ...) TO '/tmp/myfile.tsv'

COPY mytable FROM 'myfile.tsv'

https://www.postgresql.org/docs/current/static/sql-copy.html

プロダクションのサブセットを単にプルするのではなく、開発データのセットを維持することを検討する必要があります。単体テストを作成している場合は、テストに必要なものと同じデータを使用して、考えられるすべてのユースケースにヒットしようとします。


私はこのテクニックを使ってOPと同じことを成功させました。テスト実行では、COPY(SELECT ..)TO ..制約されたデータを「テンプレート」データベースにロードし、CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XXを使用しました。もちろん、データを最小限に調整して、ロードされた製品のスナップショットとテストデータベースの作成操作が、チームの妨げにならないように十分高速であることを確認しました。
Trey

5
スナップショットが必要な結合テーブルが複数ある場合、これを機能させる方法はありますか?COPY FROMは、複数のテーブルのインポートをサポートしていません。
mlissner 2013

1
あなたは男です...これは私にとって物事をとても簡単にしますが、別の目的のためです。これを使用して、データをパブリックスキーマからマルチテナントアプリのユーザー固有のスキーマに移動しました。よろしくお願いします!
ジェレミーF.

5
このメソッドはコピーされたテーブルのシーケンスを更新しないため、これ以上の挿入が主キー制約に違反する可能性があることに注意してください。
user2859458

1
後者はスーパーユーザーのみだったので、\copy代わりに使用する必要がありCOPYました。幸い、9.1の他の変更はなく、他のすべては完全に機能しました。
PJSCopeland

8

すでにこれを実行しているソフトウェアについては知りませんが、3つの代替ソリューションを考えることができます。残念ながら、それらはすべていくつかのカスタムコーディングが必要です。

  1. 別のスキーマですべてのテーブルを再作成してから、ダンプしたいデータのサブセットのみをそれらのテーブルにコピーし、それを使用INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...してダンプします。

  2. SQLステートメントとしてデータをダンプするための独自のスクリプトを記述します。私は過去にこのアプローチを使用したことがあり、20行から30行のPHP程度しかかかりませんでした。

  3. 単一のテーブルをダンプするときに-tスイッチとともに条件を受け入れるようにpg_dumpを変更します。


6

http://jailer.sourceforge.net/がこれを行います。


12
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
talonmies

3
これは実際には意味がありません。OPは、これを行うサードパーティツールの名前を具体的に要求しました。したがって、答えの本質は、「このURLには、これを行う「Jailer」と呼ばれるサードパーティのツールがある」ということだけです。そのリンク自体がすべての重要な情報を提供します。追加するものは他にありません。そのリンクが機能しなくなった場合、URLから「プログラムはJailerと呼ばれている」と簡単に推測できるため、追加するのは冗長です。
Paul Legato

2
もちろん、リンクは現在壊れており、グーグルは代替手段を表示しません。
オーウェンスマーティン2014

1
リンクは現在私には有効で、「jailer postgres」のグーグル検索はgithub.com/Wisser/Jailerも表示しました。
Paul Legato 14

8
おそらく、howこのツールの使用に関する有用な説明を追加した場合、それが目標を達成する方法を理解できる可能性があります
ブライアンアッシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.