Spec-Zone.ru › MySQL 8.4

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. Дополнительные сведения см. в Разделе «Определение формата строк таблицы».

Импорт таблиц

В этом примере показано, как импортировать обычную неразделенную таблицу, которая находится в табличном пространстве с файлами на таблицу.

  1. На целевом экземпляре создайте таблицу с таким же определением, как у таблицы, которую вы хотите импортировать. (Вы можете получить определение таблицы, используя синтаксис SHOW CREATE TABLE.) Если определение таблицы не совпадает, при попытке импорта операции будет сообщена ошибка несоответствия схемы.

    mysql> USE test;
    mysql> CREATE TABLE t1 (c1 INT) ENGINE=INNODB;
    
  2. На целевом экземпляре удалите табличное пространство таблицы, которую вы только что создали. (Перед импортом необходимо удалить табличное пространство целевой таблицы.)

    mysql> ALTER TABLE t1 DISCARD TABLESPACE;
    
  3. На исходном экземпляре выполните 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 удаляется при освобождении блокировок при закрытии подключения.

  4. Скопируйте файл .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 при хранении».

  5. На исходном экземпляре используйте UNLOCK TABLES для освобождения блокировок, полученных операцией FLUSH TABLES ... FOR EXPORT:

    mysql> USE test;
    mysql> UNLOCK TABLES;
    

    Операция UNLOCK TABLES также удаляет файл .cfg.

  6. На целевом экземпляре импортируйте табличное пространство:

    mysql> USE test;
    mysql> ALTER TABLE t1 IMPORT TABLESPACE;
    
