我有一个每晚运行的批处理作业。它将几十个数据库中的某些新数据收集到一个中央数据库(名为"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工具可用。
发布于 2010-12-23 01:26:29
它很可能会卡在一个特定的查询或一组查询上。(多年来,我已经看到这种情况发生过几次--通常没有任何原因。)
因此,一个好的第一个调用点是使用"SHOW PROCESSLIST;“SQL查询来显示当前正在执行的查询。
https://stackoverflow.com/questions/4511729
复制相似问题