Documentation Home

25.12.12.1 metadata_locks 表

MySQL 使用元数据锁定来管理对数据库对象的并发访问并确保数据一致性;参见 第 8.11.4 节,“元数据锁定”。元数据锁定不仅适用于表,还适用于模式、存储程序(过程、函数、触发器、计划事件)、表空间、使用 GET_LOCK()函数获取的用户锁(请参阅 第 12.15 节,“锁定函数”),以及使用第 5.5.6.1 节“锁定服务”中描述 的锁定服务。

Performance Schema 通过表暴露元数据锁信息metadata_locks

  • 已授予的锁(显示哪些会话拥有哪些当前元数据锁)。

  • 已请求但尚未授予的锁(显示哪些会话正在等待哪些元数据锁)。

  • 已被死锁检测器终止的锁定请求。

  • 已超时并正在等待请求会话的锁定请求被丢弃的锁定请求。

此信息使您能够了解会话之间的元数据锁依赖关系。您不仅可以看到会话正在等待哪个锁,还可以看到当前持有该锁的会话。

metadata_locks表是只读的,无法更新。默认情况下它是自动调整大小的;要配置表大小,请 performance_schema_max_metadata_locks 在服务器启动时设置系统变量。

Metadata lock instrumentation 使用 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) 时,其行状态从 更新PENDINGVICTIM

  • 当挂起的锁定请求超时 ( ER_LOCK_WAIT_TIMEOUT) 时,其行状态从 更新PENDINGTIMEOUT

  • 当授予的锁或挂起的锁请求被终止时,其行状态从GRANTED或 更新PENDINGKILLED

  • 、和status 值很简短VICTIM,表示锁定行即将被删除。 TIMEOUTKILLED

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

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.5.6.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

    来自元数据锁定子系统的锁定持续时间。该值为STATEMENTTRANSACTION或 之一EXPLICITSTATEMENT和 值分别表示在语句或事务结束时隐式释放的 TRANSACTION锁。该EXPLICIT值表示在语句或事务结束后仍然存在并通过显式操作释放的锁,例如使用获取的全局锁FLUSH TABLES WITH READ LOCK

  • LOCK_STATUS

    来自元数据锁定子系统的锁定状态。该值为PENDINGGRANTEDVICTIMTIMEOUTKILLEDPRE_ACQUIRE_NOTIFY或 之一POST_RELEASE_NOTIFY。性能模式如前所述分配这些值。

  • SOURCE

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

  • OWNER_THREAD_ID

    请求元数据锁的线程。

  • OWNER_EVENT_ID

    请求元数据锁定的事件。

TRUNCATE TABLE不允许用于metadata_locks表。