1、MySQL出现lock wait timeout exceeded; try restarting transaction
我们可以通过到information_schema 中来进行查找被锁的语句。
解释:information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。
我们可以用下面三张表来查原因:
innodb_trx
当前运行的所有事务innodb_locks
当前出现的锁innodb_lock_waits
锁等待的对应关系
如果数据库中有锁的话,我们可以使用这条语句来查看:
select * from information_schema.innodb_lock_waits;
# 当前出现的锁
select * from information_schema.innodb_locks;
# 当前运行的所有事务
select * from information_schema.innodb_trx;
# 当前线程详情
show full processlist;
SELECT * FROM information_schema.innodb_trx
LOCK WAIT为占用系统资源的语句,我们需要杀掉这个锁,执行 kill 线程id号。 trx_mysql_thread_id 为 72257977, 所以我们执行:kill 72257977杀掉这个MySQL语句的线程即可
终极方法
如果以上方法杀掉线程,但还是不能解决,则我们就可以查找执行线程用时比较久的用户,然后直接干掉。mhsj_user为数据库业务运行的用户
SELECT * from information_schema.`PROCESSLIST` WHERE Time > 1000 AND USER = 'mhsj_user' ORDER BY TIME desc;
kill 72233587
这样把所有耗时比较久的任务干掉,就可以解决这个问题了。
锁超过时间修改
mysql数据库采用InnoDB模式,一旦数据库锁超过innodb_lock_wait_timeout参数设置的锁等待的时间(默认50s)就会报错。
> SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50 |
+--------------------------+-------+
解决方法
1 通过语句修改参数
set innodb_lock_wait_timeout=100;
set global innodb_lock_wait_timeout=100;
2 修改配置文件参数项目
# my.cnf文件:
innodb_lock_wait_timeout = 100
注意:
修改参数需要慎重。全局更改,等待时间加长,容易使等待事务增多导致堆积问题。
推荐:
对于耗时任务,进行合理拆分,减少等待时间。
找到缩表的业务,对业务代码进行分析,优化。从根本解决问题。
转载请注明:梦绘设计 » 数据库 » 关于MySQL的lock wait timeout exceeded解决方案
版权声明
本站《作品展示》类文章均为原创,转载必须注明出处,技术分享类文章部分来源于网络,版权归原作者所有,若侵权请留言。