Spec-Zone.ru › MySQL 8.4

15.1.1 Поддержка атомарных операторов языка определения данных (DDL)

MySQL 8.4 поддерживает атомарные операторы языка определения данных (DDL). Эта функция называется атомарным DDL. Атомарный оператор DDL объединяет обновления словаря данных, операции движка хранения и запись в бинарный журнал, связанные с операцией DDL, в одну атомарную операцию. Операция либо завершается успешно, при этом соответствующие изменения сохраняются в словаре данных, движке хранения и бинарном журнале, либо отменяется, даже если сервер завершит работу во время выполнения операции.

Примечание

Атомарный DDL не является транзакционным DDL. Операторы DDL, атомарные или нет, неявно завершают любую активную транзакцию в текущей сессии, как если бы вы выполнили COMMIT перед выполнением оператора. Это означает, что операторы DDL не могут быть выполнены внутри другой транзакции, внутри операторов управления транзакциями, таких как START TRANSACTION ... COMMIT, или объединены с другими операторами в одной транзакции.

Атомарный DDL становится возможным благодаря словарю данных MySQL, который предоставляет централизованное, транзакционное хранилище метаданных.

Функция атомарного DDL описывается в следующих разделах данного раздела:

  • Поддерживаемые операторы DDL

  • Характеристики атомарного DDL

  • Поведение операторов DDL

  • Поддержка движков хранения

  • Просмотр журналов DDL

Поддерживаемые операторы DDL

Функция атомарного DDL поддерживает операторы DDL, относящиеся как к таблицам, так и к другим объектам. Операции DDL, связанные с таблицами, требуют поддержки движка хранения, в то время как операции DDL, не связанные с таблицами, не требуют этого. В настоящее время только движок хранения InnoDB поддерживает атомарный DDL.

  • Поддерживаемые операторы DDL, относящиеся к таблицам, включают CREATE, ALTER, и DROP для баз данных, табличных пространств, таблиц и индексов, а также оператор TRUNCATE TABLE.

  • Поддерживаемые операторы DDL, не относящиеся к таблицам, включают:

    • CREATE и DROP, а также, применимо, ALTER для хранимых процедур, триггеров, представлений и загружаемых функций.

    • Операторы управления учетными записями: CREATE, ALTER, DROP, и, применимо, RENAME для пользователей и ролей, а также GRANT и REVOKE операторы.

Следующие операторы не поддерживаются функцией атомарного DDL:

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

  • INSTALL PLUGIN и UNINSTALL PLUGIN операторы.

  • INSTALL COMPONENT и UNINSTALL COMPONENT операторы.

  • CREATE SERVER, ALTER SERVER и DROP SERVER операторы.

Характеристики атомарного DDL

Характеристики атомарных операторов DDL включают следующее:

  • Обновления метаданных, записи в бинарный журнал и операции с движком хранения, где применимо, объединяются в одну атомарную операцию.

  • В процессе выполнения операции DDL не происходит промежуточных фиксаций на уровне SQL.

  • Где применимо:

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

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

    • Движок хранения поддерживает восстановление и отмену операций DDL, что выполняется на этапе Post-DDL операции DDL.

  • Видимое поведение операций DDL является атомарным.

Поведение операторов DDL

