Membatasi jumlah catatan dari mysqldump?

143

Saya mencoba memuat sampel kecil catatan dari database besar ke database uji.

Bagaimana Anda memberi tahu mysqldump untuk hanya memberi Anda n catatan dari 8 juta?

Terima kasih

Phil
sumber

Jawaban:

218

Seperti yang dikatakan skaffman, gunakan opsi --where :

mysqldump --opt --where="1 limit 1000000" database

Tentu saja, itu akan memberi Anda jutaan baris pertama dari setiap tabel.

Adam Bellaire
sumber
15
Apa fungsi "1" sebelum batas?
Phob
31
@Phob: Opsi --where pada dasarnya ditambahkan ke kueri formulir SELECT * from table WHERE , jadi dalam hal ini Anda mendapatkan SELECT * from table WHERE 1 limit 1000000. Tanpa 1, Anda akan mendapatkan kueri yang tidak valid. Menentukan 1 untuk klausa where (karena 1 selalu benar) cukup memilih semua record.
Adam Bellaire
25
Wow, hack yang luar biasa. Jadi pada dasarnya Anda dapat menyuntikkan SQL dengan cara ini.
Phob
7
Apakah ini mempertahankan semua integritas kunci asing? Jika tidak, apakah ada cara untuk melakukannya?
keithxm23
4
Terima kasih! Selain itu, Anda dapat menggunakan: mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database untuk mendapatkan halaman kedua dari 1 juta rekaman. Pastikan untuk menggunakan tanda --no-create-info di halaman selain yang pertama untuk hanya membuang data dan meninggalkan hal-hal buat tabel .
pfuri
61

Jika Anda ingin mendapatkan nrecord dari tabel tertentu, Anda dapat melakukan sesuatu seperti ini:

mysqldump --opt --where="1 limit 1000000" database table > dump.sql

Ini akan membuang 1000000baris pertama dari tabel bernama tableke dalam file dump.sql.

Casper André Casse
sumber
9

mysqldump dapat diberikan kueri SQL untuk dieksekusi, yang akan mengambil data untuk dibuang. Anda kemudian dapat menggunakan klausa "batasi X" dalam kueri Anda untuk membatasi jumlah baris.

skaffman
sumber
8

Karena urutan defaultnya adalah ASC yang jarang Anda inginkan dalam situasi ini, Anda harus memiliki desain database yang tepat agar DESC dapat digunakan. Jika semua tabel Anda memiliki SATU kolom kunci utama dengan nama yang sama (alami atau pengganti), Anda dapat dengan mudah membuang n catatan terbaru menggunakan:

mysqldump --opt --where="1 ORDER BY id DESC limit 1000000" --all-databases > dump.sql

Ini adalah alasan yang tepat mengapa Anda harus selalu memberi nama ID PK Anda dan menghindari PK komposit, bahkan dalam tabel asosiasi (gunakan kunci pengganti sebagai gantinya).

Andreas Bergström
sumber
1
Lakukan ini (nama id dan hindari PK komposit) dan Anda harus mengabaikan teori database relasional.
mpoletto
1
Sebenarnya, jika Anda mendesain database Anda mengikuti praktik terbaik database relasional, mendefinisikan PK Anda berdasarkan data dan entitas, Anda dapat menggunakan --option --where = "1 LIMIT 10000" misalnya. Tanpa ORDER BY, ini akan berfungsi karena MySQL akan memesan secara alami, yang setara dengan mengatakan bahwa ia akan mengikuti urutan indeks PK. Kemudian, semua FK dari tabel terkait hanya akan memiliki data yang ada di tabel referensinya karena urutannya akan sama.
mpoletto
Penggunaan ID adalah wabah yang sebenarnya bagi banyak pengembang. Memiliki ID seperti PK itu sama dengan tidak memiliki PK. Integritas Anda mengalami kesulitan karena, di sebagian besar kasus, angka penambahan otomatis tidak ada hubungannya dengan data entitas.
mpoletto
@mpoletto --where = "1 LIMIT 10000" hanya akan memilih 10.000 entri pertama. Inti dari jawaban saya adalah untuk menunjukkan bagaimana Anda akan menyelesaikan mendapatkan entri X terbaru, yang biasanya sesuai dengan keinginan Anda. Saya juga tidak mengerti apa hubungannya konvensi penamaan dengan "mengabaikan teori database relasional", saya pikir Anda salah paham dengan jawaban saya. ORM yang paling populer seperti EF, Django ORM, dll. Default ke dan menyarankan "id" untuk kolom PK, karena berlebihan untuk mengatakan users.user_id daripada hanya users.id.
Andreas Bergström
ketika Anda mengatakan bahwa ada "alasan sempurna mengapa Anda harus selalu menamai Anda ID PK dan menghindari PK komposit", Anda mengabaikan teori database relasional. Argumen Anda tentang "ORM paling populer" tidak valid karena ORM ini memerlukan tabel dengan ID untuk bekerja.
mpoletto