Mysql 8.0查看锁状态

本文介绍从MySQL 8.0开始,如何使用performance_schema.data_locks表来展示InnoDB数据锁信息,取代了之前版本中已弃用的InformationSchema表INNODB_LOCKS和INNODB_LOCK_WAITS。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从 MySQL 8.0 开始,performance_schema.data_locks显示 InnoDB 数据锁
Information Schema 表INNODB_LOCKS和INNODB_LOCK_WAITS从 MySQL 5.7 开始弃用

Data_Locks

我们介绍一下data_locks的字段

CREATE TABLE `data_locks` (
  `ENGINE` varchar(32) NOT NULL,
  `ENGINE_LOCK_ID` varchar(128) NOT NULL,
  `ENGINE_TRANSACTION_ID` bigint unsigned DEFAULT NULL,
  `THREAD_ID` bigint unsigned DEFAULT NULL,
  `EVENT_ID` bigint unsigned DEFAULT NULL,
  `OBJECT_SCHEMA` varchar(64) DEFAULT NULL,
  `OBJECT_NAME` varchar(64) DEFAULT NULL,
  `PARTITION_NAME` varchar(64) DEFAULT NULL,
  `SUBPARTITION_NAME` varchar(64) DEFAULT NULL,
  `INDEX_NAME` varchar(64) DEFAULT NULL,
  `OBJECT_INSTANCE_BEGIN` bigint unsigned NOT NULL,
  `LOCK_TYPE` varchar(32) NOT NULL,
  `LOCK_MODE` varchar(32) NOT NULL,
  `LOCK_STATUS` varchar(32) NOT NULL,
  `LOCK_DATA` varchar(8192) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`ENGINE_LOCK_ID`,`ENGINE`),
  KEY `ENGINE_TRANSACTION_ID` (`ENGINE_TRANSACTION_ID`,`ENGINE`),
  KEY `THREAD_ID` (`THREAD_ID`,`EVENT_ID`),
  KEY `OBJECT_SCHEMA` (`OBJECT_SCHEMA`,`OBJECT_NAME`,`PARTITION_NAME`,`SUBPARTITION_NAME`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

在这里插入图片描述
在这里插入图片描述

更多内容查看: https://dev.mysql.com/doc/refman/8.0/en/performance-schema-data-locks-table.html

<think>我们正在处理一个关于MySQL 8.0如何查看当前信息的问题。根据提供的引用,我们知道在MySQL 8.0中,信息的查看方式与之前版本有所不同,主要依赖于`performance_schema`中的。 根据引用[1]:MySQL 8.0删除了`information_schema`库下的`INNODB_LOCKS`和`INNODB_LOCK_WAITS`,转而使用`performance_schema`中的来提供信息。其中提到了`data_locks`(在`performance_schema`中,实际名为`data_locks`,但注意引用中写的是`data_locks`,实际上在`performance_schema`中,名可能是`data_locks`和`data_lock_waits`,但具体需要确认)。 引用[2]提到了一个命令`show open tables where in_use > 0;`,这个命令可以查看当前哪些定()。 引用[3]提到在MySQL 8.0.11中,可以通过数据字典查看信息。 引用[4]提到一个SQL语句:`SHOW STATUS LIKE 'innodb_row_lock%';`,用于查看InnoDB行状态信息,但这并不是查看当前的具体信息,而是统计信息。 因此,我们需要结合这些信息来回答用户。在MySQL 8.0中,查看当前信息(包括行)主要可以通过以下方式: 1. 使用`performance_schema`中的: - `performance_schema.data_locks`:显示当前持有的(包括正在等待的和已经持有的)。 - `performance_schema.data_lock_waits`:显示等待关系。 2. 使用系统视图(在`sys`库中): - `sys.innodb_lock_waits`:这是一个视图,基于`performance_schema`的,提供了更易读的等待信息。 3. 使用`SHOW OPEN TABLES`命令查看(引用[2])。 4. 使用`SHOW ENGINE INNODB STATUS`命令,这个命令会输出InnoDB引擎状态,其中包含一个关于信息的章节(但可能不够详细)。 5. 使用`SHOW STATUS`命令查看相关的统计信息(引用[4]),但这不显示具体的。 因此,我们重点介绍使用`performance_schema`和`sys`库的方法。 注意:默认情况下,`performance_schema`可能没有完全启用相关的监控,我们需要确保启用相关的消费者(consumer)和工具(instrument)。但通常,在MySQL 8.0中,这些是默认启用的。 步骤: 1. 确保`performance_schema`已经启用: ```sql SHOW VARIABLES LIKE 'performance_schema'; ``` 如果为ON,则继续。 2. 查询`data_locks`: ```sql SELECT * FROM performance_schema.data_locks; ``` 这个显示了当前所有被请求的(包括已经获取的和正在等待的)。 3. 查询`data_lock_waits`: ```sql SELECT * FROM performance_schema.data_lock_waits; ``` 这个显示了哪些事务在等待,以及被哪些事务阻塞。 4. 使用`sys`库的视图(需要先安装sys库,如果未安装,可以运行`mysql -u root -p < install_sys.sql`,通常MySQL已经自带): ```sql SELECT * FROM sys.innodb_lock_waits; ``` 这个视图提供了更易读的等待信息,包括阻塞关系、等待时间等。 5. 查看: ```sql SHOW OPEN TABLES WHERE In_use > 0; ``` 6. 查看InnoDB状态(包含信息,但可能信息量较大且不易读): ```sql SHOW ENGINE INNODB STATUS; ``` 在输出中,查找“TRANSACTIONS”部分,其中可能有信息,以及“LATEST DETECTED DEADLOCK”部分(如果有死发生)。 另外,引用[4]中提到的`SHOW STATUS`命令: ```sql SHOW STATUS LIKE 'innodb_row_lock%'; ``` 这个命令显示的是InnoDB行的统计信息,如等待次数、等待时间等,用于性能分析,而不是当前的具体信息。 因此,综合以上,我们可以给用户一个清晰的回答。 注意:由于用户可能没有启用`performance_schema`或者没有安装`sys`库,我们需要提醒用户确保这些前提条件。 下面我们组织回答。</think>### MySQL 8.0 查看当前信息的方法 在 MySQL 8.0 中,信息主要通过 **`performance_schema` 系统库** 和 **`sys` 系统视图** 进行排查,替代了旧版 `information_schema` 中的。以下是具体操作步骤: --- #### 1. **查看当前持有的** 使用 `performance_schema.data_locks` 查看所有信息(包括行): ```sql SELECT * FROM performance_schema.data_locks; ``` - **关键字段**: - `ENGINE`:存储引擎(如 InnoDB) - `LOCK_TYPE`:类型(TABLE / RECORD 行) - `LOCK_MODE`:模式(X 排他 / S 共享 / GAP 间隙等) - `LOCK_STATUS`:状态(GRANTED 已持有 / WAITING 等待中) - `INDEX_NAME`:涉及索引 - `LOCK_DATA`:定数据(主键值或行数据)[^1] --- #### 2. **查看等待关系** 通过 `performance_schema.data_lock_waits` 排查阻塞关系: ```sql SELECT * FROM performance_schema.data_lock_waits; ``` - **关键字段**: - `REQUESTING_ENGINE_LOCK_ID`:请求的事务 ID - `BLOCKING_ENGINE_LOCK_ID`:阻塞的事务 ID - `REQUESTING_THREAD_ID`:被阻塞线程 - `BLOCKING_THREAD_ID`:阻塞线程[^1] --- #### 3. **使用 `sys` 库简化排查** 通过 `sys.innodb_lock_waits` 视图快速定位阻塞源: ```sql SELECT * FROM sys.innodb_lock_waits; ``` - **输出示例**: ``` +-------------------+-----------------------------+-----------------+------------------+ | wait_started | waiting_pid | blocking_pid | blocking_query | +-------------------+-----------------------------+-----------------+------------------+ | 2023-10-01 12:05:00 | 32 | 28 | UPDATE t SET ...| +-------------------+-----------------------------+-----------------+------------------+ ``` - `waiting_pid`:被阻塞会话 ID - `blocking_pid`:阻塞源会话 ID - `blocking_query`:导致阻塞的 SQL[^3] --- #### 4. **查看状态** 使用 `SHOW OPEN TABLES` 命令检查: ```sql SHOW OPEN TABLES WHERE In_use > 0; ``` - **输出字段**: - `Database`:数据库名 - `Table`:被名 - `In_use`:当前持有数(>0 示被定)[^2] --- #### 5. **查看统计信息** 监控行竞争情况: ```sql SHOW STATUS LIKE 'innodb_row_lock%'; ``` - **关键指标**: - `Innodb_row_lock_current_waits`:当前等待行数 - `Innodb_row_lock_time_avg`:平均等待时长(毫秒) - `Innodb_row_lock_waits`:累计等待次数[^4] --- #### 6. **查看 InnoDB 引擎状态** 获取详细信息和死日志: ```sql SHOW ENGINE INNODB STATUS; ``` - 在输出结果中检查 **`TRANSACTIONS`** 和 **`LATEST DETECTED DEADLOCK`** 部分。 --- ### 排查建议 1. **启用 performance_schema**: 确保配置文件中设置 `performance_schema=ON`(默认开启)。 2. **权限要求**: 需有 `SELECT` 权限访问 `performance_schema` 和 `sys` 库。 3. **死分析**: 若存在死,`SHOW ENGINE INNODB STATUS` 会记录最后一次死详情。 > **提示**:MySQL 8.0 移除了 `information_schema.INNODB_LOCKS` 和 `INNODB_LOCK_WAITS` ,请优先使用 `performance_schema` 替代方案[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值