系列文章目录
第一章:sql_mode模式
第二章:optimize table、analyze table、alter table、gh-ost
第三章:InnoDB MVCC原理
第四章:sql语句执行过程
第五章:Percona Toolkit工具简介
第六章:MySQL索引
第七章:MySQL的锁
第八章:MySQL加锁分析
第九章:MySQL死锁排查步骤
文章目录
- 系列文章目录
- 前言
- 一、线上环境
- 1.查看最后一次死锁情况
- 2. error 日志
- 二、开发环境
- 1.发生死锁时
- 2.分析锁定范围
前言
MySQL死锁偶尔出现在线上或者开发环境,可以通过如下方法排查死锁问题。
一、线上环境
1.查看最后一次死锁情况
show engine innodb status\G
可以根据执行的sql,反推锁定的语句。
2. error 日志
/etc/my.cnf 文件中修改或增加配置,注意增加的位置[mysqld] 的下面,否则无效;
innodb_print_all_deadlocks = ON
error日志的路径可以通过如下sql查看:
SHOW VARIABLES LIKE 'log_error';
这样就可以通过错误日志分析排查mysql死锁
二、开发环境
1.发生死锁时
SELECTa.trx_id,d.SQL_TEXT,a.trx_state,a.trx_started,a.trx_query,b.ID,b.USER,b.DB,b.COMMAND,b.TIME,b.STATE,b.INFO,c.PROCESSLIST_USER,c.PROCESSLIST_HOST,c.PROCESSLIST_DB
FROMinformation_schema.INNODB_TRX aLEFT JOIN information_schema.PROCESSLIST b ON a.trx_mysql_thread_id = b.id LEFT JOIN PERFORMANCE_SCHEMA.threads c ON b.id = c.PROCESSLIST_IDLEFT JOIN PERFORMANCE_SCHEMA.events_statements_current d ON d.THREAD_ID = c.THREAD_ID;
可以看到当前处于锁等待的语句。
2.分析锁定范围
SELECT ENGINE,ENGINE_TRANSACTION_ID,THREAD_ID,EVENT_ID,OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME,LOCK_TYPE, LOCK_MODE,LOCK_STATUS,LOCK_DATA FROM performance_schema.data_locks;