MySQL 使用元数据锁定来管理对数据库对象的并发访问并确保数据一致性;参见
第 8.11.4 节,“元数据锁定”。元数据锁定不仅适用于表,还适用于模式、存储程序(过程、函数、触发器、计划事件)、表空间、使用
GET_LOCK()
函数获取的用户锁(请参阅
第 12.15 节,“锁定函数”),以及使用第 5.6.9.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
。当元数据锁被释放时,它的行被删除。
当死锁检测器取消挂起的锁定请求以打破死锁 (
ER_LOCK_DEADLOCK
) 时,其行状态从 更新PENDING
为VICTIM
。当挂起的锁定请求超时 (
ER_LOCK_WAIT_TIMEOUT
) 时,其行状态从 更新PENDING
为TIMEOUT
。当授予的锁或挂起的锁请求被终止时,其行状态从
GRANTED
或 更新PENDING
为KILLED
。、和status 值很简短
VICTIM
,表示锁定行即将被删除。TIMEOUT
KILLED
和状态值很简短
PRE_ACQUIRE_NOTIFY
,POST_RELEASE_NOTIFY
表示元数据锁定子系统在进入锁定获取操作或离开锁定释放操作时通知感兴趣的存储引擎。
该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.6.9.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
。性能模式如前所述分配这些值。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
表。