MySQL / 10. Импорт и экспорт данных

Копирование таблиц и баз данных на другой сервер

Задача
Вы хотите скопировать таблицы или базы данных с одного сервера MySQL на другой.

Решение
Используйте вместе mysqldump и mysql, соединив их каналом (pipe).

Обсуждение
Вывод mysqldump в формате SQL можно использовать для копирования таблиц и баз данных с одного сервера на другой. Предположим, что вы хотите копировать таблицу states базы данных cookbook локального хоста в базу данных cb, работающую на хосте other-host.com. В качестве одного из способов сделать это можно предложить выгрузить вывод в файл:

% mysqldump cookbook states > dump.txt

Затем скопируем dump.txt на other-host.com и запустим там команду импортирования таблицы в базу данных cb сервера:

% mysql cb < dump.txt

Есть и другой способ, не требующий использования промежуточного файла, – отправка вывода mysqldump по сети непосредственно удаленному серверу MySQL. Если с хоста, на котором расположена база данных cookbook, вы можете соединиться с обоими серверами, то выполните такую команду:

% mysqldump cookbook states | mysql -h other-host.com cb

Часть команды, относящаяся к mysqldump, устанавливает соединение с локальным сервером и пишет вывод дампа в канал. Вторая половина команды, относящаяся к mysql, соединяется с удаленным сервером MySQL other-host.com. Она считывает ввод из канала и отправляет каждое предложение серверу other-host.com.

Если вы не можете напрямую соединиться с удаленным сервером, применяя mysql на локальной машине, отправьте вывод дампа в канал, который использует ssh для удаленного вызова mysql на other-host.com:

% mysqldump cookbook states | ssh other-host.com mysql cb

ssh соединяется с сервером other-host.com и запускает на нем mysql. Затем из канала считывается вывод mysqldump и передается удаленному процессу mysql. Использование ssh удобно для отправки дампа по сети машине, MySQL-порт которой блокирован брандмауэром, но соединения с SSH-портом разрешены.

Если у вас нет доступа к ssh, может быть, вы можете использовать rsh. Однако программа rsh более уязвима, так что предпочтительнее применять ssh. Чтобы копировать на другой сервер несколько таблиц, укажите их имена после аргумента базы данных в команде mysqldump. Чтобы копировать всю базу данных, ничего не указывайте после имени базы данных, mysqldump скопирует все таблицы.

Если вы подумываете о том, чтобы вызвать mysqldump с опцией --all-databases для отправки всех баз данных на другой сервер, помните, что вывод будет включать таблицы базы данных mysql, в том числе таблицы привилегий.

Если удаленный сервер работает с другим множеством пользователей, то вы навряд ли захотите заменить таблицы его привилегий!

Статьи по MySQL на эту тему:

Диагностическая утилита для LOAD DATA
Извлечение и перестановка столбцов файлов данных
Импорт XML в MySQL
Использование временных таблиц для преобразования дат
Использование дат с недостающими частями

Вернуться в раздел: MySQL / 10. Импорт и экспорт данных