系列文章目录
第一章:sql_mode模式
第二章:optimize table、analyze table、alter table、gh-ost
第三章:InnoDB MVCC原理
第四章:sql语句执行过程
第五章:Percona Toolkit工具简介
第六章:MySQL索引
第七章:MySQL的锁
第八章:MySQL加锁分析
第九章:MySQL死锁排查步骤
前言
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.发生死锁时
SELECT
a.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
FROM
information_schema.INNODB_TRX a
LEFT JOIN information_schema.PROCESSLIST b ON a.trx_mysql_thread_id = b.id
LEFT JOIN PERFORMANCE_SCHEMA.threads c ON b.id = c.PROCESSLIST_ID
LEFT 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;