死鎖排查方法
- 查看進程狀態
show processlist;
- 查看行鎖的狀態
show status like 'InnoDB_row_lock%';
- 查詢是否有死鎖
show engine innodb status;
- 查看正在鎖的事務
檢查字段
trx_autocommit_non_locking,如果爲
0,則說明這個事務還沒有提交,需要提交。
殺掉這個事務。因爲很可能是人工修改數據庫,沒有提交。
這個時候,從小到大kill <trx_mysql_thread_id>
。
檢查字段 trx_autocommit_non_locking,如果爲 1,則說明死鎖發生。
根據字段 trx_mysql_thread_id, 從大到小執行kill <trx_mysql_thread_id>
(保存先提交的數據)
每殺掉一個,跑一下語句,看看情況。
SELECT *
FROM
INFORMATION_SCHEMA.innodb_trx;
- 查看正在鎖的事務
SELECT *
FROM
INFORMATION_SCHEMA.INNODB_LOCKS;
- 查看等待鎖的事務
SELECT *
FROM
INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
- 查看正在使用的表
show OPEN TABLES
where
In_use > 0;