1. ホーム
  2. postgresql

[解決済み] 開発スナップショットのテーブルの一部だけをPostgresでダンプする。

2022-12-09 17:42:09

質問

実稼働環境では、私たちのデータベースは数百ギガバイトの大きさです。開発およびテストのために、このデータベースのスナップショットを作成する必要がありますが、それは機能的に同等で、サイズは 10 または 20 ギガだけです。

課題は、ビジネス エンティティのデータが多くのテーブルに散らばっていることです。ある種のフィルタリングされたスナップショットを作成し、そのスナップショットから いくつかの のみがダンプに含まれるようにしたいのです。そうすれば、開発およびテスト用に毎月新鮮なスナップショットを得ることができます。

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

  • 会社にはN個の部門がある
  • 事業部にはN人の従業員がいます。
  • 従業員にN個の出勤記録がある

1000社、2500部門、175000人の従業員、そして何千万もの出勤記録があると思います。たとえば、最初の 100 社を取得するための複製可能な方法が必要です。 とその構成部門、従業員、および出勤記録をすべて引き出すことができる再現可能な方法が必要です。 .

現在、スキーマのためにpg_dumpを使用しています。そして、小さなテーブルからすべてのデータを取り出すために、-disable-triggersと-data-onlyでpg_dumpを実行します。私たちは速い開発サイクルを持ち、カスタムスクリプトが壊れやすく、古くなりやすいことを懸念しているので、データの一部を取り出すためにカスタムスクリプトを書く必要がないようにしたいのです。

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

一般的なアドバイスもお願いします。

どのように解決するのですか?

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

本番環境のサブセットを引っ張ってくるだけでなく、開発用データのセットを維持することを検討すべきです。 ユニットテストを書いている場合、テストに必要な同じデータを使用して、すべての可能なユースケースをヒットしようとすることができます。