这类问题我又碰上了一次。每天凌晨三点同时跑 sitemap 生成和 mysqldump,生成任务常在 wp_posts 上等锁,跑完要四十分钟,文件里还出现重复的 lastmod。

排查方向其实有限,先把可能性排一排。备份对表加读锁,生成查询被阻塞在锁等待上;生成任务用长事务逐条查附加字段,锁持有时间被拉长;两个任务都排在整点,没有任何错峰。

先看当前锁等待情况

mysql -e "SHOW ENGINE INNODB STATUS\G" | grep -A5 'LATEST DETECTED'

随后把生成任务挪到两点半

crontab -l | sed 's/0 3 \* \* \*/30 2 * * */'

生成时只查必要字段

SELECT ID, post_modified FROM wp_posts WHERE post_status='publish';

剩下的就是备份改成单表事务

mysqldump --single-transaction -u root -p wp > wp.sql

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

白天有业务在跑,能验证的部分都压到了晚上做。

恢复的判定其实很直接。生成耗时从四十分钟降到五分钟内,锁等待记录消失,文件条数和时间分布都恢复正常。

错峰只能缓解,表已经很大时把生成改到只读从库更稳。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189