END_OF_DOCUMENT_MARKER ```
Импорт разграниченных таблиц

В данном примере показано, как импортировать разграниченную таблицу, где каждый фрагмент таблицы находится в файловой табличной области данных.

  1. На целевом экземпляре создайте разграниченную таблицу с таким же определением, что и у разграниченной таблицы, которую вы хотите импортировать. (Вы можете получить определение таблицы, используя синтаксис SHOW CREATE TABLE). Если определение таблицы не совпадает, при попытке импорта будет сообщено об ошибке несоответствия схемы.

    mysql> USE test;
    mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 3;
    

    В каталоге /datadir/test есть файл табличной области данных .ibd для каждого из трёх фрагментов.

    mysql> \! ls /path/to/datadir/test/
    t1#p#p0.ibd  t1#p#p1.ibd  t1#p#p2.ibd
    
  2. На целевом экземпляре удалите табличную область данных для разграниченной таблицы. (Перед операцией импорта необходимо удалить табличную область данных получающей таблицы.)

    mysql> ALTER TABLE t1 DISCARD TABLESPACE;
    

    Три файла табличной области данных .ibd разграниченной таблицы удаляются из каталога /datadir/test.

  3. На источнике экземпляра выполните FLUSH TABLES ... FOR EXPORT для приостановки разграниченной таблицы, которую вы хотите импортировать. Когда таблица приостановлена, только операции чтения разрешены для данной таблицы.

    mysql> USE test;
    mysql> FLUSH TABLES t1 FOR EXPORT;
    

    FLUSH TABLES ... FOR EXPORT гарантирует, что изменения в названной таблице сохраняются на диске, чтобы можно было выполнить копирование бинарной таблицы во время работы сервера. При выполнении FLUSH TABLES ... FOR EXPORT, InnoDB генерирует файлы метаданных .cfg в каталоге схемы таблицы для каждого файла табличной области данных таблицы.

    mysql> \! ls /path/to/datadir/test/
    t1#p#p0.ibd  t1#p#p1.ibd  t1#p#p2.ibd
    t1#p#p0.cfg  t1#p#p1.cfg  t1#p#p2.cfg
    

    Файлы .cfg содержат метаданные, используемые для проверки схемы при импорте табличной области данных. FLUSH TABLES ... FOR EXPORT может выполняться только для таблицы, а не для отдельных фрагментов таблицы.

  4. Скопируйте файлы .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 при хранении на диске».

  5. На источнике экземпляра используйте UNLOCK TABLES для освобождения блокировок, полученных FLUSH TABLES ... FOR EXPORT:

    mysql> USE test;
    mysql> UNLOCK TABLES;
    
  6. На целевом экземпляре импортируйте табличную область данных разграниченной таблицы:

    mysql> USE test;
    mysql> ALTER TABLE t1 IMPORT TABLESPACE;
    
Импорт фрагментов таблицы

В этом примере показано, как импортировать отдельные фрагменты таблицы, где каждый фрагмент находится в файле табличной области данных.

В следующем примере импортируются два фрагмента (p2 и p3) четырёхфрагментной таблицы.

  1. На целевом экземпляре создайте разграниченную таблицу с таким же определением, что и у разграниченной таблицы, из которой вы хотите импортировать фрагменты. (Вы можете получить определение таблицы, используя синтаксис SHOW CREATE TABLE). Если определение таблицы не совпадает, при попытке импорта будет сообщено об ошибке несоответствия схемы.

    mysql> USE test;
    mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 4;
    

    В каталоге /datadir/test есть файл табличной области данных .ibd для каждого из четырёх фрагментов.

    mysql> \! ls /path/to/datadir/test/
    t1#p#p0.ibd  t1#p#p1.ibd  t1#p#p2.ibd t1#p#p3.ibd
    
  2. На целевом экземпляре удалите фрагменты, которые вы хотите импортировать с источника экземпляра. (Прежде чем импортировать фрагменты, вы должны удалить соответствующие фрагменты из получающей разграниченной таблицы.)

    mysql> ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;
    

    Файлы табличной области данных .ibd для двух удаленных фрагментов удалены из каталога /datadir/test на целевом экземпляре, оставив следующие файлы:

    mysql> \! ls /path/to/datadir/test/
    t1#p#p0.ibd  t1#p#p1.ibd
    
    Примечание

    При выполнении ALTER TABLE ... DISCARD PARTITION ... TABLESPACE для подфрагментированных таблиц разрешены как имена фрагментов, так и имена подфрагментов. Если указано имя фрагмента, в операции включены подфрагменты этого фрагмента.

  3. На источнике экземпляра выполните FLUSH TABLES ... FOR EXPORT для приостановки разграниченной таблицы. Когда таблица приостановлена, только операции чтения разрешены для данной таблицы.

    mysql> USE test;
    mysql> FLUSH TABLES t1 FOR EXPORT;
    

    FLUSH TABLES ... FOR EXPORT гарантирует, что изменения в названной таблице сохраняются на диске, чтобы можно было выполнить копирование бинарной таблицы во время работы экземпляра. При выполнении FLUSH TABLES ... FOR EXPORT, InnoDB генерирует файл метаданных .cfg для каждого из файлов табличной области данных таблицы в каталоге схемы таблицы.

    mysql> \! ls /path/to/datadir/test/
    t1#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
    

    Файлы .cfg содержат метаданные, используемые для проверки схемы во время импорта. FLUSH TABLES ... FOR EXPORT может выполняться только для таблицы, а не для отдельных фрагментов таблицы.

  4. Скопируйте файлы .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 при хранении на диске».

  5. На источнике экземпляра используйте UNLOCK TABLES для освобождения блокировок, полученных FLUSH TABLES ... FOR EXPORT:

    mysql> USE test;
    mysql> UNLOCK TABLES;
    
  6. На целевом экземпляре импортируйте фрагменты таблицы 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 несоответствия схемы не сообщаются для различий в типе фрагмента или определении фрагмента при импорте разграниченной таблицы. Различия в столбцах сообщаются.

END_OF_DOCUMENT_MARKER
Примечания по использованию
  • За исключением таблиц, содержащих мгновенно добавленные или удаленные столбцы, для импорта таблицы не требуется файл метаданных. Однако проверки метаданных не выполняются при импорте без файла метаданных, и выводится предупреждение, подобное следующему:

    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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/innodb-table-import.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API