查看锁情况(MySQL 8.0)

本文提供了一种查询MySQL中锁等待情况的方法。通过特定SQL语句,可以从performance_schema中获取到发生锁等待的线程信息,进而定位数据库性能瓶颈。

查看锁情况(MySQL 8.0)

SELECT * FROM performance_schema.events_statements_history
WHERE thread_id IN (
SELECT b.`THREAD_ID`
FROM sys.`innodb_lock_waits` a
INNER JOIN performance_schema.threads b ON a.`blocking_pid` = b.`PROCESSLIST_ID`
)
ORDER BY timer_start ASC;

 

<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、付费专栏及课程。

余额充值