Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

  • VICTIMTIMEOUTKILLED状态值是简短的,表示锁定行即将被删除。

  • PRE_ACQUIRE_NOTIFYPOST_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表执行。