Как использовать mysqldump для части таблицы?

#mysql #mysqldump

#mysql

Вопрос:

Таким образом, я могу экспортировать только таблицу, подобную этой:

 mysqldump -u root -p db_name table_name > table_name.sql
  

Есть ли какой-либо способ экспортировать только часть таблицы с помощью mysqldump? Например, 0 — 1 000 000 строк, 1 000 000-2 000 000 строк и т.д.

Должен ли я делать это с помощью mysqldump или запроса?

Ответ №1:

 mysqldump -uroot -p db_name table_name --where='id<1000000'
  

или вы можете использовать

 SELECT * INTO OUTFILE 'data_path.sql' from table where id<100000
  

Комментарии:

1. Если вы используете это для инкрементного резервного копирования любого рода, обязательно включите --skip-create-options и, возможно --skip-add-drop-table , просто на всякий случай. В противном случае вы удалите все строки из любой ранее существовавшей таблицы.

2. Вы забыли упомянуть -t и > dump_file_name.dump , поэтому это должно быть похоже; mysqldump -t -uroot -p db_name table_name -w"id<1000000" > file_name.dump

3. первое решение, похоже, не позволяет объединять таблицы и выводить только определенную из них? 2-й работает с объединением таблиц и выгрузкой конкретной таблицы. Но выходные данные не могут быть отправлены обратно в SQL напрямую. В любом случае, как обойти? Спасибо.

4. Если вам нужно использовать кавычки в вашем предложении where, просто используйте двойные кавычки: --where='name="foo"'

Ответ №2:

 mysqldump --skip-triggers --compact --no-create-info --user=USER --password=PASSWORD -B DATABASE --tables MY_TABLE --where='SOME_COLUMN>=xxxx' > out.sql
  

Ответ №3:

Выгруженный файл отличается от файла, который вы используете SQL select. Для 2-го подхода вы не можете просто использовать: mysql database < таблица для сброса таблицы в базу данных.

Ответ №4:

Вопрос актуален, как всегда, большинство людей столкнутся с такого рода вопросами, потому что они страдают от однопоточного дизайна mysql и mysqldump.
Если у вас миллионы или миллиарды строк, экспорт может занять дни (до недель), поэтому в конечном итоге вы экспортируете только части данных.

Быстрый способ решить эту проблему — экспортировать части данных, это работает лучше всего, если у вас есть цифровой ключ (например, идентификатор автоинкремента).
Ниже приведен пример linux / unix о том, как грубо экспортировать таблицу в 20-100 раз быстрее, чем обычно.

 Assumed column "id" is from 1 to 10000000
Assumed cpu has 16 threads
Assumed disk is an ssd or nvme
seq 0 1000 | xargs -n1 -P16 -I{} | mysqldump -h localhost --password=PASSWORD --single-transaction DATABASE TABLE --where "id > {}*10000 AND id < {}*10000 10000" -r output.{}
  

Приведенный выше код будет запускать 16 потоков, что примерно сократит время экспорта до 1/10 от обычного. Он создает 16 файлов, которые также могут быть загружены параллельно, что ускоряет загрузку до 10 раз.
На мощном сервере я использую до 150 параллельных потоков, это зависит от типа используемого диска и процессора.
Этот метод, немного усовершенствованный, может сократить загрузку или экспорт экспорта за 1 неделю до нескольких часов.

При выполнении этого по сети —compress может очень помочь, также инструкции ignore insert помогут с ошибочными индексами mysql, которых невозможно избежать при работе с большими данными. загрузка данных с помощью ‘mysql -f’ дополнительно помогает избежать остановки в таких случаях.

P.S. никогда не используйте опции mysql для добавления индексов и ключей в конце в больших таблицах.

Ответ №5:

В моем случае я выполнил это:

 SELECT * 
  INTO OUTFILE 'C:Documents and SettingsAnton.ZarkovDesktopjoomla_exportdata_AZ.sql'
  FROM `jos_glossary`
 WHERE id>6000
  
  • синтаксической ошибки нет — запрос проходит через.
    1. Результат таков NULL — строки не были записаны. (Я уверен — последний идентификатор 6458)
    2. Если я повторю запрос, n error occurs => #1086 - File 'C:Documents and SettingsAnton.ZarkovDesktopjoomla_exportdata_AZ.sql' already exists
    3. К сожалению, я не могу найти «существующий» файл нигде на диске C. Где это?

Условия таковы: SQL-дамп phpMyAdmin; версия 3.4.5; хост: localhost; версия сервера: 5.5.16; версия PHP: 5.3.8

Комментарии:

1. Это потому, что вам нужно написать path с двойной косой чертой: ‘C:Documents и настройки \Anton. Zarkov\Desktop\joomla_export\data_AZ.sql’

Ответ №6:

 mysqldump -uroot -p db_name table_name --where'id<1000000' > yourdumpname.sql
  

Комментарии:

1. Откат вы меняете на принятый ответ, потому что: документация использует = для параметра where dev.mysql.com/doc/refman/8.0/en/… (то же самое в 5.7 dev.mysql.com/doc/refman/5.7/en /… ). Альтернативами являются --where 'condition' или --w'condition' , но ваша текущая версия --where'condition' предоставляет mysqldump: unkown option '--wherecondition' . Если есть различия в версиях, пожалуйста, укажите условия.

Ответ №7:

Приведенный ниже запрос предназначен для выбора из диапазона идентификаторов, которые вы можете использовать вместо идентификатора date_created или any

 mysqldump --opt --host=dns --user=user_name --password=your_passwd db_name --tables table_name  --where "id > 1 and id < 100 " > /file_name.sql
  

пример: --where="date_created > '2019-01-18' " —> insted of id