25.12.12.1 metadata_lockstable
MySQL 使用元数据锁定来 Management 对数据库对象的并发访问并确保数据一致性。参见第 8.11.4 节“元数据锁定”。元数据锁定不仅适用于 table,而且还适用于架构,存储的程序(过程,函数,触发器,调度的事件),table 空间,通过GET_LOCK()函数获取的用户锁(请参见第 12.14 节“锁定功能”)以及通过第 28.3.1 节“锁定服务”中描述的锁定服务获取的锁。 。
性能架构通过metadata_lockstable 公开元数据锁定信息:
-
已授予的锁(显示哪个会话拥有哪个当前元数据锁)。
-
已请求但尚未授予的锁(显示哪些会话正在 await 哪些元数据锁)。
-
死锁检测器已杀死的锁定请求。
-
超时并且正在 await 请求会话的锁定请求被丢弃的锁定请求。
此信息使您能够了解会话之间的元数据锁依赖性。您不仅可以看到会话正在 await 哪个锁,还可以看到当前拥有该锁的会话。
metadata_lockstable 是只读的,无法更新。默认情况下会自动调整大小。要配置 table 大小,请在服务器启动时设置performance_schema_max_metadata_locks系统变量。
元数据锁定工具使用wait/lock/metadata/sql/mdl
工具,该工具默认情况下处于禁用状态。
要在服务器启动时控制元数据锁定检测状态,请在my.cnf
文件中使用以下行:
- Enable:
[mysqld]
performance-schema-instrument='wait/lock/metadata/sql/mdl=ON'
- Disable:
[mysqld]
performance-schema-instrument='wait/lock/metadata/sql/mdl=OFF'
要在运行时控制元数据锁定检测状态,请更新setup_instrumentstable:
- Enable:
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME = 'wait/lock/metadata/sql/mdl';
- Disable:
UPDATE performance_schema.setup_instruments
SET ENABLED = 'NO', TIMED = 'NO'
WHERE NAME = 'wait/lock/metadata/sql/mdl';
性能架构使用LOCK_STATUS
列指示每个锁定的状态,从而按如下方式维护metadata_lockstable 的内容:
-
当请求并立即获得元数据锁定时,将插入状态为
GRANTED
的行。 -
当请求元数据锁定而不是立即获得元数据锁定时,将插入状态为
PENDING
的行。 -
授予先前请求的元数据锁定后,其行状态将更新为
GRANTED
。 -
释放元数据锁定后,将删除其行。
-
当死锁检测器取消挂起的锁定请求以 break 死锁(ER_LOCK_DEADLOCK)时,其行状态从
PENDING
更新为VICTIM
。 -
当挂起的锁定请求超时(ER_LOCK_WAIT_TIMEOUT)时,其行状态从
PENDING
更新为TIMEOUT
。 -
当授予的锁定或挂起的锁定请求被终止时,其行状态从
GRANTED
或PENDING
更新为KILLED
。 -
VICTIM
,TIMEOUT
和KILLED
状态值是简短的,table 示锁行将要删除。 -
PRE_ACQUIRE_NOTIFY
和POST_RELEASE_NOTIFY
状态值是简短的,table 示元数据锁定子系统在进入锁定获取操作或离开锁定释放操作时正在通知感兴趣的存储引擎。这些状态值是在 MySQL 5.7.11 中添加的。
metadata_lockstable 具有以下列:
OBJECT_TYPE
元数据锁定子系统中使用的锁定类型。该值是GLOBAL
,SCHEMA
,TABLE
,FUNCTION
,PROCEDURE
,TRIGGER
(当前未使用),EVENT
,COMMIT
,USER LEVEL LOCK
,TABLESPACE
或LOCKING SERVICE
之一。
值USER LEVEL LOCK
table 示使用GET_LOCK()获取的锁。值LOCKING SERVICE
table 示使用第 28.3.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
值分别 table 示在语句或事务结束时隐式释放的锁。 EXPLICIT
值 table 示可以在语句或事务结束后保留并由显式操作释放的锁,例如通过带读取锁的平桌子获取的全局锁。
LOCK_STATUS
来自元数据锁定子系统的锁定状态。该值是PENDING
,GRANTED
,VICTIM
,TIMEOUT
,KILLED
,PRE_ACQUIRE_NOTIFY
或POST_RELEASE_NOTIFY
之一。性能架构如上所述分配这些值。
SOURCE
源文件的名称,其中包含产生事件的检测代码,以及发生检测的文件中的行号。这使您可以检查源以确定确切涉及的代码。
OWNER_THREAD_ID
请求元数据锁定的线程。
OWNER_EVENT_ID
请求元数据锁定的事件。
metadata_lockstable 不允许TRUNCATE TABLE。