我们遇到了一个问题,我们的ORM锁定的表比我预期的要多。这导致我们的生产系统陷入僵局,我很难诊断。
我可以看到,使用SHOW ENGINE INNODB STATUS或使用无害的工具前10个锁,但我看不到其余的。
下面是来自SHOW ENGINE INNODB STATUS的一个示例输出的头和尾:
--TRANSACTION 1832883, ACTIVE 1728 sec
29 lock struct(s), heap size 3520, 14 row lock(s), undo log entries 10
...
10 LOCKS PRINTED FOR THIS TRX: SUPPRESSING FURTHER PRINTS我怎样才能查看前十以上的锁?
Perconda有innodb_show_locks_held变量--有替代MySQL的方法吗?如果相关的话,我将在开发中使用MySQL 5.7。
谢谢,艾德
发布于 2016-03-27 17:56:01
我建议使用MySQL 5.7附带的schema。这将以一种非常容易诊断的方式显示锁等待(比锁更有用):
mysql> SELECT * FROM sys.innodb_lock_waits\G
*************************** 1. row ***************************
wait_started: 2014-11-11 13:39:20
wait_age: 00:00:07
wait_age_secs: 7
locked_table: `db1`.`t1`
locked_index: PRIMARY
locked_type: RECORD
waiting_trx_id: 867158
waiting_trx_started: 2014-11-11 13:39:15
waiting_trx_age: 00:00:12
waiting_trx_rows_locked: 0
waiting_trx_rows_modified: 0
waiting_pid: 3
waiting_query: UPDATE t1 SET val = val + 1 WHERE id = 2
waiting_lock_id: 867158:2363:3:3
waiting_lock_mode: X
blocking_trx_id: 867157
blocking_pid: 4
blocking_query: UPDATE t1 SET val = val + 1 + SLEEP(10) WHERE id = 2
blocking_lock_id: 867157:2363:3:3
blocking_lock_mode: X
blocking_trx_started: 2014-11-11 13:39:11
blocking_trx_age: 00:00:16
blocking_trx_rows_locked: 1
blocking_trx_rows_modified: 1
sql_kill_blocking_query: KILL QUERY 4
sql_kill_blocking_connection: KILL 4
1 row in set (0.01 sec)https://dba.stackexchange.com/questions/133464
复制相似问题