В этом разделе описываются некоторые важные аспекты поведения операторов DDL при использовании движка хранения, поддерживающего атомарные операции DDL, например, InnoDB.

  • Операции DROP TABLE полностью атомарны, если все именованные таблицы используют движок хранения, поддерживающий атомарные операции DDL. Оператор либо успешно удаляет все таблицы, либо откатятся.

    DROP TABLE завершится ошибкой, если именованная таблица не существует, и никаких изменений не будет внесено, независимо от движка хранения.

  • Оператор DROP DATABASE атомарный, если все таблицы используют движок хранения, поддерживающий атомарные операции DDL. Оператор либо успешно удаляет все объекты, либо откатятся. Следует учитывать, что удаление каталога базы данных из файловой системы происходит последним и не является частью атомарной операции; таким образом, если удаление каталога базы данных завершится ошибкой из-за ошибки файловой системы или остановки сервера, транзакция DROP DATABASE не будет отменена.

  • Для таблиц, которые не используют движок хранения, поддерживающий атомарные операции DDL, удаление таблиц происходит вне атомарной транзакции DROP TABLE или DROP DATABASE. Такие удаления таблиц записываются в двоичный журнал по отдельности, что ограничивает расхождение между движком хранения, словарем данных и двоичным журналом до одной таблицы в случае прерванной операции DROP TABLE или DROP DATABASE. При операциях удаления нескольких таблиц все таблицы, не использующие движок хранения, поддерживающий атомарные операции DDL, удаляются до таблиц, которые это делают.

  • Операции CREATE TABLE, ALTER TABLE, RENAME TABLE, TRUNCATE TABLE, CREATE TABLESPACE и DROP TABLESPACE для таблиц, использующих движок хранения, поддерживающий атомарные операции DDL, либо полностью завершаются, либо откатятся, если сервер остановится во время их выполнения. Операции RENAME TABLE атомарны только если все именованные таблицы используют движок хранения, поддерживающий атомарные операции DDL.

  • Для движков хранения, поддерживающих атомарные операции DDL, оператор CREATE TABLE ... SELECT записывается как одна транзакция в двоичный журнал при использовании репликации на основе строк.

    В движках хранения, поддерживающих как атомарные операции DDL, так и внешние ключи, создание внешних ключей запрещено в операторах CREATE TABLE ... SELECT при использовании репликации на основе строк. Внешние ключи можно добавить позже с помощью оператора ALTER TABLE.

    При применении CREATE TABLE ... SELECT как атомарной операции, на таблице удерживается блокировка метаданных во время вставки данных, что предотвращает одновременный доступ к таблице на время операции.

  • Оператор DROP VIEW завершается ошибкой, если именованный представление не существует, и никаких изменений не вносится.

  • Операторы управления учетными записями либо выполняется успешно для всех именованных пользователей, либо откатятся и не произведут никакого действия, если произойдет ошибка.

Поддержка движков хранения

В настоящее время только движок хранения InnoDB поддерживает атомарные операции DDL. Движки хранения, не поддерживающие атомарные операции DDL, освобождаются от атомарности DDL. Операции DDL, связанные с исключенными движками хранения, по-прежнему могут вносить несоответствия, которые могут возникнуть при прерывании операций или их частичном завершении.

Для поддержки отката и повтора операций DDL, InnoDB записывает журналы DDL в таблицу mysql.innodb_ddl_log, которая является скрытой таблицей словаря данных, расположенной в пространстве имен словаря данных mysql.ibd.

Чтобы просмотреть журналы DDL, записываемые в таблицу mysql.innodb_ddl_log во время операции DDL, включите опцию конфигурации innodb_print_ddl_logs. Более подробную информацию можно найти в разделе Просмотр журналов DDL.

Примечание

Журналы повтора изменений в таблице mysql.innodb_ddl_log записываются на диск немедленно независимо от настройки innodb_flush_log_at_trx_commit. Немедленное сохранение журналов повтора предотвращает ситуации, когда файлы данных изменяются операциями DDL, но журналы повтора изменений в таблице mysql.innodb_ddl_log, полученные в результате этих операций, не сохраняются на диск. Такая ситуация может вызвать ошибки при отмене или восстановлении.

Движок хранения InnoDB выполняет операции DDL поэтапно. Операции DDL, такие как ALTER TABLE, могут выполнять фазы Подготовка и Выполнение несколько раз до фазы Завершение.

  1. Подготовка: Создать необходимые объекты и записать журналы DDL в таблицу mysql.innodb_ddl_log. Журналы DDL определяют, как выполнить откат и возврат операции DDL.

  2. Выполнение: Выполнить операцию DDL. Например, выполнить процедуру создания для операции CREATE TABLE.

  3. Завершение: Обновить словарь данных и выполнить транзакцию словаря данных.

  4. После DDL: Перепроверить и удалить журналы DDL из таблицы mysql.innodb_ddl_log. Чтобы обеспечить безопасность отката без введения несоответствий, операции с файлами, такие как переименование или удаление файлов данных, выполняются на этой заключительной стадии. Эта фаза также удаляет динамические метаданные из таблицы словаря данных mysql.innodb_dynamic_metadata для DROP TABLE, TRUNCATE TABLE и других операций DDL, которые перестраивают таблицу.

