• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • metadata_locks表

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

    性能架构通过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)时,其行状态从更新PENDINGVICTIM
    • 当待处理的锁定请求超时(ER_LOCK_WAIT_TIMEOUT)时,其行状态从PENDING更改为TIMEOUT
    • 当授予的锁定或挂起的锁定请求被终止时,其行状态将从GRANTED或更新PENDINGKILLED
    • VICTIMTIMEOUTKILLED状态值是短暂的,并表示该行锁定即将被删除。
    • PRE_ACQUIRE_NOTIFYPOST_RELEASE_NOTIFY状态值是短暂的,并表示该元数据锁定subsubsystem的通知感兴趣的存储引擎,而进入锁定获取操作或离开锁释放操作。

    metadata_locks表包含以下列:

    • OBJECT_TYPE

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

      USER LEVEL LOCK表示使用取得的锁GET_LOCK()。值LOCKING SERVICE表示使用“锁定服务”中所述的锁定服务获取的锁定。

    • OBJECT_SCHEMA

      包含对象的架构。

    • OBJECT_NAME

      被检测对象的名称。

    • OBJECT_INSTANCE_BEGIN

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

    • LOCK_TYPE

      来自元数据锁定子系统的锁定类型。值中的一个INTENTION_EXCLUSIVESHAREDSHARED_HIGH_PRIOSHARED_READSHARED_WRITESHARED_UPGRADABLESHARED_NO_WRITESHARED_NO_READ_WRITE,或EXCLUSIVE

    • LOCK_DURATION

      来自元数据锁定子系统的锁定持续时间。值中的一个STATEMENTTRANSACTIONEXPLICIT。该STATEMENTTRANSACTION值表示,它们分别隐含释放在语句或事务结束,锁具。该EXPLICIT值表示可以在语句或事务结束后保留并由显式操作释放的锁,例如,通过获取的全局锁FLUSH TABLES WITH READ LOCK

    • LOCK_STATUS

      来自元数据锁定子系统的锁定状态。值中的一个PENDINGGRANTEDVICTIMTIMEOUTKILLEDPRE_ACQUIRE_NOTIFY,或POST_RELEASE_NOTIFY。性能架构如上所述分配这些值。

    • SOURCE

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

    • OWNER_THREAD_ID

      请求元数据锁定的线程。

    • OWNER_EVENT_ID

      请求元数据锁定的事件。

    metadata_locks表具有以下索引:

    • OBJECT_INSTANCE_BEGIN)上的主键
    • 在指数(OBJECT_TYPEOBJECT_SCHEMAOBJECT_NAME
    • 在(OWNER_THREAD_IDOWNER_EVENT_ID)上的索引

    TRUNCATE TABLE不允许用于该metadata_locks表。