mysql启动失败主因是pid-file父目录不存在、权限不足或磁盘/tmpfs空间耗尽;需用mysqld --print-defaults查路径,ls -ld验证目录存在性与属主,sudo -u mysql touch测试写入,并统一pid-file与datadir到同一可写目录。

MySQL 启动时根本没跑起来,就卡在写 mysql.pid 这一步——这不是配置写错了,而是系统层面拦住了 mysqld 进程。
查 pid-file 路径是否真实存在且可写
别猜,先看 MySQL 实际读的是哪个路径:mysqld --print-defaults | grep pid-file。常见结果是 pid-file = /var/run/mysqld/mysqld.pid 或宝塔环境下的 /www/server/data/mysql.pid。
重点不是文件,是它的父目录:
- 运行 ls -ld /var/run/mysqld 或 ls -ld /www/server/data,若报 No such file or directory,说明目录压根没创建;
- 若目录存在但属主不是 mysql:mysql,或权限里缺 x(无法进入)或 w(无法写入),mysqld 就会静默退出;
- 用真实身份测试:执行 sudo -u mysql touch /var/run/mysqld/test.pid && rm /var/run/mysqld/test.pid,失败就定位到权限链断点。
为什么改了 chown 还是不行
三个高频漏点:
-
/www/server/data属主对了,但它的父目录/www/server权限太严(比如drwx------),mysql 用户进不去子目录; - SELinux 或 AppArmor 启用后拦截写操作,临时验证:运行
sudo setenforce 0再试启动; - 只改了属主没改组,而 mysqld 实际以
mysql:mysql身份运行,组权限缺失也会拒绝写入。
磁盘满和 tmpfs 空间不足容易被忽略
/run 和 /var/run 多数是 tmpfs,大小默认仅几十 MB,且不显示在 df -h 根分区统计里:
- 必须单独检查:
df -h /run和df -i /run,df -i耗尽比空间满更隐蔽; - 清理残留:
sudo ls -lt /run/mysqld/,删掉旧的.pid、.sock或空子目录; - 临时扩容(仅调试):
sudo mount -o remount,size=256M /run;要持久化,得写进 systemdRuntimeDirectory=mysqld或/etc/fstab。
my.cnf 中 pid-file 和 datadir 必须路径一致且可写
宝塔等面板默认 datadir = /www/server/data,但 pid-file 常留默认值 /var/run/mysqld/mysqld.pid——这个路径在宝塔环境通常不存在,也不归 mysql 管。
正确做法:
- 编辑
/www/server/mysql/my.cnf,在[mysqld]段显式写:pid-file = /www/server/data/mysql.pid; - 确保
/www/server/data/已通过前面步骤验证可写; - 删掉残留:
sudo rm -f /www/server/data/mysql.pid; - 绕过面板,用命令直启看真实错误:
/www/server/mysql/bin/mysqld --defaults-file=/www/server/mysql/my.cnf --user=mysql。
真正卡住的地方不是 mysql.pid 文件本身,而是从 / 开始每一级目录——只要其中任何一级不可访问,mysqld 就连进程都起不来。











