admin

关于MySQL的lock wait timeout exceeded解决方案

admin 数据库 2022-09-29 606浏览 0

1、MySQL出现lock wait timeout exceeded; try restarting transaction

我们可以通过到information_schema 中来进行查找被锁的语句。

解释:information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。

我们可以用下面三张表来查原因:

  • innodb_trx 当前运行的所有事务

  • innodb_locks 当前出现的锁

  • innodb_lock_waits 锁等待的对应关系

如果数据库中有锁的话,我们可以使用这条语句来查看:

#  锁等待的对应关系
  1. select * from information_schema.innodb_lock_waits;

  2. # 当前出现的锁

  3. select * from information_schema.innodb_locks;

  4. # 当前运行的所有事务

  5. select * from information_schema.innodb_trx;

  6. # 当前线程详情

  7. show full processlist;


SELECT * FROM information_schema.innodb_trx


2.jpg

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

注意:

修改参数需要慎重。全局更改,等待时间加长,容易使等待事务增多导致堆积问题。


推荐:

对于耗时任务,进行合理拆分,减少等待时间。

找到缩表的业务,对业务代码进行分析,优化。从根本解决问题。

版权声明

本站《作品展示》类文章均为原创,转载必须注明出处,技术分享类文章部分来源于网络,版权归原作者所有,若侵权请留言。