Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Перенос InnoDB таблиц как файлов

#mysql #innodb


Известно, что MySQL таблицы MyISAM хранит в виде трёх файлов: tbl_name.frm - описание
структуры таблицы, tbl_name.myd (myData) - данные, хранящиеся в таблице, tbl_name.myi
(myIndex) - индексы. Если MySQL сервер остановить, то путём простого копирования этих
файлов можно перенести таблицу на другой сервер. Это иногда намного удобнее и быстрее,
чем сдампить таблицу на одном сервере и залить дамп на другом.

Вопрос - как проделать этот трюк для таблиц InnoDB? Таблицы там живут в файле (файлах)
ibdata*, перенести его можно только целиком?
    


Ответы

Ответ 1



Из коробки 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; Вуаля, таблица перенесена! Перед тем, как впервые воспользоваться этой инструкцией для операций с живыми данными, потренируйтесь на чём-нибудь тестовом, что не жалко испортить. И всегда делайте бекапы!

Ответ 2



Ок, по базам: если нужен InnoDB - то: 1. На источнике сменить тип на MyISAM 2. Остановить сервер 3. Скопировать 4. На приемнике сделать тип InnoDB 5. На исходнике вернуть InnoDB 6. Запустить сервер на исходнике

Комментариев нет:

Отправить комментарий