[mysql] Переносим InnoDB простым копированием файлов

Тестовый стенд: mysql 5.6

По сути эта статья является вольным переводом мануала с официального сайта с некоторыми дополнениями.

И так, будем переносить таблицу test с сервера srv_old на srv_new.

1) Создаём таблицу на новом сервере srv_new по структуре 1 в 1 как и на старом
2) Делаем DISCARD этой таблице на новом сервере srv_new

mysql> ALTER TABLE test DISCARD TABLESPACE;

При этом таблица лочится в X mode. DISCARD TABLESPACE — означает, что будет удалён файл test.ibd, но не всё пространство таблицы. Так же DISCARD подразумевает, что позже, будет сделано IMPORT TABLESPACE с новым test.ibd файлом.

3) На старом готовим таблицу к экспорту (данная команда доступна начиная с версии 5.6.6):

mysql> FLUSH TABLES test FOR EXPORT;

При этом таблица лочится в shared mode (разрешены только SELECT, операции на изменения запрещены) и dirty pages будут сброшены на диск. После выполнения этой команды будет создан файл test.cfg (это бинарный файл который содержит метаданные, используемые для проверки схемы при импорте). Хочу заметить, что наличие данного файла не ОБЯЗАТЕЛЬНО, но весьма ЖЕЛАТЕЛЬНО.
4) Копируем файлы test.ibd, test.cfg на новый сервер srv_new
5) Снимаем локи с таблицы на старом сервере srv_old:

mysql> UNLOCK TABLES;

6) Импортируем TABLESPACE нового *.ibd файла на новом сервере srv_new:

mysql>ALTER TABLE test IMPORT TABLESPACE;

При этом не обеспечивается ограничения внешнего ключа импортируемых данных. Файл test.cfg удаляется

[mysql] Переносим InnoDB простым копированием файлов: 3 комментария

  1. Randall Ramirez

    Базы можно не сливать, достаточно скопировать файлы таблиц, они расположены тут:C:\Progr\OpenServer\userdata\MySQL-5.1.67Ради интереса, можете создать базу в 5.1.67 и скопировать её таким образом в 5.5.29, сюда:C:\Progr\OpenServer\userdata\MySQL-5.5.29для InnoDB не забудьте так же скопировать ib_log0 и ib_log1Всё должно работать. Конфиги править дольше, но не смертельно — сделайте 1 вордовский файл, в который вынесите ваш алгоритм обновления, особо сложные моменты можете заскриншотить туда же. Потом при обновлении просто из этого файла Ctrl C, Ctrl V.А в остальном, я не уверен, что для разработки вам нужна прям самая-самая последняя версия — у меня стоит 4.6.0 (текущая 4.7.6), и полностью все работает, пока что смысла апдейтиться не вижу.

    1. skeletor Автор записи

      Вы о чём вообще? Что это такое «у меня стоит 4.6.0 (текущая 4.7.6)»?

  2. nesnayka

    Спасибо. 120 млн строк за 8 min 7,86 sec. )))
    (не считая того, сколько я искал причину отказа выполняться последнего запроса. 🙂 )
    Перед выполнением ALTER TABLE test IMPORT TABLESPACE нужно «расширить» права. У меня со стандартными правами, которые задает mysql, команда приводила к ошибке: «ERROR 1146 (42S02): Table ‘…’ doesn’t exist»

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *