答案是直接修改临时路径而非删文件或扩容,因90%的“no space left on device”源于mysql安装卡在小分区/tmp或/var/tmp(如tmpfs仅ram/2大小或云主机仅2–4gb),需用df、rpm--showrc/apt-config和ls -ld定位后,通过tmpdir、apt/rpm参数或my.cnf中tmpdir/datadir指向大分区并同步权限与selinux上下文解决。

直接改临时路径,别删文件、别扩容、别重装——90% 的 No space left on device 根本不是磁盘真没空间,而是安装器卡在 /tmp 或 /var/tmp 这类小分区上。
为什么 df -h 显示有空间却报错?
MySQL 安装过程不看整机剩余空间,只认它实际写入的挂载点:
-
/tmp常是tmpfs(内存挂载),默认大小 = RAM / 2,几 GB 就爆 -
/var/tmp在很多云主机上只有 2–4GB - 初始化系统表、解压包、生成
ibdata1和日志文件,中间需要 3–8GB 临时空间
你 df -h / 看着有 50GB,但 df -h /tmp 可能只剩 100MB。
怎么快速定位卡在哪一个路径?
别猜,三行命令直接锁定瓶颈:
-
df -h | grep -E '(tmp|var|usr)'—— 找出/tmp、/var/tmp、/usr分区使用率 -
rpm --showrc | grep tmp(RHEL/CentOS)或apt-config dump | grep TempDir(Debian/Ubuntu)—— 确认包管理器默认用哪个临时目录 -
ls -ld /tmp /var/tmp—— 看是否为tmpfs类型,是的话删文件也没用,必须换路径
不重装,立刻绕过限制的实操方法
核心就一条:让安装器和 MySQL 启动时都避开小分区。
- 安装前设环境变量:
export TMPDIR=/data/tmp(确保该目录存在、权限为mysql:mysql、且不在tmpfs上) - APT 安装时强制指定:
sudo apt -o DPkg::Install::TempDir=/data/tmp install mysql-server - RPM 安装前建软链(慎用):
sudo ln -sf /data/tmp /var/tmp,需在rpm执行前完成,且重启后失效 - 安装完成后**必须立刻改配置**:在
my.cnf的[mysqld]段加:datadir = /data/mysql和tmpdir = /data/mysql-tmp,然后迁移数据、同步权限、检查systemd的ProtectHome是否拦住新路径
安装中断后残留的“幽灵文件”怎么清?
安装失败后,/tmp 下常留着被进程占用但已删的碎片,比如 #sql_*、mysql_install_db.*、ibtmp1,普通 ls 看不见,df 却显示满。
- 先查占用:
lsof +L1或lsof | grep deleted - 确认无活跃 MySQL 进程(
ps aux | grep mysqld)后再清理:sudo find /tmp -name "#sql_*" -mmin +30 -delete - 如果
ibtmp1占用大且版本 ≥ 5.7.30,可用ALTER TABLESPACE innodb_temp_tablespaces ENCRYPTION='N';释放;否则只能停服务后手动删再重启
真正容易被忽略的是:改完 datadir 后不修正 SELinux 上下文或 systemd 的路径保护,服务大概率起不来——这不是空间问题,是权限沙箱卡住了。











