mysqld会陷入循环吗?

时间:2010-12-22 17:15:30

标签: mysql

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

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

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

编辑:也相关:dtruss似乎表明mysqld在几个小时内没有写入ac.ac_schematic的任何内容。

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工具。

1 个答案:

答案 0 :(得分:2)

可能会遇到特定查询或一组查询。 (多年来我发现这种情况发生了几次 - 通常没有任何理由。)

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