Экспорт и импорт данных из MySQL через терминал

2021.06.18
В очередной раз экспортируя/импортируя данные через phpMyAdmin столкнулся с долгим ожиданием, которое заставило найти более быстрый вариант - через терминал linux

В очередной раз экспортируя и импортируя данные через phpMyAdmin столкнулся с долгим ожиданием, которое заставило найти более быстрый вариант - через терминал linux.

При импорте часто приходилось видеть что-то типа такого:

Достигнут временной лимит выполнения скрипта. Для завершения импорта, пожалуйста повторно отправьте тот же файл и импорт будет возобновлен.

Экспорт

Для экспорта используется утилита mysqldump, по указанной ссылке можно найти используемые этой утилитой опции.

Для примера экспорт 5кк записей занял примерно 8 секунд, а размер sql файла 700мб (на локальном сервере разработчика).

Пример:

$ mysqldump mydatabase mytable --result-file=/home/user/database.sql

Указание mydatabase является обязательным, а mytable опциональным, если не будет выбрана таблица для экспорта, то экспортируется вся база данныхю Опция --result-file указывает куда нужно сохранить файл экспорта, но можно обойтись без нее просто перенаправив вывод в файл:

$ mysqldump mydatabase > /home/user/mydatabase.sql

Возможно потребуется аутентификация, для этого используем имя пользователя (-u username) и пароль (-p):

$ mysqldump mydatabase -u root -p > /home/user/mydatabase.sql
Enter password: 

Если нужно указать список баз данных для экспорта, то можно использовать опцию --databases:

$ mysqldump --databases mydatabase1 mydatabase2 > /home/user/mydatabase.sql.gz

Часто бывает что нужно получить сжатые дампы, для этого можно использовать gzip:

$ mysqldump mydatabase | gzip > /home/user/mydatabase.sql.gz

Но дампы желательно проверить чтобы убедиться что в них действительно пригодная для восстановления информация, это можно сделать при помощи любого просмотрещика файлов, который на лету умеет распаковывать архивы и показывать содержимое, например mcedit:

Импорт

Заходим на MySQL сервер через терминал:

$ mysql -u user -p

Выбираем базу данных, в которую будет происходить импорт:

$ USE database_name;

Учитывая рекомендации при импорте из MySQL применяем следующее:

$ SET autocommit=0;
$ SET unique_checks=0;
$ SET foreign_key_checks=0;

Указываем sql файл импорта:

$ source path/to/datafile.sql

Далее можно наблюдать вывод процесса импорта прямо в консоль.

Завершаем транзакцию и меняем настройки на первоначальные:

$ COMMIT;
$ SET unique_checks=1;
$ SET foreign_key_checks=1;
В телеграм канале DevOps от первого лица можно оставить комментарий или почитать интересные истории из практики DevOps