mysqld会陷入循环吗?

mysqld会陷入循环吗?,mysql,Mysql,我有一个每天晚上运行的批处理作业。它将几十个数据库中的某些新数据收集到一个中央数据库(名为“ac”)中,然后与SphinxSearch一起用于自动完成。批处理作业及其查询已经可靠地工作了一年多 今天我发现批处理作业被卡住了。mysqld在一个内核上使用了100%的CPU,而一个通常需要5分钟的查询在13小时后仍在运行 dtruss显示mysqld不断地从查询中涉及的数据文件中读取数据。相关索引都在mysqld的缓存中。没有磁盘IO,因为mysqld只读取数据文件,它们由FreeBSD缓冲在内存中

我有一个每天晚上运行的批处理作业。它将几十个数据库中的某些新数据收集到一个中央数据库(名为“ac”)中,然后与SphinxSearch一起用于自动完成。批处理作业及其查询已经可靠地工作了一年多

今天我发现批处理作业被卡住了。mysqld在一个内核上使用了100%的CPU,而一个通常需要5分钟的查询在13小时后仍在运行

dtruss显示mysqld不断地从查询中涉及的数据文件中读取数据。相关索引都在mysqld的缓存中。没有磁盘IO,因为mysqld只读取数据文件,它们由FreeBSD缓冲在内存中

编辑:同样相关:dtruss似乎表明mysqld在很多小时内没有任何东西可以写入ac.ac_原理图

USE wxyz;

CREATE OR REPLACE VIEW ac_view AS SELECT 
  j.id AS pid, j.parent AS ppid, 
  table_a.name AS name_a,
  table_d.name AS name_d,
  table_s.name AS name_s
FROM junction j
  INNER JOIN table_a ON table_a.id=j.aid
  INNER JOIN table_d ON table_d.id=j.did
  INNER JOIN table_s ON table_s.id=j.sid
WHERE s.inserted > '2010-12-21 03:00:00';

INSERT IGNORE INTO ac.ac_schematic 
      (pid, ppid, aid, did, sid)
SELECT pid, ppid, aid, did, sid
FROM ac_view v
  INNER JOIN ac.dict_a a ON a.name=v.name_a
  INNER JOIN ac.dict_d d ON d.name=v.name_d
  INNER JOIN ac.dict_s s ON s.name=v.name_s;
mysqld正在读取的文件包括:

  ac/ac_schematic.MYD (more than anything)
  wxyz/junction.MYD
  wxyz/table_a.MYD
  wxyz/table_d.MYD
  wxyz/table_s.MYD
服务器版本为5.0.87

这很奇怪,我很困惑。查询不可能需要超过12个小时的CPU时间。我打赌我可以让查询无限期地运行,同时CPU表也会固定


有什么想法我可以检查一下,看看到底发生了什么。我有一个非常好的堆Dtrace工具可用。

很可能它卡在一个特定的查询或一组查询上。(这些年来,我见过这种情况发生过几次——通常都是毫无理由的。)


因此,第一个好的调用点是使用“”SQL查询来显示当前正在执行的查询。

Yep。当您达到某个神奇的极限(缓冲区大小、记录计数、内存中临时表计数)时,查询可以从瞬间变为秒,或者从分钟变为小时(或更多)。你可能刚刚到达了一个临界点,在这个临界点上,一切都在下降。Show processlist(或Show full processlist)将帮助您找出问题所在,并从那里缩小范围。毫无疑问,从昨天晚上开始运行的查询是什么。这就是问题所在。@MBCook:我怀疑这是缩放曲线中的感染点。它会在今天之前显现。此外,也没有任何震荡的迹象:CPU只是从缓存和缓冲数据文件中读取数据。此查询的连接部分应该很快完成,因为它所在的数据库
wxyz
是较小的数据库之一。