Bagaimana saya bisa mengekspor subset dari tabledata dari basis data prodution ke dalam basis data pengujian lokal saya?

10

Kami memiliki postgres produksi yang relatif besar berdasarkan db: ~ 20GB. Basis data PostgreSQL di-host di heroku.

Saya ingin menyalin sebagian kecil data tabel ke database lokal saya sehingga saya dapat menjalankan beberapa tes pada mereka tanpa harus bekerja pada produksi.

Saya tidak ingin menghasilkan data sampel sendiri, melainkan menggunakan data yang sudah ada di lingkungan produksi.

~ 100 baris dari setiap tabel dalam database sudah cukup. Apakah ada cara mudah untuk mencapai ini?

jottr
sumber
1
Hanya ingin tahu, mengapa ruang disk 20GB terlalu banyak? Saya memiliki 100GB yang dialokasikan pada test-disk saya di VM saya hanya untuk ruang awal DB.
jcolebrand
Karena saya kadang-kadang tidak membawa hd eksternal saya, SSD saya tidak menyediakan ruang yang cukup. Plus saya benar-benar hanya perlu data sampel dari db saya, dan bukan seluruh db.
jottr
1
Cukup adil, tetapi saya mendorong Anda untuk tetap kreatif. Pertimbangkan kartu SD yang pas di slot SD, karena saya tidak pernah memiliki masalah dengan memiliki lebih banyak data :-) tapi itu menyedot: - \ laptop pribadi saya turun hingga 10GB gratis terakhir.
jcolebrand

Jawaban:

3

Saya belum pernah menggunakan alat ini, tetapi Jailer berjanji untuk melakukan hal itu

Alat Berlangganan dan Perambanan Basis Data. Mengekspor baris-set yang konsisten, secara referensial utuh dari database relasional (JDBC)

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

seekor kuda tanpa nama
sumber
1

Penjara dapat membantu dalam situasi ini. Saya sedang mengerjakan yang sama dengan milik Anda (mencoba untuk mendapatkan ~ 100 catatan dari setiap tabel) dan di sini adalah langkah-langkah yang saya lakukan: - Temukan entitas root (yang terkait dengan hampir tabel) dan dapatkan subset dari catatan dari suatu baris akar (mis. root adalah orang, maka saya akan mencari semua catatan terkait ke people.id = 1 ...) - Setelah menyelesaikan langkah 1, mulai lagi dengan tabel lain (yang ingin Anda miliki 100 catatan ) dan dapatkan bagiannya dari hasil di atas.

tulh
sumber
1

Pilihan lain adalah sesuatu yang saya baru-baru ini menemukan (diberikan, saya belum menggunakannya, tapi rencana untuk segera): rdbms-subsetter.

Ini sedikit lebih sederhana dan lebih ringan dari Jailer, dengan beberapa fitur bagus:

  • CLI begitu mudah untuk memasang alat yang ada
  • Sumber terbuka
  • Akan mengikuti kunci asing untuk mengambil bagian data yang koheren
    • Jika Anda tidak memiliki kunci asing yang didefinisikan dengan baik, hubungan dapat diberikan melalui file konfigurasi JSON. Dalam kasus saya, saya berencana untuk membuat konfigurasi ini dari skema metadata yang disimpan di tempat lain (terima kasih, Rails: \)
  • Anda dapat menargetkan baris tertentu dan mendapatkan semua catatan terkait (mis. Pelanggan tertentu mengalami masalah, sehingga Anda dapat menarik semuanya untuk membuat data pekerjaan akun mereka dapat diakses secara lokal)
  • Entah dapat mengambil jumlah rekaman konstan per tabel atau mengambil logaritma untuk mendapatkan lebih banyak data dari tabel yang lebih besar tanpa berlebihan.

Perlu disebutkan opsi lain untuk basis data Heroku secara khusus, yang telah saya gunakan banyak (seperti dulu bekerja di sana).

Heroku sebenarnya cukup cepat dalam memunculkan DB snapshotted baru saat menarik log write-ahead terlebih dahulu untuk dipersiapkan, kemudian menghubungkan ke DB utama untuk mengejar ketinggalan, kemudian berhenti mengikutinya. Anda dapat membuat "garpu" ini di seluruh aplikasi untuk menghindari terlalu banyak memengaruhi produksi:

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

Kemudian, Anda dapat mem-boot aplikasi Anda secara lokal menunjuk ke snapshot itu. Saya sering menggunakan ini untuk menjalankan migrasi data atau skema atau men-debug masalah pelanggan.

Dalam perintah di atas, jika Anda memiliki DB yang dapat diakses dengan DATABASE_URLon your-production-app, Anda akan berakhir dengan DB yang dapat diakses dengan PRODUCTION_SNAPSHOT_URL(jika Anda tentukan --as) pada aplikasi yang berbeda bernama some-other-app-to-own-forked-database.

Bo Jeanes
sumber
0

Untuk mendapatkan rangkaian acak, Anda dapat menggunakan LIMIT seperti ini:

SELECT * FROM my_table LIMIT 100

Ini adalah yang termudah dan hanya akan memilih 100 baris pertama yang ditemui PostreSQL. Mungkin 100 yang terakhir dimasukkan atau mungkin 100 yang pertama. Jika Anda membutuhkan sesuatu yang benar-benar acak, lihat jawaban Stackoverflow ini .

Coba Laugstøl
sumber
Terima kasih telah mencoba membantu, tetapi ini tidak menjawab pertanyaan saya.
jottr
Saya tahu bagaimana membatasi pilihan saya. Masalah saya adalah, saya perlu beberapa cara untuk mengkloning db dari heroku dengan subset datanya; Membuang seluruh db seperti yang dijelaskan pada manual herokus bukanlah suatu pilihan.
jottr
1
@elementz - Apakah ada alasan Anda tidak bisa hanya mengulang tabel dan SALINAN (PILIH ... BATAS 100) KE 'nama file' ...? Tidak bisakah kamu COPY TO di Heroku?
rfusca
@ rfusca - Saya tidak tahu COPY TO ada. Saya akan mencoba dan melaporkan kembali.
jottr
3
@ rfusca: menggunakan sederhana LIMITtidak akan berurusan dengan referensi FK. Misalnya: 100 baris dari tabel pesanan mungkin berisi pelanggan yang tidak ada saat mengekspor 100 baris dari tabel pelanggan.
a_horse_with_no_name