Известно, что MySQL таблицы MyISAM хранит в виде трёх файлов: tbl_name.frm - описание структуры таблицы, tbl_name.myd (myData) - данные, хранящиеся в таблице, tbl_name.myi (myIndex) - индексы. Если MySQL сервер остановить, то путём простого копирования этих файлов можно перенести таблицу на другой сервер. Это иногда намного удобнее и быстрее, чем сдампить таблицу на одном сервере и залить дамп на другом.
Вопрос - как проделать этот трюк для таблиц InnoDB? Таблицы там живут в файле (файлах) ibdata*, перенести его можно только целиком?
Ответ
Из коробки InnoDB хранит все таблицы в общем пуле ibdata и описанный в вопросе трюк невозможен. Однако, если MySQL сервер настроен на использование file-per-table tablespaces, для каждой таблицы будет создаваться отдельная пара файлов (вида tbl_name.frm - структура и tbl_name.ibd - даныне и индексы). Помимо описанного трюка, это даёт другие преимущества, вроде быстрого выполнения запросов TRUNCATE TABLE и возможности получить обратно дисковое пространство, занятое таблицей, при её удалении (в случае использования ibdata* дисковое пространство при удалении таблиц не освобождается). Настройка выглядит так (в my.cnf):
[mysqld]
innodb_file_per_table=1
При остановленном MySQL сервере файлы .frm и .ibd можно копировать и переносить, как и в случае MyISAM, а если нужно скопировать таким образом таблицу, не останавливая сервер, нужно прибегнуть к хитрости - сбросить на диск кеш и "выгрузить" таблицу (таблицы), которые хотим скопировать:
FLUSH TABLES table_one, table_two FOR EXPORT;
Теперь файлы .frm и .ibd можно копировать на лету - разумеется, с момента FLUSH до окончания копирования работать с данной таблицей нельзя (но можно с остальными).
"Подключение" перенесённой на другой сервер таблицы InnoDB выглядит так:
Создаём на новом месте в базе с таким же именем (это важно), как у базы, в которой находилась переносящаяся таблица, таблицу с такой же структурой, как переносящаяся (пустую)
Выполняем
ALTER TABLE tbl_name DISCARD TABLESPACE;
Подкладываем скопированные файлы tbl_name.frm и tbl_name.ibd
Выполняем
ALTER TABLE tbl_name IMPORT TABLESPACE;
Вуаля, таблица перенесена!
Перед тем, как впервые воспользоваться этой инструкцией для операций с живыми данными, потренируйтесь на чём-нибудь тестовом, что не жалко испортить. И всегда делайте бекапы!
Комментариев нет:
Отправить комментарий