metadata_locks表
MySQL使用元数据锁定来管理对数据库对象的并发访问并确保数据一致性。请参见“元数据锁定”。元数据锁定不仅适用于表,而且还适用于模式,存储程序(过程,函数,触发器,计划的事件),表空间,通过GET_LOCK()
函数获取的用户锁(请参见“锁定函数”)和通过函数获取的锁。“锁定服务”中描述的锁定服务。
性能架构通过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_instrumentsSET ENABLED = 'YES', TIMED = 'YES'WHERE NAME = 'wait/lock/metadata/sql/mdl';禁用:
UPDATE performance_schema.setup_instrumentsSET ENABLED = 'NO', TIMED = 'NO'WHERE NAME = 'wait/lock/metadata/sql/mdl';
Performance Schema维护metadata_locks
表内容,如下所示,使用该LOCK_STATUS
列指示每个锁的状态:
- 当请求并立即获得元数据锁定时,
GRANTED
将插入状态为的行。 - 当请求并没有立即获得元数据锁定时,
PENDING
将插入状态为的行。 - 授予先前请求的元数据锁定后,其行状态将更新为
GRANTED
。 - 释放元数据锁定后,将删除其行。
- 当死锁检测器取消挂起的锁定请求以打破死锁(
ER_LOCK_DEADLOCK
)时,其行状态从更新PENDING
为VICTIM
。 - 当待处理的锁定请求超时(
ER_LOCK_WAIT_TIMEOUT
)时,其行状态从PENDING
更改为TIMEOUT
。 - 当授予的锁定或挂起的锁定请求被终止时,其行状态将从
GRANTED
或更新PENDING
为KILLED
。 - 的
VICTIM
,TIMEOUT
和KILLED
状态值是短暂的,并表示该行锁定即将被删除。 - 该
PRE_ACQUIRE_NOTIFY
和POST_RELEASE_NOTIFY
状态值是短暂的,并表示该元数据锁定subsubsystem的通知感兴趣的存储引擎,而进入锁定获取操作或离开锁释放操作。
该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
表示使用“锁定服务”中所述的锁定服务获取的锁定。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
。性能架构如上所述分配这些值。SOURCE
源文件的名称,其中包含产生事件的检测代码以及发生检测的文件中的行号。这使您可以检查源以确定确切涉及的代码。
OWNER_THREAD_ID
请求元数据锁定的线程。
OWNER_EVENT_ID
请求元数据锁定的事件。
该metadata_locks
表具有以下索引:
- (
OBJECT_INSTANCE_BEGIN
)上的主键 - 在指数(
OBJECT_TYPE
,OBJECT_SCHEMA
,OBJECT_NAME
) - 在(
OWNER_THREAD_ID
,OWNER_EVENT_ID
)上的索引
TRUNCATE TABLE
不允许用于该metadata_locks
表。