mysql.sock不存在的根本原因是mysqld进程未运行或启动失败,因其是服务启动时动态创建的文件;需先用systemctl status确认服务状态,再检查配置路径、目录权限及客户端与服务端socket设置是否一致。

mysqld 进程没起来,mysql.sock 就不会存在
MySQL 服务不运行,mysql.sock 文件根本不会被创建——它不是安装时生成的静态文件,而是 mysqld 启动过程中由进程动态创建的。所以第一步永远是确认服务状态,而不是急着找文件或改配置。
- 运行
systemctl status mysql(Debian/Ubuntu)或systemctl status mysqld(RHEL/CentOS),看是否显示active (running) - 如果显示
inactive (dead)或failed,直接跳过找 sock 步骤,先解决启动失败问题 - 用
ps aux | grep mysqld辅助验证:没有mysqld主进程,说明服务压根没跑起来
/var/run/mysqld 或 /var/lib/mysql 目录权限不对,mysql.sock 写不进去
即使 mysqld 进程在跑,也可能卡在初始化阶段:日志里看不到错误,systemctl 显示“running”,但 mysql.sock 就是不出现。大概率是 socket 所在目录权限不对,mysqld 用户(通常是 mysql)没权限在目标路径下创建文件。
- 查配置中指定的 socket 路径:
mysqld --help --verbose 2>/dev/null | grep "socket",注意输出里带Default options的那行 - 确认该路径的父目录存在,且属主是
mysql用户:ls -ld /var/run/mysqld;如果不是,执行sudo chown mysql:mysql /var/run/mysqld - 目录权限至少需为
755;若为700且属主不是mysql,进程会静默失败
配置里 [mysqld] 和 [client] 的 socket 值不一致,连得上却报错
服务端能启动、mysql.sock 也生成了,但客户端仍报 Can't connect to local MySQL server through socket '/tmp/mysql.sock' ——这说明客户端默认找的路径和服务端实际写的不一致,不是文件丢了,是“各找各的”。
- 检查
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,确保[mysqld]和[client]段下的socket值完全相同(包括路径和文件名) - 特别注意:有些发行版(如 Ubuntu)默认把 socket 放在
/var/run/mysqld/mysqld.sock,但客户端仍固执地去/tmp/mysql.sock找 - 临时验证可用:
mysql --socket=/var/run/mysqld/mysqld.sock -u root -p;成功则证明路径不匹配是主因
重启后 mysql.sock 又消失,可能是 /tmp 被清理或 sticky 位缺失
如果 socket 路径设在 /tmp 下,且系统启用了 systemd-tmpfiles 或 cron 清理任务,mysql.sock 可能在重启或定时清理后被删掉。这不是 bug,是设计行为。
- 避免把 socket 放在
/tmp:改到/var/run/mysqld/或/var/lib/mysql/等持久路径更稳妥 - 若必须用
/tmp,给目录加 sticky 位:sudo chmod +t /tmp,防止非所有者删除 - 不要手动
touch或cp生成mysql.sock:它是 socket 类型文件(ls -l显示s开头),手动创建无效且可能阻塞服务
最常被忽略的一点:mysql.sock 是进程级产物,不是配置文件开关。一切排查都要从“mysqld 是否真在以预期配置运行”出发,而不是盯着文件是否存在本身。











