核心原因是pid-file所在目录不存在或mysql用户无写权限;需先用mysqld --print-defaults查配置路径,再确认父目录存在、属主为mysql且权限为755,同时检查/run分区空间与inode是否耗尽。

MySQL 5.7 启动报 “Can’t create/write to file … No such file or directory” 的核心原因,90% 是 pid-file 所在目录不存在,或存在但 mysql 用户无写权限。
确认 pid-file 配置路径是否真实存在
不要直接猜路径。先查配置:
- 运行
mysqld --print-defaults | grep pid-file,或打开/etc/my.cnf(或/etc/mysql/my.cnf),定位[mysqld]段下的pid-file值,例如:pid-file = /var/run/mysqld/mysqld.pid - 检查该路径的父目录是否存在:
ls -ld /var/run/mysqld—— 若提示No such file or directory,说明目录根本没创建 - 若目录存在但属主不是
mysql(比如是root:root),mysqld进程将无法在其中创建文件
创建目录并正确授权给 mysql 用户
必须用 mysql 用户身份操作,不能只改权限不改归属:
- 创建缺失目录:
sudo mkdir -p /var/run/mysqld - 设置归属:
sudo chown mysql:mysql /var/run/mysqld(-R不必要,这里只是单层目录) - 设置最小必要权限:
sudo chmod 755 /var/run/mysqld(777是安全隐患,755已足够) - 注意:
/var/run在多数现代系统(如 systemd)中是tmpfs,重启即清空 —— 所以仅 mkdir 一次不够,需配合RuntimeDirectory=mysqld写入 service unit 文件,或改用/run/mysqld(推荐)
验证磁盘与 inode 是否真有空间
即使目录存在、权限正确,mysqld 仍可能静默失败:
- 检查
/run分区容量:df -h /run—— 默认只有几十 MB,满后报No space left on device,但错误日志未必明说 - 检查 inode 是否耗尽:
df -i /run—— tmpfs 下 inode 耗尽也会导致写入失败 - 清理残留:
sudo ls -lt /run/mysqld/,删掉旧的.pid、.sock或空子目录(别删正在用的) - 临时扩容(仅调试用):
sudo mount -o remount,size=256M /run;要持久化,得写进/etc/fstab或 systemd.mountunit
避免残留 PID 文件干扰启动
目录和权限都对了,但服务仍拒绝启动,大概率是“假死”残留:
- 查是否有残留进程:
ps aux | grep mysqld | grep -v grep - 检查
pid-file是否已存在但对应进程已退出:sudo cat /var/run/mysqld/mysqld.pid,再用kill -0 <pid></pid>验证进程是否存活 - 安全清理方式:
sudo rm -f /var/run/mysqld/mysqld.pid(不要删整个目录) - 切勿盲目执行
rm -rf /var/lib/mysql/*—— 除非你确定这是全新初始化且无任何有效数据
真正容易被忽略的是 /run 的 tmpfs 特性:它不随 reboot 持久,也不计入 du 统计,但会实实在在卡住启动。每次排查前,先跑一遍 df -h /run 和 df -i /run,比反复 chmod 更有效。


















