我有一个每天晚上运行的批量作业。它将几十个数据库中的某些新数据收集到一个中央数据库(名为“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工具可用。