在 Linux 系统中,/var/run/
目录通常是用于存储运行时数据(如 PID 文件、锁文件等),而这个目录在系统重启时通常会被清理(它位于临时文件系统 tmpfs
上)。因此, /var/run/mysqld/
目录在每次重启后会丢失,导致 MySQL 启动时无法找到它。
为了解决这个问题,我们可以通过以下几种方法确保 /var/run/mysqld/
目录在重启后始终存在:
1. 使用 tmpfiles.d
配置文件自动创建目录
通过 tmpfiles.d
配置文件,可以确保 /var/run/mysqld/
目录在系统启动时自动创建,并设置正确的权限。这种方法不依赖于系统重启后的手动干预。
步骤:
-
创建 tmpfiles 配置文件
在
/etc/tmpfiles.d/
目录下创建一个新的配置文件,例如mysql.conf
,并添加以下内容:d /var/run/mysqld 0755 mysql mysql -
这行配置告诉系统在每次启动时创建
/var/run/mysqld
目录,并设置该目录的权限为0755
,并确保它的所有者和组是mysql
。 -
重载 systemd 配置
为了使新配置生效,执行以下命令:
sudo systemd-tmpfiles --create
这将立即执行
tmpfiles.d
配置,并确保/var/run/mysqld
目录已创建。 -
重新启动 MySQL 服务
现在,目录应该已经自动创建,尝试重新启动 MySQL 服务:
sudo systemctl restart mysqld
2. 使用 systemd
服务管理目录
如果 tmpfiles.d
配置不起作用,另一种方法是使用 systemd
来确保 MySQL 启动时创建该目录。
步骤:
-
修改 MySQL 服务文件
找到并编辑 MySQL 的
systemd
服务单元文件,通常是/etc/systemd/system/mysqld.service
或/lib/systemd/system/mysqld.service
。如果没有找到此文件,使用systemctl status mysqld
查找具体位置。 -
编辑服务文件
打开该文件并找到
[Service]
部分,添加以下内容:[Service] ExecStartPre=/bin/mkdir -p /var/run/mysqld ExecStartPre=/bin/chown mysql:mysql /var/run/mysqld
这两个命令确保在启动 MySQL 之前创建
/var/run/mysqld
目录并设置正确的权限。 -
重新加载
systemd
配置并重启 MySQL执行以下命令使更改生效:
sudo systemctl daemon-reload sudo systemctl restart mysqld
3. 将目录移到一个持久化位置
如果你希望 /var/run/mysqld/
目录在重启时不丢失,可以考虑将该目录移动到一个不会被清理的持久化目录,例如 /var/lib/mysql/
。
步骤:
-
创建一个新的目录
创建一个新的目录并为 MySQL 分配适当的权限:
sudo mkdir -p /var/lib/mysql/mysqld sudo chown mysql:mysql /var/lib/mysql/mysqld
-
修改 MySQL 配置文件
编辑
/etc/my.cnf
或/etc/mysql/my.cnf
配置文件,将pid-file
的路径更改为新的目录:[mysqld] pid-file = /var/lib/mysql/mysqld/mysqld.pid
-
重启 MySQL 服务
修改完成后,重启 MySQL 服务:
sudo systemctl restart mysqld
总结
- 方法 1:使用
tmpfiles.d
配置文件确保/var/run/mysqld
目录在系统启动时自动创建。 - 方法 2:在 MySQL 服务的
systemd
配置中加入创建目录和设置权限的步骤。 - 方法 3:将
/var/run/mysqld
目录移动到持久化的目录,如/var/lib/mysql/mysqld
,并修改 MySQL 配置。
推荐使用 方法 1,因为它更简单且符合 Linux 系统管理的最佳实践。