#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
- синтаксической ошибки нет — запрос проходит через.
- Результат таков
NULL
— строки не были записаны. (Я уверен — последний идентификатор 6458) - Если я повторю запрос,
n error occurs => #1086 - File 'C:Documents and SettingsAnton.ZarkovDesktopjoomla_exportdata_AZ.sql' already exists
- К сожалению, я не могу найти «существующий» файл нигде на диске 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