#### 27.12.13.3 元数据\_锁表

[](<>)[](<>)[](<>)

MySQL 使用元数据锁定来管理对数据库对象的并发访问并确保数据的一致性；看[第 8.11.4 节，“元数据锁定”](metadata-locking.html).元数据锁定不仅适用于表，还适用于模式、存储程序（过程、函数、触发器、计划事件）、表空间、使用[`GET_LOCK()`](locking-functions.html#function_get-lock)功能（见[第 12.15 节，“锁定功能”](locking-functions.html))，以及使用中描述的锁定服务获取的锁定[第 5.6.9.1 节，“锁定服务”](locking-service.html).

Performance Schema 通过[`元数据锁`](performance-schema-metadata-locks-table.html)桌子：

-   已授予的锁（显示哪些会话拥有哪些当前元数据锁）。

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

-   已被死锁检测器杀死的锁请求。

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

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

    这[`元数据锁`](performance-schema-metadata-locks-table.html)表是只读的，不能更新。默认自动调整大小；要配置表大小，请设置[`performance_schema_max_metadata_locks`](performance-schema-system-variables.html#sysvar_performance_schema_max_metadata_locks)服务器启动时的系统变量。

    元数据锁检测使用`等待/锁定/元数据/sql/mdl`仪器，默认启用。

    要在服务器启动时控制元数据锁定检测状态，请在您的`我的.cnf`文件：

-   使能够：

    ```
    [mysqld]
    performance-schema-instrument='wait/lock/metadata/sql/mdl=ON'
    ```

-   禁用：

    ```
    [mysqld]
    performance-schema-instrument='wait/lock/metadata/sql/mdl=OFF'
    ```

    要在运行时控制元数据锁定检测状态，请更新[`setup_instruments`](performance-schema-setup-instruments-table.html)桌子：

-   使能够：

    ```
    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-table.html)表格内容如下，使用`LOCK_STATUS`用于指示每个锁的状态的列：

-   当请求并立即获得元数据锁时，状态为`的确`被插入。

-   当请求元数据锁但未立即获得时，状态为`待办的`被插入。

-   当先前请求的元数据锁被授予时，其行状态更新为`的确`.

-   当元数据锁被释放时，它的行被删除。

-   当死锁检测器取消挂起的锁请求以打破死锁时（[`ER_LOCK_DEADLOCK`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_lock_deadlock))，其行状态更新自`待办的`到`受害者`.

-   当挂起的锁定请求超时时（[`ER_LOCK_WAIT_TIMEOUT`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_lock_wait_timeout))，其行状态更新自`待办的`到`暂停`.

-   当授予锁或挂起锁请求被杀死时，其行状态从`的确`要么`待办的`到`杀死`.

-   这`受害者`, `暂停`， 和`杀死`状态值很简短，表示锁定行即将被删除。

-   这`PRE_ACQUIRE_NOTIFY`和`POST_RELEASE_NOTIFY`状态值很简短，表示元数据锁定子系统在进入锁定获取操作或离开锁定释放操作时正在通知感兴趣的存储引擎。

    这[`元数据锁`](performance-schema-metadata-locks-table.html)表有这些列：

-   `OBJECT_TYPE`

    元数据锁子系统中使用的锁类型。该值是其中之一`全球的`,`架构`,`桌子`,`功能`,`程序`,`扳机`（目前未使用），`事件`,`犯罪`,`用户等级锁定`,`表空间`， 要么`锁定服务`.

    一个值`用户等级锁定`表示获得的锁[`GET_LOCK()`](locking-functions.html#function_get-lock).一个值`锁定服务`表示使用中描述的锁定服务获取的锁定[第 5.6.9.1 节，“锁定服务”](locking-service.html).

-   `OBJECT_SCHEMA`

    包含对象的架构。

-   `OBJECT_NAME`

    检测对象的名称。

-   `OBJECT_INSTANCE_BEGIN`

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

-   `LOCK_TYPE`

    元数据锁子系统中的锁类型。该值是其中之一`INTENTION_EXCLUSIVE`,`共享`,`SHARED_HIGH_PRIO`,`SHARED_READ`,`SHARED_WRITE`,`SHARED_UPGRADABLE`,`SHARED_NO_WRITE`,`SHARED_NO_READ_WRITE`， 要么`独家的`.

-   `LOCK_DURATION`

    元数据锁定子系统的锁定持续时间。该值是其中之一`陈述`,`交易`， 要么`明确的`.这`陈述`和`交易`值分别表示在语句或事务结束时隐式释放的锁。这`明确的`value 表示在语句或事务结束后存活并通过显式操作释放的锁，例如使用以下命令获取的全局锁[`带读锁的刷新表`](flush.html#flush-tables-with-read-lock).

-   `LOCK_STATUS`

    来自元数据锁定子系统的锁定状态。该值是其中之一`待办的`,`的确`,`受害者`,`暂停`,`杀死`,`PRE_ACQUIRE_NOTIFY`， 要么`POST_RELEASE_NOTIFY`.性能模式如前所述分配这些值。

-   `资源`

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

-   `OWNER_THREAD_ID`

    请求元数据锁的线程。

-   `OWNER_EVENT_ID`

    请求元数据锁定的事件。

    这[`元数据锁`](performance-schema-metadata-locks-table.html)表有这些索引：

-   主键打开 (`OBJECT_INSTANCE_BEGIN`)

-   索引 (`OBJECT_TYPE`,`OBJECT_SCHEMA`,`OBJECT_NAME`)

-   索引 (`OWNER_THREAD_ID`,`OWNER_EVENT_ID`)

[`截断表`](truncate-table.html)不允许[`元数据锁`](performance-schema-metadata-locks-table.html)桌子。
