CentOS 7.9 上 MySQL 5.7 起不来,error log 里是 Can't create/write to file '/tmp/#sql_xxx.MYI' (Errcode: 13 - Permission denied),/tmp 权限是 1777,用 root 手工 touch 也正常。

一开始怀疑是「tmpdir 指向了一个只有 root 能写的目录」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。/tmp 被挂成了 noexec 和 nosuid,mysql 用户写临时文件被拒。另一种情况是SELinux 的 mysqld_tmp_t 上下文丢失,写入被 audit 拦下。

还有一种情况,磁盘写满后内核返回 EACCES,日志看起来像权限问题。

先看挂载选项和剩余空间

findmnt -T /tmp -o TARGET,OPTIONS && df -h /tmp

接着用 mysql 用户的身份实际写一次

sudo -u mysql touch /tmp/mysql_test && ls -l /tmp/mysql_test

再往下检查 SELinux 的拒绝记录

ausearch -m avc -ts recent | grep mysqld

恢复上下文或改到专用目录

restorecon -Rv /tmp && grep -n tmpdir /etc/my.cnf

当时还开着另一个排查窗口,两边日志对照着看才定位到。

同一份数据我导出了两份,一份留底,一份拿来试。

改完先别撤,确认这几项。mysqld 正常启动,error log 里不再出现 Errcode 13,跑一个带 GROUP BY 的查询能正常生成临时表。

提醒一点。临时目录单独划一块盘更稳,既避开 /tmp 的挂载限制,也不会和系统临时文件互相挤占。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189