锁超时的原因:
- 某些SQL语句运行时间过长,长时间占用锁,导致新提交的SQL不能获取锁。
- 某些事务占用时间过长,没提交或者回滚,导致锁未释放。
第一种情况,可以开启SQL的慢查询日志排查哪些SQL执行效率过低,使用Explain查看SQL是否走索引等,这种情况比较好定位。
第二种情况,要看下代码哪里可能要跑很久的,打日志,找出来。
另外记录一些常用的Mysql调试方法。
- 开启sql慢查询日志
/etc/mysql/my.conf
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/instance-1-slow.log
long_query_time = 2
- 开启记录死锁
set global innodb_print_all_deadlocks=1
show variables like "%innodb_print_all_deadlocks%";
或者配置错误日志路径在my.cnf配置加
[mysqld]
log-error=/var/log/mysql-error.log
- show full processlist
可以用select * from information_schema.processlist;替代,以便过滤
-
开启mysql运行的sql语句记录
-
查询最近一次死锁show engine innodb status\G;
//日志开启(日志输出到表:mysql.general_log)
SET GLOBAL log_output = 'TABLE'; SET GLOBAL general_log = 'ON';
Select * from mysql.general_log;