Журналы DDL перепроверяются и удаляются из таблицы mysql.innodb_ddl_log в фазе После DDL, независимо от того, была ли операция DDL завершена или отменена. Журналы DDL должны оставаться только в таблице mysql.innodb_ddl_log, если сервер остановился во время операции DDL. В этом случае журналы DDL перепроверяются и удаляются после восстановления.

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

Просмотр логов DDL

Чтобы просмотреть логи DDL, которые записываются в таблицу словаря данных mysql.innodb_ddl_log во время атомарных операций DDL, включающих хранилище InnoDB, включите innodb_print_ddl_logs, чтобы MySQL записывал логи DDL в stderr. В зависимости от операционной системы хоста и конфигурации MySQL, stderr может быть файлом журнала ошибок, терминалом или окном консоли. См. Раздел 7.4.2.2, «Настройка назначения файла журнала ошибок по умолчанию».

InnoDB записывает логи DDL в таблицу mysql.innodb_ddl_log для поддержки операций отката и повтора операций DDL. Таблица mysql.innodb_ddl_log — это скрытая таблица словаря данных, которая находится в пространстве имен словаря данных mysql.ibd. Как и другие скрытые таблицы словаря данных, к таблице mysql.innodb_ddl_log нельзя получить прямой доступ в неотладочных версиях MySQL. (См. Раздел 16.1, «Схема словаря данных».) Структура таблицы mysql.innodb_ddl_log соответствует этому определению:

CREATE TABLE mysql.innodb_ddl_log (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  thread_id BIGINT UNSIGNED NOT NULL,
  type INT UNSIGNED NOT NULL,
  space_id INT UNSIGNED,
  page_no INT UNSIGNED,
  index_id BIGINT UNSIGNED,
  table_id BIGINT UNSIGNED,
  old_file_path VARCHAR(512) COLLATE utf8mb4_bin,
  new_file_path VARCHAR(512) COLLATE utf8mb4_bin,
  KEY(thread_id)
);
  • id: Уникальный идентификатор записи журнала DDL.

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

  • type: Тип операции DDL. Типы включают FREE (удаление дерева индекса), DELETE (удаление файла), RENAME (переименование файла) или DROP (удаление метаданных из таблицы словаря данных mysql.innodb_dynamic_metadata).

  • space_id: Идентификатор пространства имен.

  • page_no: Страница, содержащая информацию об алокации; например, корневая страница дерева индекса.

  • index_id: Идентификатор индекса.

  • table_id: Идентификатор таблицы.

  • old_file_path: Путь к старому файлу пространства имен. Используется операциями DDL, которые создают или удаляют файлы пространства имен; также используется операциями DDL, которые переименовывают пространство имен.

  • new_file_path: Путь к новому файлу пространства имен. Используется операциями DDL, которые переименовывают файлы пространства имен.

Этот пример демонстрирует включение innodb_print_ddl_logs для просмотра логов DDL, записанных в strderr для операции CREATE TABLE.

mysql> SET GLOBAL innodb_print_ddl_logs=1;
mysql> CREATE TABLE t1 (c1 INT) ENGINE = InnoDB;
[Note] [000000] InnoDB: DDL log insert : [DDL record: DELETE SPACE, id=18, thread_id=7,
space_id=5, old_file_path=./test/t1.ibd]
[Note] [000000] InnoDB: DDL log delete : by id 18
[Note] [000000] InnoDB: DDL log insert : [DDL record: REMOVE CACHE, id=19, thread_id=7,
table_id=1058, new_file_path=test/t1]
[Note] [000000] InnoDB: DDL log delete : by id 19
[Note] [000000] InnoDB: DDL log insert : [DDL record: FREE, id=20, thread_id=7,
space_id=5, index_id=132, page_no=4]
[Note] [000000] InnoDB: DDL log delete : by id 20
[Note] [000000] InnoDB: DDL log post ddl : begin for thread id : 7
[Note] [000000] InnoDB: DDL log post ddl : end for thread id : 7

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/atomic-ddl.html

Spec-Zone.ru

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