思路比较简单,打开Mysql Event 定时任务框架,定时执行show processlist;并将结果存储至Mysql。
一、记录慢查询
1.1 打开Mysql Event管理器
SET GLOBAL event_scheduler = ON;
1.2 查询任务调度器是否已经打开
SHOW VARIABLES LIKE 'event_scheduler';
1.3 创建记录表
CREATE TABLE `processlist` (
`ID` int(11) DEFAULT NULL,
`USER` varchar(255) DEFAULT NULL,
`HOST` varchar(255) DEFAULT NULL,
`DB` varchar(255) DEFAULT NULL,
`COMMAND` varchar(255) DEFAULT NULL,
`TIME` bigint(20) DEFAULT NULL,
`STATE` varchar(255) DEFAULT NULL,
`INFO` text,
`date` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1.4 新建定时任务
use iios_tmp;
DROP EVENT schedule_showprocess;
CREATE EVENT IF NOT EXISTS schedule_showprocess
ON SCHEDULE EVERY 2 SECOND
DO insert into iios_tmp.`processlist` ( select *, now() as `DATE` from information_schema.processlist where INFO is not null and DB is not null and HOST !="%" and STATE !="executing");
SHOW EVENTS
1.6 查询事件执行结果
二、结果分析
明显看到存在很多超过60秒的全查询SQL语句,导致的DB死锁。fix it。