我有一个每晚都要运行的批处理作业。它将来自几十个数据库的某些新数据收集到一个中央数据库(名为“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工具。
答案 0 :(得分:2)
可能会遇到特定查询或一组查询。 (多年来我发现这种情况发生了几次 - 通常没有任何理由。)
因此,良好的第一个调用点是使用“SHOW PROCESSLIST;”SQL查询来显示当前正在执行的查询。