MySQL死锁排查步骤

系列文章目录

第一章: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

MySQL死锁排查步骤_第1张图片
可以根据执行的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;

可以看到当前处于锁等待的语句。
MySQL死锁排查步骤_第2张图片

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;

在这里插入图片描述

你可能感兴趣的:(mysql,数据库,sql)