Обмеження кількості записів з mysqldump?


137

Я намагаюся завантажити невеликий зразок записів із великої бази даних у тестову базу даних.

Як ви скажете mysqldump, щоб він мав вам лише n записів із 8 мільйонів?

Дякую

Відповіді:


212

Як каже скафман, використовуйте варіант --where

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

Звичайно, це дасть вам перший мільйон рядків з кожної таблиці.


15
Що робить "1" перед лімітом?
Phob

31
@Phob: Параметр --where в основному додається до запиту форми SELECT * from table WHERE , тому в цьому випадку ви отримуєте SELECT * from table WHERE 1 limit 1000000. Без 1 у вас буде недійсний запит. Визначаючи 1 для пункту де (оскільки 1 завжди відповідає дійсності), просто вибирається всі записи.
Адам Беллер

24
Ух, який хак. Таким чином, ви можете в основному SQL вводити себе таким чином.
Phob

6
Чи підтримує це всі закордонні інтереси? Якщо ні, чи є спосіб це зробити?
keithxm23

4
Дякую! Крім того, ви можете використовувати: mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database для отримання другої сторінки на 1 мільйон записів. Не забудьте використовувати прапор --no-create-info на інших сторінках, крім перших, щоб скинути дані та залишити дані таблиці таблиць .
pfuri

59

Якщо ви хочете отримати nзаписи з певної таблиці, ви можете зробити щось подібне:

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

Це скине перші 1000000рядки з таблиці, названої tableу файл dump.sql.


9

mysqldump може бути заданий SQL-запит для виконання, з якого він буде брати дані для дампа. Потім ви можете використовувати пункт "обмеження X" у вашому запиті, щоб обмежити кількість рядків.


7

Оскільки замовленням за замовчуванням є ASC, який рідко є бажаним у цій ситуації, вам потрібно мати належну конструкцію бази даних, щоб DESC працював з коробки. Якщо у всіх ваших таблицях є один стовпець первинного ключа з тим самим іменем (природним або сурогатним), ви можете легко скинути останні п яті записи, використовуючи:

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

Це ідеальна причина, чому ви завжди повинні називати ідентифікатор ПК і уникати складених ПК, навіть у таблицях асоціацій (замість цього використовуйте сурогатні ключі).


1
Зробіть це (ідентифікатор імені та уникайте складених ПК), і вам потрібно буде ігнорувати теорію реляційних баз даних.
mpoletto

1
Насправді, якщо ви розробляєте свою базу даних відповідно до кращих практик реляційної бази даних, визначаючи ПК у відповідності з даними та сутністю, ви можете, наприклад, використовувати --option --where = "1 ЛІМІТ 10000". Без ORDER BY це буде спрацьовувати, оскільки MySQL замовлятиме природним чином, що еквівалентно сказати, що він буде керуватися порядком індексу PK. Тоді всі FK пов'язаних таблиць матимуть лише ті дані, які існують у їхній довідковій таблиці, оскільки порядок буде однаковим.
mpoletto

Використання ідентифікаторів - справжня чума багатьох розробників. Ідентифікатор, подібний до ПК, - це те саме, що не має ПК. Ваша цілісність перейшла в дірку, оскільки в більшості випадків номер автоматичного збільшення не має нічого спільного з даними сутності.
mpoletto

@mpoletto --where = "1 ЛІМІТ 10000" вибере лише 10000 перших записів. Вся суть моєї відповіді полягала в тому, щоб показати, як ви вирішите отримати найновіші записи X, що зазвичай ви хочете. Я також не розумію, що стосується конвенцій про іменування з "ігноруванням теорії реляційних баз даних", я думаю, ви неправильно зрозуміли мою відповідь. Більшість популярних ORM, таких як EF, Django ORM і т. Д. За замовчуванням, і радять "id" для PK-стовпців, оскільки виправдано сказати users.user_id замість просто users.id.
Andreas Bergström

коли ви говорите, що є "ідеальна причина, чому ви завжди повинні називати ідентифікатор ПК і уникати складених ПК", ви ігноруєте теорію реляційних баз даних. Ваш аргумент про "найпопулярніші ORM" не вірно, тому що цим ORM потрібні таблиці з ідентифікаторами для роботи.
mpoletto
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.