post sample

Применение утилиты mysqldump для импорта-экспорта данных в MySQL

Утилита командной строки mysqldump предназначена для автоматизации процедур переноса информационных объектов между экземплярами баз данных MySQL. Так же она используется для создания резервных копий баз данных MySQL. В обоих случая используется промежуточный файл *.sql, который образуется при экспорте. В нём содержится скрипт создания и/или наполнения информацией, имеющихся в базе данных таблиц. При импорте этот файл указывает в качестве источника данных для загрузки в другую базу данных или как резервная копия (дамп) для восстановления из неё в текущую базу.

Приведём некоторые примеры команд для экспорта и импорта базы данных:

mysqldump -u имя_пользователя -p -h имя_сервера_БД имя_базы > dump.sql

По приведенной выше команде экспорта скрипт базы сохраняется в файле dump.sql.

Этот же файл используется затем при восстановлении данных (импорта) в качестве резервной копии (дампа). Делается это так:

mysql -u имя_пользователя -p -h имя_сервера_БД имя_базы < dump.sql 

При запуске приведенных выше команд будет запрашиваться пароль пользователя базы данных.

При выполнении импорта-экспорта система предполагает, что данные хранятся в кодировке Windows-1251. Если данные хранились в другой кодировке, то перед восстановлением с помощью текстового редактора в файле с резервной копией (в дампе) необходимо произвести корректировки. Для этого находим строку…

/*!40101 SET NAMES cp1251 */;

 … и меняем на, например, UTF8:

/*!40101 SET NAMES utf8 */

 Утилита mysqldump имеет ряд дополнительных опций:

--add-drop-table — предписывает для каждой таблицы добавить команду DROP TABLE перед командой создания таблиц. Т.е. если в базе, в которую идёт восстановление, уже была такая таблица, то она уничтожается и полностью заменяется на создаваемую из скрипта. 
--add-locks — для ускорения доступа к таблицам предписывает выполнять блокировку таблиц командой LOCK TABLES перед выполнением скрипта и команду UNLOCK TABLE после выполнения каждой из таблиц. 
--quote-names — выполняет обрамления кавычками имён полей и таблиц. В версиях старше 4.1.1 она включена по умолчанию. Следовательно, явно её нужно указывать только для более младших версий.

Если база данных имеет значительный размер, а на вашем хостинге существует ограниченный объем оперативной памяти, что можно попытаться включить оптимизацию расхода памяти с помощью опций --quick и --opt. В противном случае возможны появления сообщений об ошибках:

mysqldump: Out of memory (Needed XXXXX bytes)
mysqldump: Got error: 2008: MySQL client
run out of memory when retrieving data from server

Пример использования опции --opt

mysqldump --opt -u имя_пользователя -p -h имя_сервера_БД --add-drop-table имя_базы > dump.sql 

 Соответственный пример для опции --quick:

mysqldump --quick -u имя_пользователя -p -h имя_сервера_БД --add-drop-table имя_базы > dump.sql 


Для обеспечения совместимости между серверами при использовании дампов рекомендуем использовать ключ max_allowed_packetв вариантах таком:

--set-variable max_allowed_packet=2M

 

Либо таком:

либо

-O max_allowed_packet=2M


Ошибка, которая возникает в процессе импорта вида:

mysqldump: Error 2020:Got packet bigger than 'max_allowed_packet'bytes when dumping table `some_table_name ` at row: 2


означает, что в импортируемых данных имеются элементы, которые невозможно разбить на части до 2 мегабайт каждая.

Это происходит, когда в базе хранятся бинарные данные, представляющие файлы картинок, звуко- или видео-файлы, т.е., когда применён подход не хранить подобную информацию непосредственно в файловой системе. 

Если на целевом сервере установлена версия MySQL 4.0.x, то для  совместимости дампа для такого сервера его надо делать с ключом:

--compatible=mysql40