25.12.12.1 Таблица metadata_locks
MySQL использует блокировки метаданных для управления одновременным доступом к объектам базы данных и обеспечения согласованности данных; см. Раздел 8.11.4 «Блокировка метаданных». Блокировка метаданных применяется не только к таблицам, но также к схемам, хранимым программам (процедурам, функциям, триггерам, запланированным событиям), пространствам таблиц, блокировкам пользователей, приобретённым с помощью функции GET_LOCK() (см. Раздел 12.14 «Функции блокировки»), и блокировкам, приобретённым с помощью сервиса блокировки, описанного в Разделе 5.5.6.1 «Сервис блокировки».
Схема Performance Schema предоставляет информацию о блокировках метаданных через таблицу metadata_locks:
Блокировки, которые были предоставлены (показывает, какие сессии владеют текущими блокировками метаданных).
Блокировки, которые были запрошены, но ещё не предоставлены (показывает, какие сессии ожидают каких блокировок метаданных).
Запросы блокировок, которые были убиты детектором тупиков.
Запросы блокировок, которые истекли и ожидают, чтобы запрос на блокировку текущей сессии был отброшен.
Эта информация позволяет понять зависимости блокировок метаданных между сессиями. Вы можете видеть не только, какую блокировку ожидает сессия, но и какая сессия в данный момент владеет этой блокировкой.
Таблица metadata_locks является только для чтения и не может быть обновлена. По умолчанию она имеет автоматический размер; для настройки размера таблицы установите системную переменную performance_schema_max_metadata_locks при запуске сервера.
Измерение блокировок метаданных использует инструмент wait/lock/metadata/sql/mdl, который по умолчанию отключен.
Для управления состоянием измерения блокировок метаданных при запуске сервера используйте строки в вашем файле my.cnf:
-
Включить:
[mysqld] performance-schema-instrument='wait/lock/metadata/sql/mdl=ON'
-
Выключить:
[mysqld] performance-schema-instrument='wait/lock/metadata/sql/mdl=OFF'
Для управления состоянием измерения блокировок метаданных во время выполнения обновите таблицу setup_instruments:
-
Включить:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME = 'wait/lock/metadata/sql/mdl';
-
Выключить:
UPDATE performance_schema.setup_instruments SET ENABLED = 'NO', TIMED = 'NO' WHERE NAME = 'wait/lock/metadata/sql/mdl';
Схема Performance Schema поддерживает содержимое таблицы metadata_locks следующим образом, используя столбец LOCK_STATUS для указания состояния каждой блокировки:
Когда запрос на блокировку метаданных получен и получен немедленно, вставляется строка со статусом
GRANTED.Когда запрос на блокировку метаданных получен и не получен немедленно, вставляется строка со статусом
PENDING.Когда запрос на блокировку метаданных, ранее запрошенный, предоставлен, статус его строки обновляется до
GRANTED.Когда блокировка метаданных освобождена, её строка удаляется.
Когда ожидающий запрос на блокировку отменяется детектором тупиковых ситуаций для прерывания тупика (), статус его строки обновляется с
PENDINGнаVICTIM.Когда ожидающий запрос на блокировку истекает (), статус его строки обновляется с
PENDINGнаTIMEOUT.Когда предоставленная блокировка или ожидающий запрос на блокировку убиваются, статус её строки обновляется с
GRANTEDилиPENDINGнаKILLED.Статусы
VICTIM,TIMEOUTиKILLEDкраткие и обозначают, что строка блокировки собирается быть удалена.Статусы
PRE_ACQUIRE_NOTIFYиPOST_RELEASE_NOTIFYкраткие и обозначают, что подподсистема блокировки метаданных уведомляет заинтересованные движки хранения при входе в операции получения блокировки или выходе из операций освобождения блокировки. Эти статусы были добавлены в MySQL 5.7.11.
Таблица metadata_locks имеет следующие столбцы:
-
OBJECT_TYPEТип блокировки, используемой в подсистеме блокировки метаданных. Значение является одним из
GLOBAL,SCHEMA,TABLE,FUNCTION,PROCEDURE,TRIGGER(в настоящее время не используется),EVENT,COMMIT,USER LEVEL LOCK,TABLESPACEилиLOCKING SERVICE.Значение
USER LEVEL LOCKуказывает на блокировку, полученную с помощьюGET_LOCK(). ЗначениеLOCKING SERVICEуказывает на блокировку, полученную с помощью сервиса блокировки, описанного в Разделе 5.5.6.1 «Сервис блокировки». -
OBJECT_SCHEMAСхема, содержащая объект.
-
OBJECT_NAMEИмя инструментированного объекта.
-
OBJECT_INSTANCE_BEGINАдрес в памяти инструментированного объекта.
-
LOCK_TYPEТип блокировки из подсистемы блокировки метаданных. Значение является одним из
INTENTION_EXCLUSIVE,SHARED,SHARED_HIGH_PRIO,SHARED_READ,SHARED_WRITE,SHARED_UPGRADABLE,SHARED_NO_WRITE,SHARED_NO_READ_WRITEилиEXCLUSIVE. -
LOCK_DURATIONПродолжительность блокировки из подсистемы блокировки метаданных. Значение является одним из
STATEMENT,TRANSACTIONилиEXPLICIT. ЗначенияSTATEMENTиTRANSACTIONобозначают блокировки, которые неявно освобождаются в конце оператора или транзакции соответственно. ЗначениеEXPLICITобозначает блокировки, которые сохраняются до конца оператора или транзакции и освобождаются явно, например, глобальные блокировки, полученные с помощьюFLUSH TABLES WITH READ LOCK. -
LOCK_STATUSСтатус блокировки из подсистемы блокировки метаданных. Значение является одним из
PENDING,GRANTED,VICTIM,TIMEOUT,KILLED,PRE_ACQUIRE_NOTIFYилиPOST_RELEASE_NOTIFY. Схема Performance Schema назначает эти значения, как описано ранее. -
SOURCEИмя исходного файла, содержащего инструментированный код, который породил событие, и номер строки в файле, в котором происходит инструментирование. Это позволяет проверить исходный код, чтобы точно определить, какой код вовлечен.
-
OWNER_THREAD_IDПоток, запрашивающий блокировку метаданных.
-
OWNER_EVENT_IDСобытие, запрашивающее блокировку метаданных.
TRUNCATE TABLE запрещён для таблицы metadata_locks.
© 2025 Oracle
Licensed under the GPLv2 License.