• binzhang
    2024-09-17 来自美国
    思考题里面1044这个thread值得怀疑 系统用户 没有显示具体是哪个db 在connect阶段 做flush tables操作。先杀这个试试。不知道为啥一个connect命令会触发flush table

    作者回复: 观察得很仔细,1044会话的用户和Command都比较特别。 其实这是一个SQL线程,Flush tables命令是从主库上复制过来的。 不过杀这个会话应该没有用,问题的根源是会话1657130执行的Select语句。

    
    1
  • 叶明
    2024-09-17 来自江苏
    会话 1842782 的 state 字段的完整信息是不是 Waiting for table flush? 从 id 和 time 字段来分析这个过程执行的顺序: 首先,会话 1657130 中的语句被执行,Time 达到 184551 秒,查询语句是聚合语句,说明这是一个大查询,在查询执行期间,语句中涉及到的表会被打开,且持有 MDL 读锁。 其次,可能执行了一个类似 flush tables 的命令,导致有刷新表的操作,该操作要关闭并重新打开表,因为会话 1842782 在执行大查询,表处于打开状态,因此发生冲突,从而进入等待状态 最后,会话 1842782 对该表中记录进行变更,从 state 来看,该会话处于等待状态,看来是被执行 flush tables 的会话 1044 所阻塞 会话 1044 中的 flush table 操作与大查询冲突,导致后续涉及到该表的读写操作的会话都陷入阻塞。

    作者回复: state就是Waiting for table,这是5.1版本中的一个状态。 你的分析完全正确。👍👍 分析processlist时,一般可以通过Time字段来判断哪个事件发生在前面,哪个事件发生在后面,以此来定位问题的根源。

    
    