it-swarm-ja.tech

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

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

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

たとえば、これらの多対多の関係を持つエンティティがあるとします。

  • 会社にはN部門があります
  • 部門にはN人の従業員がいます
  • 従業員にはNの出席レコードがあります

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

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

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

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

86

大きなテーブルでは、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

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

98
Ben

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

6
Paul Legato

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

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

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

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

6