我需要限制 MySQL tmpdir 的磁盘使用量,这样它就不会“吃掉”所有可用的磁盘空间。大约有 30G 可用空间,但我看到 mysqld 使用了所有空间来创建临时表。
我的第一个方法是实施磁盘配额,但遇到了问题,因为我不知道如何在磁盘使用时设置配额。也许可以在启动时在 init 脚本中完成,但我不知道这是否是个好主意。
有什么建议吗?在这种情况下最佳做法是什么?
操作系统是 RedHat
uname -a
Linux www.myservername.com 2.6.18-194.17.1.el5 #1 SMP Mon Sep 20 07:12:06 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
mysql --version
mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (x86_64) using readline 5.1
答案1
你确定吗?据我所知,临时表的存在时间与查询所需时间一样长,但之后它们就会消失。如果你有许多活动查询需要 30GB 的临时表,那么这会给你带来比使用所有可用空间(我的意思是磁盘 IO 等)更多的麻烦。
您仍然可以使用 ulimit,但至少需要重新启动服务,所以我不确定这是否比设置配额更好。
答案2
如果您有 LVM,请创建一个所需大小的单独分区。您可以使用 mysqld 的 --tmpdir 选项。
检查一下。http://dev.mysql.com/doc/refman/5.0/en/temporary-files.html
答案3
在虚拟机中尝试多次后,我认为在生产环境中强制使用配额 (-m) 的风险太大。由于我负责管理这个基础设施,所以这个问题只发生过一次,我怀疑这一定与服务器中创建巨大临时表的可疑查询有关。
感谢大家的建议。