美文网首页PHP相关
MySql事务- Lock wait timeout excee

MySql事务- Lock wait timeout excee

作者: 飞翼_U | 来源:发表于2017-04-12 17:55 被阅读4787次

    背景:现网报环境很慢,提交没有响应。
    日志:Lock wait timeout exceeded; try restarting transaction

    解决方法

    1.查看数据库当前的进程
    mysql> show  processlist;
    

    看一下有无正在执行的慢SQL记录线程。

    2.查看当前的事务
    #当前运行的所有事务
    mysql> SELECT * FROM information_schema.INNODB_TRX;
    
    #当前出现的锁
    mysql> SELECT * FROM information_schema.INNODB_LOCKs;
    
    #锁等待的对应关系
    mysql> SELECT * FROM information_schema.INNODB_LOCK_waits;
    

    解释:看事务表INNODB_TRX,里面是否有正在锁定的事务线程,看看ID是否在show processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。

    搜索的结果是在事务表发现了很多任务,这时候最好都kill掉。

    3.批量删除事务表中的事务

    我这里用的方法是:通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令。

    mysql>  select concat('KILL ',id,';') from information_schema.processlist where user='cms_bokong';
    +------------------------+
    | concat('KILL ',id,';') |
    +------------------------+
    | KILL 10508;            |
    | KILL 10521;            |
    | KILL 10297;            |
    +------------------------+
    18 rows in set (0.00 sec)
    

    当然结果不可能只有3个,这里我只是举例子。参考链接上是建议导出到一个文本,然后执行文本。而我是直接copy到记事本处理掉 ‘|’,粘贴到命令行执行了。都可以。
    kill掉以后再执行SELECT * FROM information_schema.INNODB_TRX; 就是空了。

    这时候系统就正常了

    3.故障排查(什么原因引起的)
    3.1mysql都是autocommit配置
    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    |            0 |
    +--------------+
    1 row in set (0.00 sec)
    mysql>
    

    如果是0 ,则改为1,set global autocommit=1;

    3.2mysql的引擎检查

    ,可以检查一下数据库引擎是不是InnoDB(mysql5.5.5以前默认是MyISAM,mysql5.5.5以后默认是InnoDB)

    show ENGINES; #检查命令
    

    如果不是的话改为 InnoDB :

    #查看表使用的存储引擎
    show table status from db_name where name='table_name';
    #修改表的存储引擎
    alter table table_name engine=innodb;
    

    为什么用InnoDB呢,参考 MYSQL的存储引擎


    我检查后发现数据库的配置都是符合要求的,那为什么还会事务失败呢,只能分析数据库语句了,使用慢查询分析。参考 慢日志分析工具—mysqldumpslow 和 mysqlsla.

    相关文章

      网友评论

        本文标题:MySql事务- Lock wait timeout excee

        本文链接:https://www.haomeiwen.com/subject/gvlmattx.html