Ograniczasz liczbę rekordów z mysqldump?

137

Próbuję załadować małą próbkę rekordów z dużej bazy danych do testowej bazy danych.

Jak powiesz mysqldump, aby dał Ci tylko n rekordów z 8 milionów?

Dzięki

Phil
źródło

Odpowiedzi:

212

Jak mówi skaffman, użyj opcji --where :

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

Oczywiście dałoby to pierwszy milion wierszy z każdej tabeli.

Adam Bellaire
źródło
15
Co robi „1” przed limitem?
Phob,
31
@Phob: Opcja --where jest w zasadzie dołączana do zapytania formularza SELECT * from table WHERE , więc w tym przypadku otrzymasz SELECT * from table WHERE 1 limit 1000000. Bez 1 miałbyś nieprawidłowe zapytanie. Określenie 1 dla klauzuli where (ponieważ 1 jest zawsze prawdziwe) po prostu wybiera wszystkie rekordy.
Adam Bellaire,
24
Wow, co za hack. Więc możesz w zasadzie wstrzyknąć sobie SQL w ten sposób.
Phob,
6
Czy to zachowuje integralność wszystkich kluczy obcych? Jeśli nie, czy jest na to sposób?
keithxm23
4
Dzięki! Dodatkowo możesz użyć: mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database aby uzyskać drugą stronę 1 miliona rekordów. Upewnij się, że używasz flagi --no-create-info na stronach innych niż pierwsza, aby tylko zrzucić dane i pominąć tworzenie tabeli .
pfuri
59

Jeśli chcesz pobrać nrekordy z określonej tabeli, możesz zrobić coś takiego:

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

Spowoduje to zrzucenie pierwszych 1000000wierszy z nazwanej tabeli tabledo pliku dump.sql.

Casper André Casse
źródło
9

mysqldump może otrzymać zapytanie SQL do wykonania, z którego pobierze dane do zrzutu. Następnie możesz użyć klauzuli „limit X” w zapytaniu, aby ograniczyć liczbę wierszy.

skaffman
źródło
7

Ponieważ domyślną kolejnością jest ASC, co rzadko jest tym, czego potrzebujesz w tej sytuacji, musisz mieć odpowiedni projekt bazy danych, aby DESC działał po wyjęciu z pudełka. Jeśli wszystkie twoje tabele mają JEDNĄ kolumnę klucza podstawowego o tej samej nazwie (naturalna lub zastępcza), możesz łatwo zrzucić n najnowszych rekordów, używając:

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

Jest to doskonały powód, dla którego powinieneś zawsze nazywać swój identyfikator PK i unikać złożonych PK, nawet w tabelach asocjacyjnych (zamiast tego użyj kluczy zastępczych).

Andreas Bergström
źródło
1
Zrób to (identyfikator nazwy i unikaj złożonych PK), a będziesz musiał zignorować teorię relacyjnych baz danych.
mpoletto
1
Właściwie, jeśli projektujesz swoją bazę danych zgodnie z najlepszymi praktykami relacyjnej bazy danych, definiując PK na podstawie danych i encji, możesz na przykład użyć --option --where = "1 LIMIT 10000". Bez ORDER BY to zadziała, ponieważ MySQL będzie porządkować w sposób naturalny, co jest równoważne stwierdzeniu, że będzie postępować zgodnie z kolejnością indeksów PK. Wtedy wszystkie FK powiązanych tabel będą miały tylko dane, które istnieją w tabeli ich odwołań, ponieważ kolejność będzie taka sama.
mpoletto
Używanie identyfikatorów to prawdziwa plaga wielu programistów. Posiadanie identyfikatorów takich jak PK to to samo, co nie posiadanie PK. Twoja integralność została naruszona, ponieważ w większości przypadków numer automatycznego inkrementacji nie ma nic wspólnego z danymi encji.
mpoletto
@mpoletto --where = "1 LIMIT 10000" wybierze tylko 10000 pierwszych wpisów. Celem mojej odpowiedzi było pokazanie, jak można rozwiązać pobieranie najnowszych wpisów X, co zwykle jest tym, czego chcesz. Nie rozumiem też, co ma wspólnego nazewnictwo z „ignorowaniem teorii relacyjnych baz danych”. Myślę, że nie zrozumiałeś mojej odpowiedzi. Najpopularniejsze ORMy, takie jak EF, Django ORM, itp. Domyślnie używają i zalecają „id” dla kolumn PK, ponieważ nie ma potrzeby podawania nazwy users.user_id zamiast po prostu users.id.
Andreas Bergström
kiedy mówisz, że istnieje „doskonały powód, dla którego powinieneś zawsze nazywać swój identyfikator PK i unikać złożonych PK”, ignorujesz teorię relacyjnych baz danych. Twój argument dotyczący „najpopularniejszych ORMów” jest nieprawidłowy, ponieważ te ORM wymagają do działania tabel z identyfikatorami.
mpoletto