1 查看当前是否有锁等待 *****
show status like ‘innodb_row_lock%’;

MySQL锁的监控和处理
关注点:
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’;

  1. trx_id 被阻塞事务ID
  2. trx_state 事务状态
  3. trx_mysqls_thread_id 连接层的,连接线程ID (show PROCESSLIST ==== ID)
  4. trx_query 被阻塞的sql语句

3 查看锁源的事务信息 (谁阻塞了我) ******
SELECT * from sys.innodb_lock_waits; 被锁的和锁定他的之间关系

  1. locked_table 产生锁的表
  2. locked_typ 锁类型 (record GAP NEXT)
  3. waiting_trx_id 等待的事务ID
  4. waiting_pid 等待事务的连接线程ID
  5. waiting_query 等待事务的语句
  6. waiting_lock_mode 等待锁的类型(X S)
  7. blocking_trx_id 锁源的事务ID
  8. blocking_pid 锁源的事务连接线程ID
  9. 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
MySQL锁的监控和处理

show VARIABLES like ‘%deadlock%’

将所有死锁记录的日志中
vim /etc/my.cnf
innodb_print_all_deadlocks = 1

相关文章:

  • 2022-01-22
  • 2022-12-23
  • 2022-01-09
  • 2021-10-30
  • 2021-06-30
  • 2021-10-10
  • 2022-12-23
  • 2021-04-17
猜你喜欢
  • 2022-02-17
  • 2021-09-08
  • 2021-12-28
  • 2022-12-23
  • 2022-12-23
  • 2022-03-09
  • 2022-12-23
相关资源
相似解决方案