MySQL使用元数据锁定来管理对数据库对象的并发访问,并确保数据一致性;看到第8.11.4节“元数据锁定”.元数据锁定不仅适用于表,还适用于模式、存储程序(过程、函数、触发器、计划事件)、表空间、使用GET_LOCK ()
函数(见第12.15节,“锁定功能”中描述的锁定服务获取的锁第5.6.9.1节“锁定服务”.
方法公开元数据锁信息metadata_locks
表:
已授予的锁(显示哪些会话拥有哪些当前元数据锁)。
已请求但尚未授予的锁(显示哪些会话正在等待哪些元数据锁)。
锁定已被死锁检测器杀死的请求。
已超时并正在等待请求会话的锁请求被丢弃的锁请求。
这些信息使您能够理解会话之间的元数据锁依赖关系。您不仅可以看到会话正在等待哪个锁,还可以看到当前哪个会话持有该锁。
的metadata_locks
表为只读,不能更新。默认情况下,它是自动调整大小的;要配置表大小,请设置performance_schema_max_metadata_locks
服务器启动时的系统变量。
元数据锁工具使用等待/锁定/ / sql / mdl元数据
工具,默认启用。
要在服务器启动时控制元数据锁检测状态,请在您的my.cnf
文件:
启用:
(mysqld) performance-schema-instrument = '等待/锁定/元数据/ sql / mdl = '
禁用:
(mysqld) performance-schema-instrument = '等待/锁定/元数据/ sql / mdl =了'
若要在运行时控制元数据锁检测状态,请更新setup_instruments
表:
启用:
更新performance_schema。setup_instrumentsSET ENABLED = 'YES', TIMED = 'YES' WHERE NAME = 'wait/lock/metadata/sql/mdl';
禁用:
更新performance_schema。setup_instrumentsSET ENABLED = 'NO', TIMED = 'NO' WHERE NAME = 'wait/lock/metadata/sql/mdl';
性能架构维护metadata_locks
表内容如下,使用LOCK_STATUS
列,表示每个锁的状态:
当请求并立即获得元数据锁时,状态为的行
授予
被插入。当请求元数据锁但没有立即获得时,状态为的行
等待
被插入。当授予先前请求的元数据锁时,其行状态更新为
授予
.当元数据锁被释放时,它所在的行将被删除。
当挂起的锁请求被死锁检测器取消以打破死锁时(
ER_LOCK_DEADLOCK
),它的行状态从等待
来受害者
.当挂起的锁请求超时时(
ER_LOCK_WAIT_TIMEOUT
),它的行状态从等待
来超时
.当被授予的锁或挂起的锁请求被杀死时,它的行状态将从更新
授予
或等待
来杀了
.的
受害者
,超时
,杀了
状态值很简短,表示即将删除锁行。的
PRE_ACQUIRE_NOTIFY
而且POST_RELEASE_NOTIFY
状态值很简短,表示元数据锁定子子系统在进入锁获取操作或离开锁释放操作时通知感兴趣的存储引擎。
的metadata_locks
表有这些列:
OBJECT_TYPE
元数据锁子系统中使用的锁类型。取值为
全球
,模式
,表格
,函数
,过程
,触发
(目前未使用),事件
,提交
,用户级锁
,表空间
,或锁定服务
.的值
用户级锁
表示通过获取的锁GET_LOCK ()
.的值锁定服务
中描述的锁定服务获取的锁第5.6.9.1节“锁定服务”.OBJECT_SCHEMA
包含对象的模式。
OBJECT_NAME
仪器对象的名称。
OBJECT_INSTANCE_BEGIN
被测量对象的内存中的地址。
LOCK_TYPE
来自元数据锁子系统的锁类型。取值为
INTENTION_EXCLUSIVE
,共享
,SHARED_HIGH_PRIO
,SHARED_READ
,SHARED_WRITE
,SHARED_UPGRADABLE
,SHARED_NO_WRITE
,SHARED_NO_READ_WRITE
,或独家
.LOCK_DURATION
来自元数据锁定子系统的锁定时长。取值为
声明
,事务
,或显式的
.的声明
而且事务
值表示分别在语句或事务端隐式释放的锁。的显式的
值表示在语句或事务结束时仍然存在的锁,并通过显式操作释放,例如通过获取的全局锁用读锁刷新表
.LOCK_STATUS
来自元数据锁子系统的锁状态。取值为
等待
,授予
,受害者
,超时
,杀了
,PRE_ACQUIRE_NOTIFY
,或POST_RELEASE_NOTIFY
.如前所述,性能模式分配这些值。源
包含产生事件的检测代码的源文件的名称,以及发生检测的文件中的行号。这使您能够检查源代码,以确定具体涉及哪些代码。
OWNER_THREAD_ID
请求元数据锁的线程。
OWNER_EVENT_ID
请求元数据锁的事件。
的metadata_locks
表有以下索引:
主键(
OBJECT_INSTANCE_BEGIN
)指数(
OBJECT_TYPE
,OBJECT_SCHEMA
,OBJECT_NAME
)指数(
OWNER_THREAD_ID
,OWNER_EVENT_ID
)
截断表
是不允许的metadata_locks
表格