我们运行一个有大量读写的大型论坛,特别是对于 innodb 的posts
和topics
表。
上周我开始使用 innobackupex 进行 12 小时备份,因为 mysqldump 只需要永远(posts
表中的 7+ 百万行)。似乎有些东西不喜欢这些备份,因为我每隔一天就会遇到一个反复出现的问题。
症状;
该站点的首页开始抛出错误
日志开始显示错误,例如Error: 126 - Incorrect key file for table '/tmp/mysql/#sql_4e87_14.MYI'; try to repair it
/tmp/ 目录已满,我们开始进入Error: 1030 - Got error 28 from storage engine
日志。
修复的唯一方法是optimize table
在每个帖子和主题表上。
我正在尽我所能阻止 MySQL 将磁盘用于临时表,但如果它也使用了我所有的内存,我会遇到比这更多的问题。
我的 my.cnf 在这里;https://gist.github.com/cbiggins/0aa26f6defb7a14541d7
盒子有 32GB 内存,我通常不会靠近。目前使用 15GB。
提前致谢。
更新 1:尽管 conf 看起来有复制,但没有。这是一个独立的实例。
更新 2:现在已经超过 24 小时没有进行备份,问题又出现了。所以这不是备份的结果。
更新 3:我现在使用 tmpfs 为 MySQL 提供了 20gb 的临时空间。说明在这里。打算看接下来的一段时间,看看情况如何。
更新 4:我发现了一个杀手查询!检查了 13 秒和 230 万行。同时执行 20 次,我很快就填满了新的 20GB 临时目录。我已经禁用了使用这个查询的块并向维护者提供了一些反馈。
我决定购买一个超级便宜的专用服务器来复制以从中运行备份。希望我们能看到我的正常运行时间再次攀升。:)
问题是 /tmp/ 已填满,MySQL 将一些文件放在那里。
MySQL 在处理子查询时可以做出的选择之一:
参考:MySQL 5.6 -子查询优化
您可以将其 (subquery_materialization_cost_based) 关闭,它将使用不同的策略。
参考:MySQL 5.6 -控制可切换优化
另一个选项是通过添加更多空间或让 MySQL 将其临时文件放在其他位置来防止 /tmp/ 被填满。