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

  • 当授予的锁定或挂起的锁定请求被终止时,其行状态从GRANTEDPENDING更新为KILLED

  • VICTIMTIMEOUTKILLED状态值是简短的,table 示锁行将要删除。

  • PRE_ACQUIRE_NOTIFYPOST_RELEASE_NOTIFY状态值是简短的,table 示元数据锁定子系统在进入锁定获取操作或离开锁定释放操作时正在通知感兴趣的存储引擎。这些状态值是在 MySQL 5.7.11 中添加的。

metadata_lockstable 具有以下列:

  • OBJECT_TYPE

元数据锁定子系统中使用的锁定类型。该值是GLOBALSCHEMATABLEFUNCTIONPROCEDURETRIGGER(当前未使用),EVENTCOMMITUSER LEVEL LOCKTABLESPACELOCKING SERVICE之一。

USER LEVEL LOCKtable 示使用GET_LOCK()获取的锁。值LOCKING SERVICEtable 示使用第 28.3.1 节“锁定服务”中描述的锁定服务获取的锁定。

  • OBJECT_SCHEMA

包含对象的架构。

  • OBJECT_NAME

被检测对象的名称。

  • OBJECT_INSTANCE_BEGIN

被检测对象在内存中的地址。

  • LOCK_TYPE

来自元数据锁定子系统的锁定类型。该值是INTENTION_EXCLUSIVESHAREDSHARED_HIGH_PRIOSHARED_READSHARED_WRITESHARED_UPGRADABLESHARED_NO_WRITESHARED_NO_READ_WRITEEXCLUSIVE之一。

  • LOCK_DURATION

来自元数据锁定子系统的锁定持续时间。该值为STATEMENTTRANSACTIONEXPLICIT之一。 STATEMENTTRANSACTION值分别 table 示在语句或事务结束时隐式释放的锁。 EXPLICIT值 table 示可以在语句或事务结束后保留并由显式操作释放的锁,例如通过带读取锁的平桌子获取的全局锁。

  • LOCK_STATUS

来自元数据锁定子系统的锁定状态。该值是PENDINGGRANTEDVICTIMTIMEOUTKILLEDPRE_ACQUIRE_NOTIFYPOST_RELEASE_NOTIFY之一。性能架构如上所述分配这些值。

  • SOURCE

源文件的名称,其中包含产生事件的检测代码,以及发生检测的文件中的行号。这使您可以检查源以确定确切涉及的代码。

  • OWNER_THREAD_ID

请求元数据锁定的线程。

  • OWNER_EVENT_ID

请求元数据锁定的事件。

metadata_lockstable 不允许TRUNCATE TABLE