テーブルデータのサブセットを製品データベースからローカルのテストデータベースにエクスポートするにはどうすればよいですか?


10

比較的大きな量のpostgresベースのデータベースがあります:〜20GB。PostgreSQLデータベースはherokuでホストされています。

テーブルデータの小さなサブセットをローカルデータベースにコピーして、本番環境で作業することなく、それらに対していくつかのテストを実行したいと考えています。

自分でサンプルデータを生成するのではなく、本番環境にすでに存在するデータを使用します。

データベースの各テーブルから最大100行で十分です。これを達成する簡単な方法はありますか?


1
不思議なことに、なぜ20GBのディスク容量が多すぎるのですか?私は、仮想マシンのテストディスクに100 GBを割り当て、DBのスクラッチスペースのみを割り当てています。
jcolebrand

外付けのHDを携帯しないこともあるので、私のSSDには十分なスペースがありません。さらに、本当に必要なのは、db全体ではなく、dbからのサンプルデータだけです。
jottr 2012年

1
十分に公平ですが、それでもなお、クリエイティブになることをお勧めします。SDカードがSDスロットに収まることを検討してください。これ以上データを取得することに問題はありませんでした:-)が、それでも問題はありません:-\個人用ラップトップが最後の空き容量10 GBに達しました。
jcolebrand

回答:


3

私はこのツールを使用していませんが、Jailerはそれを実行することを約束します

データベースのサブセット化および参照ツール。リレーショナルデータベース(JDBC)から一貫性のある、参照用に損なわれていない行セットをエクスポートする

http://sourceforge.net/projects/jailer/


1

看守は、この状況で役立ちます。私はあなたのものと同じものに取り組んでいます(各テーブルのレコードを100個まで取得しようとしています)、ここに私が実行した手順があります:-ルートエンティティ(ほとんどのテーブルに関連付けられているもの)を見つけて、レコードのサブセットを取得します。ルート行(たとえば、ルートはピープルであり、people.id = 1 ...に関連するすべてのレコードを検索します)-終了ステップ1の後で、別のテーブル(100レコードにしたいテーブル)から再度開始します。 )、上記の結果からそのサブセットを取得します。


1

別のオプションは、最近見つけたものです(確かに、まだ使用していませんが、すぐに使用する予定です)rdbms-subsetter

Jailerよりも少しシンプルで軽量で、いくつかの優れた機能/特典があります。

  • CLIは既存のツールに簡単に接続できます
  • オープンソース
  • 外部キーをたどって一貫性のあるデータのサブセットをフェッチします
    • 明確に定義された外部キーない場合は、JSON構成ファイルを介して関係提供できます。私の場合、他の場所に保存されているスキーマメタデータからこの構成を生成する予定です(ありがとう、Rails:\)。
  • 特定の行をターゲットにして、関連するすべてのレコードを取得できます(たとえば、特定の顧客に問題があるため、すべてをプルダウンして、アカウントの作業データにローカルでアクセスできるようにすることができます)
  • テーブルごとに一定数のレコードを取得するか、対数を使用して、過剰な処理をせずに大きなテーブルからより多くのデータを取得できます。

Herokuデータベースの別のオプションを具体的に説明することは価値があります。これは、私が頻繁に使用したものです(以前はそこで働いていました)。

Herokuは、先読みログを最初にプルして準備し、次にプライマリDBに接続して追いつき、追跡を停止するため、新しいスナップショットDBの立ち上げはかなり高速です。アプリ全体にこれらの「フォーク」を作成して、制作にあまり影響を与えないようにすることができます。

$ heroku addons:create heroku-postgres[:specific-plan] \
    --fork your-production-app::DATABASE \
    --app some-other-app-to-own-forked-database \
    [--as PRODUCTION_SNAPSHOT]

次に、そのスナップショットを指すローカルでアプリを起動できます。私はこれを頻繁に使用して、データまたはスキーマの移行の予行演習を行ったり、顧客の問題をデバッグしたりします。

上記のコマンドDATABASE_URLyour-production-app、on でアクセス可能なDBがある場合、という名前の別のアプリでPRODUCTION_SNAPSHOT_URL(指定した場合--as)でアクセス可能なDB が作成されますsome-other-app-to-own-forked-database


0

ランダムな行のセットを取得するには、次のようにLIMITを使用できます。

SELECT * FROM my_table LIMIT 100

これが最も簡単で、PostreSQLが遭遇した最初の100行を選択するだけです。最後に挿入された100または最初の100の可能性があります。本当にランダムなものが必要な場合は、このStackoverflowの回答をご覧ください。


助けてくれてありがとう、しかしこれは私の質問に答えません。
jottr

私は私の選択を制限する方法を知っています。私の問題は、データのサブセットを使用してherokuからdbを複製する方法が必要であることです。herokusマニュアルに記載されているようにdb全体をダンプすることはオプションではありません。
jottr

1
@elementz-テーブルをループしてCOPY(SELECT ... LIMIT 100)TO 'filename' ...をループできない理由はありますか?HerokuでCOPY TOできませんか?
rfusca

@rfusca-COPY TOが存在することを知りませんでした。私は戻って報告しようとします。
jottr 2012年

3
@rfusca:シンプルLIMITを使用しても、FK参照は処理されません。たとえば、ordersテーブルの100行には、customersテーブルから100行をエクスポートするときに存在しない顧客が含まれる場合があります。
a_horse_with_no_name 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.