MySQLDump kayıt sayısını sınırlamak?


137

Bir test veritabanına büyük bir veritabanından kayıtların küçük bir örnek yüklemeye çalışıyorum.

MySQLdump'tan size sadece 8 milyondan n kayıt vermesini nasıl söylersiniz?

Teşekkürler

Yanıtlar:


212

Skaffman'ın dediği gibi --where seçeneğini kullanın:

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

Tabii ki, bu size her tablodan ilk milyon satırı verecektir.


15
Sınırdan önceki "1" ne yapar?
Phob

31
@Phob: --where seçeneği temel olarak formun bir sorgusuna eklenir SELECT * from table WHERE , bu nedenle bu durumda elde edersiniz SELECT * from table WHERE 1 limit 1000000. 1 olmadan geçersiz bir sorgunuz olur. Where cümlesi için 1 belirtilmesi (1 her zaman doğru olduğundan) tüm kayıtları seçer.
Adam Bellaire

24
Vay, ne hack. Temel olarak SQL kendinizi bu şekilde enjekte edebilirsiniz.
Phob

6
Bu tüm yabancı anahtar bütünlüklerini koruyor mu? Değilse, bunu yapmanın bir yolu var mı?
keithxm23

4
Teşekkürler! Ayrıca, mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database 1 milyon kayıtlık ikinci sayfayı almak için : kullanabilirsiniz . Yalnızca verileri döküp tablo oluşturma öğelerini bırakmak için ilk sayfa dışındaki sayfalarda --no-create-info bayrağını kullandığınızdan emin olun .
pfuri

59

nBelirli bir tablodan kayıt almak istiyorsanız, bunun gibi bir şey yapabilirsiniz:

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

Bu, 1000000adlandırılmış tablodaki ilk satırları tabledosyaya atar dump.sql.


9

mysqldump, yürütmek için bir SQL sorgusu verilebilir ve buradan veri dökümü için veri alır. Daha sonra, satır sayısını kısıtlamak için sorgunuzdaki "limit X" yan tümcesini kullanabilirsiniz.


7

Varsayılan sipariş, bu durumda nadiren istediğiniz şey olan ASC olduğundan, DESC'i kutudan çıkarmak için uygun bir veritabanı tasarımına sahip olmanız gerekir. Tüm tablolarınız aynı ada (doğal veya yedek) sahip BİR birincil anahtar sütununa sahipse, aşağıdakileri kullanarak en son n kaydı kolayca dökebilirsiniz:

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

Bu, ilişkilendirme tablolarında bile PK'nizin kimliğini her zaman adlandırmanız ve bileşik PK'lardan kaçınmanızın mükemmel bir nedenidir (bunun yerine yedek anahtarlar kullanın).


1
Bunu yapın (ad kimliği ve bileşik PK'lardan kaçının) ve ilişkisel veritabanı teorisini göz ardı etmeniz gerekir.
mpoletto

1
Aslında, veritabanınızı ilişkisel veritabanı en iyi uygulamalarını izleyerek tasarlar, PK'larınızı verilere ve varlığa göre tanımlarsanız, örneğin --option --where = "1 LIMIT 10000" kullanabilirsiniz. ORDER BY olmadan, bu çalışır çünkü MySQL, PK'nın dizin sırasını izleyeceğini söylemek için eşdeğer olan doğal bir şekilde sipariş verecektir. Daha sonra, ilgili tabloların tüm FK'leri yalnızca referanslarının tablosunda bulunan verilere sahip olacaktır, çünkü sipariş aynı olacaktır.
mpoletto

Kimliklerin kullanımı birçok geliştiricinin gerçek bir vebasıdır. PK'lara benzer kimliklere sahip olmak PK'lara sahip olmamakla aynıdır. Çoğu durumda otomatik artış sayısının varlık verileriyle ilgisi olmadığı için bütünlüğünüz delinmiştir.
mpoletto

@mpoletto --where = "1 LIMIT 10000" yalnızca 10000 ilk girişi seçer. Cevabımın asıl noktası, en son X girişlerini almayı nasıl çözeceğinizi göstermekti, bu genellikle istediğiniz şeydi. Ayrıca "ilişkisel veritabanı teorisini göz ardı ederek" adlandırma kurallarının ne yaptığını anlamıyorum, sanırım cevabımı yanlış anladınız. EF, Django ORM, vb.Gibi en popüler ORM'ler, yalnızca users.id yerine users.user_id demek gereksiz olduğu için varsayılan olarak ve PK sütunları için "id" değerini önerir.
Andreas Bergström

"PK'nin kimliğini her zaman adlandırmanız ve bileşik PK'lardan kaçınmanız için mükemmel bir neden" olduğunu söylediğinizde, ilişkisel veritabanı teorisini görmezden geliyorsunuz. "En popüler ORM'ler" hakkındaki argümanınız geçerli değil çünkü bu ORM'lerin çalışması için kimlikleri olan tablolar gerekiyor.
mpoletto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.