Latar Belakang
Saya ingin memberikan subset dari database saya yang diperlukan untuk mereproduksi select
kueri. Tujuan saya adalah membuat alur kerja komputasi saya dapat direproduksi (seperti dalam penelitian yang dapat direproduksi ).
Pertanyaan
Apakah ada cara saya bisa memasukkan pernyataan pilih ini ke dalam skrip yang membuang data yang diminta ke dalam database baru, sehingga database tersebut dapat diinstal pada server mysql baru, dan pernyataan itu akan bekerja dengan database baru. Basis data baru tidak boleh berisi catatan selain dari yang telah digunakan dalam kueri.
Pembaruan: Untuk klarifikasi, saya tidak tertarik dengan hasil csv dump. Apa yang saya harus dapat lakukan adalah membuang subset database sehingga dapat diinstal pada komputer lain, dan kemudian permintaan itu sendiri dapat direproduksi (dan dapat dimodifikasi sehubungan dengan dataset yang sama).
Contoh
Misalnya, analisis saya mungkin meminta sebagian data yang membutuhkan rekaman dari beberapa tabel (dalam contoh ini 3):
select table1.id, table1.level, table2.name, table2.level
from table1 join table2 on table1.id = table2.table1_id
join table3 on table3.id = table2.table3_id
where table3.name in ('fee', 'fi', 'fo', 'fum');
Jawaban:
mysqldump memiliki opsi --where untuk mengeksekusi klausa WHERE untuk tabel yang diberikan.
Meskipun tidak mungkin untuk mysqldump permintaan bergabung, Anda dapat mengekspor baris tertentu dari setiap tabel sehingga setiap baris yang diambil dari setiap tabel akan terlibat dalam bergabung nanti.
Untuk permintaan yang Anda berikan, Anda harus melakukan mysqldump tiga kali:
Pertama, mysqldump semua baris table3 dengan nama dalam ('fee', 'fi', 'fo', 'fum'):
Selanjutnya, mysqldump semua baris table2 yang memiliki nilai table3_id yang cocok dari mysqldump pertama:
Kemudian, mysqldump semua baris table1 yang memiliki nilai table1_id yang cocok dari mysqldump kedua:
Catatan: Karena mysqldumps kedua dan ketiga membutuhkan lebih dari satu tabel, --lock-all-tables harus digunakan .
Buat database baru Anda:
Akhirnya, muat ketiga mysqldumps ke database lain dan coba gabung di sana di database baru.
Di klien mysql, jalankan kueri bergabung Anda
Cobalah !!!
PERINGATAN: Jika tidak diindeks dengan benar, mysqldumps kedua dan ketiga mungkin berlangsung selamanya !!!
Untuk berjaga-jaga, indeks kolom berikut:
Saya akan menganggap id adalah kunci utama dari table3.
sumber
--where
klausa dalam dokumentasi; akan memberi tahu Anda cara kerjanya setelah saya mendapat kesempatan untuk mencobanya.Saya akan mempertimbangkan menggunakan 'outfile' sebagai bagian dari SELECT Anda dan bukan mysqldump untuk menyelesaikan masalah ini. Anda dapat menghasilkan pernyataan SELECT apa pun yang Anda inginkan, kemudian menambahkan "INTO OUTFILE '/path/to/outfile.csv' ..." di akhir dengan konfigurasi yang sesuai untuk output gaya CSV. Maka Anda cukup menggunakan sintaks ' LOAD DATA INFILE ...' untuk memuat data ke lokasi skema baru Anda.
Misalnya, menggunakan SQL Anda:
Ingatlah bahwa Anda akan membutuhkan ruang penyimpanan yang cukup di partisi disk target.
sumber
Load Data Infile
untuk memuat .csv ke dalam basis data baru itu. Sekarang, kueri dapat dieksekusi.Utilitas mysqldump memiliki opsi --tables yang memungkinkan Anda menentukan tabel mana yang akan dibuang. Ini memungkinkan Anda menentukan daftar tabel.
Saya tidak tahu cara yang lebih mudah (otomatis).
sumber
delete from table1 where id not in (.....);
, jika itu adalah cara termudah, selama skrip dapat diotomatisasi, tidak perlu alat khusus itu ada.Apa yang bermanfaat bagi saya adalah sesuatu seperti:
Dari http://krosinski.blogspot.com/2012/12/using-table-join-with-mysqldump.html
sumber
Sudahkah Anda mencoba fungsi penawaran di mysql?
simpan di atas, sebagai query.sql
sumber
Di MySQL:
Di Baris Perintah:
Di server tujuan Anda, setup ~ / .my.cnf
Impor di server tujuan
sumber
saya menulis skrip kecil untuk masalah serupa, ini dia: https://github.com/digitalist/mysql_slice
yaitu Anda memiliki permintaan ini :
Anda mendapatkan dump ini :
sumber