zoukankan      html  css  js  c++  java
  • mysql数据库阻塞事务分析(thread_running突然升高)

    背景

    在MySQL生产环境使用中,肯定会遇到thread_running突然升高问题。thread_running突然升高原因有很多,常见是慢sql,慢sql一般通过show processlist就可已找出执行慢sql和执行的id,今天来说明下由于程序中事务未完成,而导致事务持有锁未释放,从而使thread_running突然升高的问题排查。

    解决方案

    查找问题事务

    当thread_running突然升高而show processlit看不到正在执行的慢sql时,则可以通过show engine innodb status中Lock waits for transactions片段去查看是否有正在执行中的事务(下面就是事务正在运行且持续20s),这种情况可能就是有问题的,但有可能不是真正的阻塞线程事务,一般阻塞线程的事务的执行时间是最长的,我们一般只需要把这个片段信息翻到最下面就可以找到有问题的事务,一般只需要将问题事务所在的线程id kill掉即可。

    
    ---TRANSACTION 1949, ACTIVE 20 sec
    
    

    查找阻塞事务执行的sql

    查找阻塞事务执行的sql目的是为了方便定位程序哪个部分是有异常的(需要在被kill掉之前进行查找)。程序员在事务运行过程中做了一些其他操作,比如外部服务网络请求(由于是外部服务我们没办法进行控制,一次网络请求超时就会导致事务运行时间边长)。

    查找阻塞事务的sql可以参考mysql手册中14.16.2章节,通过下列sql即可查出阻塞事务执行的sql。(从show engine innodb status中看到active的事务的thread_id就是表threads的PROCESSLIST_ID)

    
    SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 6;
    
    
    
    SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_history
    
    WHERE THREAD_ID = 28 ORDER BY EVENT_ID;
    
    
  • 相关阅读:
    linux下使用OpenCV的一些问题
    Google Colab调用cv2.imshow奔溃
    [LeetCode] Word Search
    信号
    信号
    [Leetcode] Subsets
    [LeetCode] Combinations
    [LeetCode] Minimum Window Substring
    [LeetCode] Set Matrix Zeroes
    sigaction 函数
  • 原文地址:https://www.cnblogs.com/MakeInstall/p/15202011.html
Copyright © 2011-2022 走看看