29.12.13.3 metadata_locks 表
MySQL 使用元数据锁定来管理并发访问数据库对象以及确保数据一致性;参见第10.11.4节,“元数据锁定”。元数据锁定不仅适用于表,还适用于模式、存储程序(过程、函数、触发器、计划事件)、表空间、用户锁定(使用GET_LOCK()函数获取,见第14.14节,“锁定函数”)以及通过第7.6.9.1节,“锁定服务”描述的锁定。
性能_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';
性能_schema 持有metadata_locks表格内容,使用LOCK_STATUS列来指示每个锁的状态:
-
当元数据锁被请求并立即获得时,将插入一个状态为GRANTED的行。
-
当元数据锁被请求但未立即获得时,将插入一个状态为PENDING的行。
-
当之前请求的元数据锁被授予时,将更新其行状态为GRANTED。
-
当元数据锁被释放时,将删除该行。
-
当死锁检测器取消一个等待中的锁请求以打破死锁(
ER_LOCK_DEADLOCK),将更新其行状态为VICTIM。 -
当一个等待中的锁请求超时(
ER_LOCK_WAIT_TIMEOUT),将更新其行状态为TIMEOUT。 -
当授予的锁或等待中的锁请求被杀死时,将更新其行状态为KILLED。
-
VICTIM、TIMEOUT和KILLED状态值是简短的,表示锁定行即将被删除。 -
PRE_ACQUIRE_NOTIFY和POST_RELEASE_NOTIFY状态值是简短的,表示元数据锁定子系统在进入锁定获取操作或离开锁定释放操作时通知感兴趣的存储引擎。
metadata_locks表格有这些列:
-
OBJECT_TYPE元数据锁定子系统中使用的锁类型。值可以是
全局、模式、表格、函数、程序、触发器(当前未使用)、事件、提交、用户级锁定、表空间、备份锁定或锁定服务。用户级锁定的值表示使用GET_LOCK()获取的锁。锁定服务的值表示使用描述在第7.6.9.1节,“锁定服务”中定义的锁定服务获取的锁。 -
对象模式包含对象的模式。
-
对象名称被监视对象的名称。
-
对象实例开始在内存中的被监视对象的地址。
-
锁定类型元数据锁定子系统中使用的锁定类型。值可以是
意向排他、共享、高优先级共享、只读共享、可升级的共享、不写入共享、不读写共享或排他。 -
锁定持续时间元数据锁定子系统中使用的锁定持续时间。值可以是
语句、事务或显式。语句和事务值表示在语句或事务结束时自动释放的锁。显式值表示锁将持续到显式操作,如使用FLUSH TABLES WITH READ LOCK获取全局锁时。 -
锁定状态元数据锁定子系统中使用的锁定状态。值可以是
等待、授予、牺牲者、超时、被杀死、预先获取通知或释放后通知。性能模式为这些值分配的方式如前所述。 -
来源生成事件并在其中进行instrumentation的源文件名称以及文件中instrumentation发生的行号。这使您可以检查源代码以确定具体涉及的代码是什么。
-
所有者线程ID请求元数据锁定的线程。
-
所有者事件ID请求元数据锁定的事件。
性能模式中的metadata_locks表具有这些索引:
-
基于
对象实例开始的主键 -
基于
对象类型、对象模式和对象名称的索引 -
基于
所有者线程ID和所有者事件ID的索引
TRUNCATE TABLE不允许对metadata_locks表执行。