17.6.1.3 Импорт таблиц InnoDB
В этом разделе описывается, как импортировать таблицы с помощью функции Переносимые табличные пространства, которая позволяет импортировать таблицы, разделяемые таблицы или отдельные разделы таблиц, которые находятся в табличных пространствах с файлами на таблицу. Существует множество причин, по которым вы можете захотеть импортировать таблицы:
Для выполнения отчетов на экземпляре MySQL-сервера, не являющемся производственным, чтобы избежать дополнительной нагрузки на производственный сервер.
Для копирования данных на новый сервер реплики.
Для восстановления таблицы из файла резервной копии табличного пространства.
В качестве более быстрого способа перемещения данных, чем импорт файла дампов, который требует повторного вставки данных и перестроения индексов.
Для перемещения данных на сервер со средствами хранения, которые лучше подходят для ваших потребностей в хранении. Например, вы можете переместить загруженные таблицы на устройство SSD или большие таблицы на устройство HDD с высокой емкостью.
Функция Переносимые табличные пространства описана в следующих разделах этого раздела:
Предварительные условия
Переменная
innodb_file_per_tableдолжна быть включена, что по умолчанию и есть.Размер страницы табличного пространства должен совпадать с размером страницы целевого экземпляра MySQL-сервера.
InnoDBразмер страницы определяется переменнойinnodb_page_size, которая настраивается при инициализации экземпляра MySQL-сервера.Если таблица имеет внешнее ключевое отношение,
foreign_key_checksнеобходимо отключить перед выполнениемDISCARD TABLESPACE. Кроме того, вы должны экспортировать все таблицы, связанные с внешними ключами, в один и тот же логический момент времени, так какALTER TABLE ... IMPORT TABLESPACEне применяет ограничения внешнего ключа к импортированным данным. Для этого остановите обновление связанных таблиц, подтвердите все транзакции, получите совместные блокировки на таблицах и выполните операции экспорта.При импорте таблицы из другого экземпляра MySQL-сервера оба экземпляра MySQL-сервера должны иметь статус общей доступности (GA) и должны быть одной версии. В противном случае таблица должна быть создана в том же экземпляре MySQL-сервера, в который она импортируется.
Если таблица была создана во внешнем каталоге, указав ключевое слово
DATA DIRECTORYв инструкцииCREATE TABLE, таблица, которую вы заменяете на целевом экземпляре, должна быть определена с тем же ключевым словомDATA DIRECTORY. Ошибка несоответствия схемы сообщается, если ключевые слова не совпадают. Чтобы определить, была ли исходная таблица определена с ключевым словомDATA DIRECTORY, используйтеSHOW CREATE TABLEдля просмотра определения таблицы. Сведения об использовании ключевого словаDATA DIRECTORYсм. в Разделе 17.6.1.2, «Создание таблиц внешне».Если опция
ROW_FORMATне определена явно в определении таблицы или используетсяROW_FORMAT=DEFAULT, значениеinnodb_default_row_formatдолжно быть одинаковым на исходном и целевом экземплярах. В противном случае, при попытке импорта операции будет сообщена ошибка несоответствия схемы. ИспользуйтеSHOW CREATE TABLEдля проверки определения таблицы. ИспользуйтеSHOW VARIABLESдля проверки значенияinnodb_default_row_format. Дополнительные сведения см. в Разделе «Определение формата строк таблицы».
Импорт таблиц
В этом примере показано, как импортировать обычную неразделенную таблицу, которая находится в табличном пространстве с файлами на таблицу.
-
На целевом экземпляре создайте таблицу с таким же определением, как у таблицы, которую вы хотите импортировать. (Вы можете получить определение таблицы, используя синтаксис
SHOW CREATE TABLE.) Если определение таблицы не совпадает, при попытке импорта операции будет сообщена ошибка несоответствия схемы.mysql> USE test; mysql> CREATE TABLE t1 (c1 INT) ENGINE=INNODB;
-
На целевом экземпляре удалите табличное пространство таблицы, которую вы только что создали. (Перед импортом необходимо удалить табличное пространство целевой таблицы.)
mysql> ALTER TABLE t1 DISCARD TABLESPACE;
-
На исходном экземпляре выполните
FLUSH TABLES ... FOR EXPORTдля заморозки таблицы, которую вы хотите импортировать. Когда таблица заморожена, только операции чтения без записи разрешены для таблицы.mysql> USE test; mysql> FLUSH TABLES t1 FOR EXPORT;
FLUSH TABLES ... FOR EXPORTгарантирует, что изменения в указанной таблице сохраняются на диске, чтобы можно было выполнить двоичную копию таблицы во время работы сервера. Когда выполняетсяFLUSH TABLES ... FOR EXPORT,InnoDBгенерирует файл метаданных.cfgв каталоге схемы таблицы. Файл.cfgсодержит метаданные, которые используются для проверки схемы во время импорта.ПримечаниеСоединение, выполняющее
FLUSH TABLES ... FOR EXPORT, должно оставаться открытым во время выполнения операции; в противном случае файл.cfgудаляется при освобождении блокировок при закрытии подключения. -
Скопируйте файл
.ibdи файл метаданных.cfgс исходного экземпляра на целевой экземпляр. Например:$> scp
/path/to/datadir/test/t1.{ibd,cfg} destination-server:/path/to/datadir/testФайл
.ibdи файл.cfgдолжны быть скопированы до освобождения совместных блокировок, как описано в следующем шаге.ПримечаниеЕсли вы импортируете таблицу из зашифрованного табличного пространства,
InnoDBгенерирует файл.cfpв дополнение к файлу метаданных.cfg. Файл.cfpнеобходимо скопировать на целевой экземпляр вместе с файлом.cfg. Файл.cfpсодержит ключ передачи и зашифрованный ключ табличного пространства. При импортеInnoDBиспользует ключ передачи для расшифровки ключа табличного пространства. Дополнительные сведения см. в Разделе 17.13, «Шифрование данных InnoDB при хранении». -
На исходном экземпляре используйте
UNLOCK TABLESдля освобождения блокировок, полученных операциейFLUSH TABLES ... FOR EXPORT:mysql> USE test; mysql> UNLOCK TABLES;
Операция
UNLOCK TABLESтакже удаляет файл.cfg. -
На целевом экземпляре импортируйте табличное пространство:
mysql> USE test; mysql> ALTER TABLE t1 IMPORT TABLESPACE;
Импорт разграниченных таблиц
В данном примере показано, как импортировать разграниченную таблицу, где каждый фрагмент таблицы находится в файловой табличной области данных.
-
На целевом экземпляре создайте разграниченную таблицу с таким же определением, что и у разграниченной таблицы, которую вы хотите импортировать. (Вы можете получить определение таблицы, используя синтаксис
SHOW CREATE TABLE). Если определение таблицы не совпадает, при попытке импорта будет сообщено об ошибке несоответствия схемы.mysql>
USE test;mysql>CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 3;В каталоге
/есть файл табличной области данныхdatadir/test.ibdдля каждого из трёх фрагментов.mysql>
\! lst1#p#p0.ibd t1#p#p1.ibd t1#p#p2.ibd/path/to/datadir/test/ -
На целевом экземпляре удалите табличную область данных для разграниченной таблицы. (Перед операцией импорта необходимо удалить табличную область данных получающей таблицы.)
mysql>
ALTER TABLE t1 DISCARD TABLESPACE;Три файла табличной области данных
.ibdразграниченной таблицы удаляются из каталога/.datadir/test -
На источнике экземпляра выполните
FLUSH TABLES ... FOR EXPORTдля приостановки разграниченной таблицы, которую вы хотите импортировать. Когда таблица приостановлена, только операции чтения разрешены для данной таблицы.mysql>
USE test;mysql>FLUSH TABLES t1 FOR EXPORT;FLUSH TABLES ... FOR EXPORTгарантирует, что изменения в названной таблице сохраняются на диске, чтобы можно было выполнить копирование бинарной таблицы во время работы сервера. При выполненииFLUSH TABLES ... FOR EXPORT,InnoDBгенерирует файлы метаданных.cfgв каталоге схемы таблицы для каждого файла табличной области данных таблицы.mysql>
\! lst1#p#p0.ibd t1#p#p1.ibd t1#p#p2.ibd t1#p#p0.cfg t1#p#p1.cfg t1#p#p2.cfg/path/to/datadir/test/Файлы
.cfgсодержат метаданные, используемые для проверки схемы при импорте табличной области данных.FLUSH TABLES ... FOR EXPORTможет выполняться только для таблицы, а не для отдельных фрагментов таблицы. -
Скопируйте файлы
.ibdи.cfgиз каталога схемы источника экземпляра в каталог схемы целевого экземпляра. Например:$>
scp/path/to/datadir/test/t1*.{ibd,cfg} destination-server:/path/to/datadir/testФайлы
.ibdи.cfgдолжны быть скопированы перед освобождением общих блокировок, как описано в следующем шаге.ПримечаниеЕсли вы импортируете таблицу из зашифрованной табличной области данных,
InnoDBгенерирует файлы.cfpв дополнение к файлам метаданных.cfg. Файлы.cfpдолжны быть скопированы на целевой экземпляр вместе с файлами.cfg. Файлы.cfpсодержат ключ передачи и ключ зашифрованной табличной области данных. При импортеInnoDBиспользует ключ передачи для расшифровки ключа табличной области данных. Для получения дополнительной информации см. Раздел 17.13, «Шифрование данных InnoDB при хранении на диске». -
На источнике экземпляра используйте
UNLOCK TABLESдля освобождения блокировок, полученныхFLUSH TABLES ... FOR EXPORT:mysql>
USE test;mysql>UNLOCK TABLES; -
На целевом экземпляре импортируйте табличную область данных разграниченной таблицы:
mysql>
USE test;mysql>ALTER TABLE t1 IMPORT TABLESPACE;
Импорт фрагментов таблицы
В этом примере показано, как импортировать отдельные фрагменты таблицы, где каждый фрагмент находится в файле табличной области данных.
В следующем примере импортируются два фрагмента (p2 и p3) четырёхфрагментной таблицы.
-
На целевом экземпляре создайте разграниченную таблицу с таким же определением, что и у разграниченной таблицы, из которой вы хотите импортировать фрагменты. (Вы можете получить определение таблицы, используя синтаксис
SHOW CREATE TABLE). Если определение таблицы не совпадает, при попытке импорта будет сообщено об ошибке несоответствия схемы.mysql>
USE test;mysql>CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 4;В каталоге
/есть файл табличной области данныхdatadir/test.ibdдля каждого из четырёх фрагментов.mysql>
\! lst1#p#p0.ibd t1#p#p1.ibd t1#p#p2.ibd t1#p#p3.ibd/path/to/datadir/test/ -
На целевом экземпляре удалите фрагменты, которые вы хотите импортировать с источника экземпляра. (Прежде чем импортировать фрагменты, вы должны удалить соответствующие фрагменты из получающей разграниченной таблицы.)
mysql>
ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;Файлы табличной области данных
.ibdдля двух удаленных фрагментов удалены из каталога/на целевом экземпляре, оставив следующие файлы:datadir/testmysql>
\! lst1#p#p0.ibd t1#p#p1.ibd/path/to/datadir/test/ПримечаниеПри выполнении
ALTER TABLE ... DISCARD PARTITION ... TABLESPACEдля подфрагментированных таблиц разрешены как имена фрагментов, так и имена подфрагментов. Если указано имя фрагмента, в операции включены подфрагменты этого фрагмента. -
На источнике экземпляра выполните
FLUSH TABLES ... FOR EXPORTдля приостановки разграниченной таблицы. Когда таблица приостановлена, только операции чтения разрешены для данной таблицы.mysql>
USE test;mysql>FLUSH TABLES t1 FOR EXPORT;FLUSH TABLES ... FOR EXPORTгарантирует, что изменения в названной таблице сохраняются на диске, чтобы можно было выполнить копирование бинарной таблицы во время работы экземпляра. При выполненииFLUSH TABLES ... FOR EXPORT,InnoDBгенерирует файл метаданных.cfgдля каждого из файлов табличной области данных таблицы в каталоге схемы таблицы.mysql>
\! lst1#p#p0.ibd t1#p#p1.ibd t1#p#p2.ibd t1#p#p3.ibd t1#p#p0.cfg t1#p#p1.cfg t1#p#p2.cfg t1#p#p3.cfg/path/to/datadir/test/Файлы
.cfgсодержат метаданные, используемые для проверки схемы во время импорта.FLUSH TABLES ... FOR EXPORTможет выполняться только для таблицы, а не для отдельных фрагментов таблицы. -
Скопируйте файлы
.ibdи.cfgдля фрагментаp2и фрагментаp3из каталога схемы источника экземпляра в каталог схемы целевого экземпляра.$>
scp t1#p#p2.ibd t1#p#p2.cfg t1#p#p3.ibd t1#p#p3.cfg destination-server:/path/to/datadir/testФайлы
.ibdи.cfgдолжны быть скопированы перед освобождением общих блокировок, как описано в следующем шаге.ПримечаниеЕсли вы импортируете фрагменты из зашифрованной табличной области данных,
InnoDBгенерирует файлы.cfpв дополнение к файлам метаданных.cfg. Файлы.cfpдолжны быть скопированы на целевой экземпляр вместе с файлами.cfg. Файлы.cfpсодержат ключ передачи и ключ зашифрованной табличной области данных. При импортеInnoDBиспользует ключ передачи для расшифровки ключа табличной области данных. Для получения дополнительной информации см. Раздел 17.13, «Шифрование данных InnoDB при хранении на диске». -
На источнике экземпляра используйте
UNLOCK TABLESдля освобождения блокировок, полученныхFLUSH TABLES ... FOR EXPORT:mysql>
USE test;mysql>UNLOCK TABLES; -
На целевом экземпляре импортируйте фрагменты таблицы
p2иp3:mysql>
USE test;mysql>ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;ПримечаниеПри выполнении
ALTER TABLE ... IMPORT PARTITION ... TABLESPACEдля подфрагментированных таблиц разрешены как имена фрагментов, так и имена подфрагментов. Если указано имя фрагмента, в операции включены подфрагменты этого фрагмента.
Ограничения
Функция Переносимые табличные области данных поддерживается только для таблиц, находящихся в файловых табличных областях данных. Она не поддерживается для таблиц, находящихся в системной табличной области данных или общих табличных областях данных. Таблицы в общих табличных областях данных не могут быть приостановлены.
FLUSH TABLES ... FOR EXPORTне поддерживается для таблиц с полнотекстовым индексом, так как вспомогательные таблицы поиска по полному тексту не могут быть выгружены. После импорта таблицы с полнотекстовым индексом выполнитеOPTIMIZE TABLEдля перестроения индексовFULLTEXT. В качестве альтернативы, удалите индексыFULLTEXTперед операцией экспорта и создайте их снова после импорта таблицы на целевом экземпляре.Из-за ограничения файла метаданных
.cfgнесоответствия схемы не сообщаются для различий в типе фрагмента или определении фрагмента при импорте разграниченной таблицы. Различия в столбцах сообщаются.
Примечания по использованию
-
За исключением таблиц, содержащих мгновенно добавленные или удаленные столбцы, для импорта таблицы не требуется файл метаданных. Однако проверки метаданных не выполняются при импорте без файла метаданных, и выводится предупреждение, подобное следующему:
Message: InnoDB: IO Read error: (2, No such file or directory) Error opening '.\ test\t.cfg', will attempt to import without schema verification 1 row in set (0.00 sec)
Импорт таблицы без файла метаданных следует рассматривать только в том случае, если не ожидается несоответствий схем и таблица не содержит мгновенно добавленных или удаленных столбцов. Возможность импорта без файла метаданных может быть полезна в сценариях восстановления после сбоя, когда метаданные недоступны.
Попытка импорта таблицы со столбцами, добавленными или удаленными с помощью
ALGORITHM=INSTANTбез использования файла метаданных может привести к неопределенному поведению. -
В Windows
InnoDBхранит имена баз данных, табличных пространств и таблиц в нижнем регистре. Чтобы избежать проблем с импортом на системах с регистрозависимой кодировкой, таких как Linux и Unix, создавайте все базы данных, табличные пространства и таблицы с использованием имён в нижнем регистре. Удобным способом гарантировать создание имён в нижнем регистре является установка значенияlower_case_table_namesв 1 перед инициализацией сервера. (Запрещено запускать сервер с параметромlower_case_table_names, отличающимся от значения, используемого при инициализации сервера.)[mysqld] lower_case_table_names=1
При выполнении команд
ALTER TABLE ... DISCARD PARTITION ... TABLESPACEиALTER TABLE ... IMPORT PARTITION ... TABLESPACEнад подразделёнными таблицами допускаются имена как самих разделов, так и подразделов. При указании имени раздела в операцию включаются все подразделы этого раздела.
Внутреннее устройство
Следующая информация описывает внутреннее устройство и сообщения, записываемые в лог ошибок во время процедуры импорта таблицы.
При выполнении ALTER TABLE
... DISCARD TABLESPACE на целевом экземпляре:
Таблица блокируется в режиме X.
Табличное пространство отделяется от таблицы.
При выполнении FLUSH
TABLES ... FOR EXPORT на исходном экземпляре:
Таблица, подлежащая очистке для экспорта, блокируется в режиме совместного доступа.
Поток координатора очистки останавливается.
Необработанные страницы синхронизируются на диск.
Метаданные таблицы записываются в двоичный файл
.cfg.
Ожидаемые сообщения в логе ошибок для данной операции:
[Note] InnoDB: Sync to disk of '"test"."t1"' started.
[Note] InnoDB: Stopping purge
[Note] InnoDB: Writing table metadata to './test/t1.cfg'
[Note] InnoDB: Table '"test"."t1"' flushed to disk
При выполнении UNLOCK
TABLES на исходном экземпляре:
Двоичный файл
.cfgудаляется.Блокировка совместного доступа к таблице или таблицам, подлежащим импорту, снимается, и возобновляется работа потока координатора очистки.
Ожидаемые сообщения в логе ошибок для данной операции:
[Note] InnoDB: Deleting the meta-data file './test/t1.cfg'
[Note] InnoDB: Resuming purge
При выполнении ALTER TABLE
... IMPORT TABLESPACE на целевом экземпляре алгоритм импорта выполняет следующие операции для каждого импортируемого табличного пространства:
Каждая страница табличного пространства проверяется на наличие повреждений.
Идентификатор пространства и номера последовательностей логов (LSNs) на каждой странице обновляются.
Флаги проверяются и LSN обновляется для заголовочной страницы.
Страницы B-дерева обновляются.
Состояние страницы устанавливается в «грязное», чтобы она была записана на диск.
Ожидаемые сообщения в логе ошибок для данной операции:
[Note] InnoDB: Importing tablespace for table 'test/t1' that was exported
from host 'host_name'
[Note] InnoDB: Phase I - Update all pages
[Note] InnoDB: Sync to disk
[Note] InnoDB: Sync to disk - done!
[Note] InnoDB: Phase III - Flush changes to disk
[Note] InnoDB: Phase IV - Flush complete Вы также можете получить предупреждение о том, что табличное пространство отброшено (если вы отбросили табличное пространство для целевой таблицы), а также сообщение о том, что статистика не может быть рассчитана из-за отсутствия файла .ibd:
[Warning] InnoDB: Table "test"."t1" tablespace is set as discarded.
7f34d9a37700 InnoDB: cannot calculate statistics for table
"test"."t1" because the .ibd file is missing. For help, please refer to
http://dev.mysql.com/doc/refman/en/innodb-troubleshooting.html
© 2025 Oracle
Licensed under the GPLv2 License.