zoukankan      html  css  js  c++  java
  • 【MySQL】关于MySQL出现lock wait timeout exceeded 的解决方案

    关于MySQL出现lock wait timeout exceeded; try restarting transaction 的解决方案。

    一、问题抛出

    在做查询语句时,MySQL 抛出了这样的异常:

    MySQL server error report:Array
    (
        [0] => Array
            (
                [message] => MySQL Query Error
            )
    
        [1] => Array
            (
                [sql] => SELECT * FROM taobao_trade WHERE order_status = 1 and orderID ='2018061812306547' AND is_tran_success=0 for update
            )
    
        [2] => Array
            (
                [error] => Lock wait timeout exceeded; try restarting transaction
            )
    
        [3] => Array
            (
                [errno] => 1205
            )
    
    )

    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_trx

    clipboard.png

    图中红色语句 LOCK WAIT为占用系统资源的语句,我们需要杀掉这个锁,执行 kill 线程id号。上面这条记录的id为199120823069, trx_mysql_thread_id 为 738178711, 所以我们执行:kill 738178711杀掉这个MySQL语句的线程即可。

    执行之后:

    kill 738178711
    
    // 查询线程
    // SELECT * from information_schema.processlist WHERE id = 738178711;
    // show full processlist;

    clipboard.png

    其他的记录不需要关注,因为其他的记录状态为“RUNNING” 即正在执行的事务,并没有锁。

    三、三张表字段说明

    innodb_trx

    desc information_schema.innodb_trx;

    clipboard.png

    innodb_locks

    desc information_schema.innodb_locks;

    clipboard.png

    innodb_lock_waits

    desc information_schema.innodb_lock_waits

    clipboard.png

    四、终极方法

    如果以上方法杀掉线程,但还是不能解决,则我们就可以查找执行线程用时比较久的用户,然后直接干掉。

    SELECT * from information_schema.`PROCESSLIST` WHERE Time > 1000 AND USER = 'wonguser' ORDER BY TIME desc;
    
    kill 740097562

    这样把所有耗时比较久的任务干掉,就可以解决这个问题了。

    转自https://segmentfault.com/a/1190000015314171

  • 相关阅读:
    了解 NoSQL 的必读资料
    关于什么时候用assert(断言)的思考
    这次见到了一些大侠
    NetBeans 时事通讯(刊号 # 87 Jan 12, 2010)
    动态链接库dll,静态链接库lib, 导入库lib
    新女性十得 写得了代码,查得出异常
    记录系统乱谈
    新女性十得 写得了代码,查得出异常
    fullpage.js禁止滚动
    RunningMapReduceExampleTFIDF hadoopclusternet This document describes how to run the TFIDF MapReduce example against ascii books. This project is for those who wants to experiment hadoop as a skunkworks in a small cluster (110 nodes) Google Pro
  • 原文地址:https://www.cnblogs.com/Y-S-X/p/12234390.html
Copyright © 2011-2022 走看看