1 查看当前是否有锁等待 *****
show status like ‘innodb_row_lock%’;
关注点:
Innodb_row_lock_current_waits 当前锁等待的数量
Innodb_row_lock_waits 累计锁等待数量
2 查看哪个事务在等待 (谁被阻塞了) 这一步可以不用操作 直接执行第三步 ***
SELECT * FROM information_schema.INNODB_TRX;
或
SELECT * FROM information_schema.INNODB_TRX WHERE trx_state=‘Lock WAIT’;
- trx_id 被阻塞事务ID
- trx_state 事务状态
- trx_mysqls_thread_id 连接层的,连接线程ID (show PROCESSLIST ==== ID)
- trx_query 被阻塞的sql语句
3 查看锁源的事务信息 (谁阻塞了我) ******
SELECT * from sys.innodb_lock_waits; 被锁的和锁定他的之间关系
- locked_table 产生锁的表
- locked_typ 锁类型 (record GAP NEXT)
- waiting_trx_id 等待的事务ID
- waiting_pid 等待事务的连接线程ID
- waiting_query 等待事务的语句
- waiting_lock_mode 等待锁的类型(X S)
- blocking_trx_id 锁源的事务ID
- blocking_pid 锁源的事务连接线程ID
- sql_kill_blocking_connection 处理建议
4 找到锁源 blocking_pid (连接线程id) ,找到锁源SQL线程的ID *****
SELECT * from performance_schema.threads where processlist_id=xxx;
5 根据锁源thread_id(SQL线程ID),找到锁源的SQL语句
SELECT * from performance_schema.events_statements_current where thread_id=xxx;
最终查找到锁源执行的SQL语句
sql_text 列
SELECT * from performance_schema.events_statements_history;
死锁监控
show engine innodb status\G
show VARIABLES like ‘%deadlock%’
将所有死锁记录的日志中
vim /etc/my.cnf
innodb_print_all_deadlocks = 1