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, не связанные с таблицами, не требуют этого. В настоящее время только движок хранения InnoDB поддерживает атомарный DDL.
Поддерживаемые операторы DDL, относящиеся к таблицам, включают
CREATE,ALTER, иDROPдля баз данных, табличных пространств, таблиц и индексов, а также операторTRUNCATE TABLE.-
Поддерживаемые операторы DDL, не относящиеся к таблицам, включают:
Следующие операторы не поддерживаются функцией атомарного 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, могут выполнять фазы Подготовка и Выполнение несколько раз до фазы Завершение.
Подготовка: Создать необходимые объекты и записать журналы DDL в таблицу
mysql.innodb_ddl_log. Журналы DDL определяют, как выполнить откат и возврат операции DDL.Выполнение: Выполнить операцию DDL. Например, выполнить процедуру создания для операции
CREATE TABLE.Завершение: Обновить словарь данных и выполнить транзакцию словаря данных.
После 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.