mysql查询死锁表 Unknown table ‘INNODB_LOCKS‘ in information_schema

mysql查询死锁表

mysql 8.0 版本跟之前是不一样的,网上到处都是
 # 查询死锁表
 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
# 查询死锁等待时间
 SELECT * FROM information_schema.INNODB_LOCK_waits;

在8.0版本之前会报


Unknown table 'INNODB_LOCKS' in information_schema

Unknown table 'INNODB_LOCK_WAITS' in information_schema

8.0版本之后替换为


 select * from performance_schema.data_locks;

 select * from performance_schema.data_lock_waits;
### 通过 `innodb_status` 诊断 `data_locks` 问题 #### 使用 `SHOW ENGINE INNODB STATUS` 查看死锁信息 当需要诊断与 `data_locks` 相关的问题时,可以通过执行 `SHOW ENGINE INNODB STATUS` 命令来获取最近一次死锁的详细信息。该命令输出的内容包括死锁涉及的事务、锁定的资源以及回滚的事务等信息[^2]。 以下是一个示例查询: ```sql SHOW ENGINE INNODB STATUS; ``` 在输出结果中,可以找到类似于以下的段落,描述死锁的具体情况: ``` ------------------------ LATEST DETECTED DEADLOCK ------------------------ ... *** (1) TRANSACTION: TRANSACTION 12345, ACTIVE 5 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s) MySQL thread id 10, OS thread handle 1234567890, query id 1234 database_name waiting for table metadata lock ... *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 58 page no 3 n bits 72 index `PRIMARY` of table `database_name`.`table_name` trx id 12345 lock_mode X locks rec but not gap waiting ... *** (2) TRANSACTION: TRANSACTION 67890, ACTIVE 3 sec starting index read ... ``` #### 关联 `data_locks` 与 `INNODB_TRX` 为了进一步分析死锁问题,可以将 `performance_schema.data_locks` 与 `information_schema.INNODB_TRX` 进行关联查询。这有助于确定哪些事务正在等待锁,以及哪些事务持有锁[^3]。 以下是一个关联查询的示例: ```sql SELECT dl.ENGINE_TRANSACTION_ID AS trx_id, dl.OBJECT_SCHEMA AS schema_name, dl.OBJECT_NAME AS table_name, dl.LOCK_TYPE, dl.LOCK_MODE, dl.LOCK_STATUS, it.trx_state, it.trx_started, it.trx_wait_started, it.trx_requested_lock_id, it.trx_mysql_thread_id FROM performance_schema.data_locks dl JOIN information_schema.INNODB_TRX it ON dl.ENGINE_TRANSACTION_ID = it.trx_id WHERE dl.LOCK_STATUS = 'WAITING'; ``` #### 分析死锁的根本原因 通过结合 `SHOW ENGINE INNODB STATUS` 的输出和 `data_locks` 的数据,可以逐步分析死锁的根本原因。通常需要关注以下几个方面: - **事务顺序**:检查是否存在多个事务以不同的顺序访问同一组资源,导致循环等待[^1]。 - **锁模式冲突**:分析不同事务之间的锁模式(如共享锁 `S` 和排他锁 `X`)是否发生冲突。 - **长事务持有锁**:识别是否有长时间运行的事务持有大量锁,从而增加与其他事务冲突的概率。 #### 配置参数优化 为了更好地诊断和解决死锁问题,可以调整以下配置参数: - **启用死锁检测**:通过设置 `innodb_deadlock_detect=ON`,开启主动死锁检测功能,系统会自动选择一个事务进行回滚以解除死锁[^4]。 - **记录所有死锁日志**:通过设置 `innodb_print_all_deadlocks=ON`,记录所有死锁的详细信息,便于后续分析。 ### 示例代码 以下是一个完整的死锁排查流程示例: ```sql -- 查看当前事务的加锁情况 SELECT ENGINE_TRANSACTION_ID, LOCK_TYPE, LOCK_MODE, LOCK_STATUS FROM performance_schema.data_locks; -- 查看相关事务的详细信息 SELECT trx_id, trx_state, trx_started, trx_requested_lock_id, trx_wait_started FROM information_schema.INNODB_TRX; -- 查看最近一次死锁的日志 SHOW ENGINE INNODB STATUS; ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值