Linux服务器重启后mysqld.service未创建/var/run/mysqld
一、问题背景
开发环境的数据库服务器重启后,启动MySQl服务报错,错误如下:
[ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 2 - No such file or directory)
[ERROR] Can't start server: can't create PID file: No such file or directory
之前看到上面错误日志都是手动创建/var/run/mysqld
目录,然后将目录的属主修改为mysql用户,如下:
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
上面方式,每次服务器重启后都要重新执行,所以分析一下问题原因,探索一种永久的解决方案。
MySQL版本信息
mysql Ver 14.14 Distrib 5.7.10, for Linux (x86_64) using EditLine wrapper
二、问题原因
通过查找发现该问题是MySQL5.7的一个小bug,详见:
Bug #100506 mysqld.service does not create /var/run/mysqld after reboot
该问题的主要原因是/var/run目录是一个临时目录,存在于内存之中,系统重启后/var/run目录下的文件将会被擦除。
[root@develop log]# ll /var/run
lrwxrwxrwx. 1 root root 6 Sep 27 22:33 /var/run -> ../run
[root@develop log]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos00-root xfs 30G 22G 8.0G 74% /
devtmpfs devtmpfs 16G 0 16G 0% /dev
tmpfs tmpfs 16G 0 16G 0% /dev/shm
tmpfs tmpfs 16G 682M 15G 5% /run
从上面可以看出,/var/run
目录通过软连接挂载在/run
目录下,/run
目录文件系统类型为tmpfs
原因总结:
安装MySQL时,mysql-community-server-5.7.31-1.el7.x86_64 rpm 创建了/var/run/mysqld
目录,系统重启后这个目录被擦除了。
三、解决方案
方案一
使用tmpfiles.d
在系统启动的时候创建/var/run/mysqld
目录,tmpfiles.d简介。
在/usr/lib/tmpfiles.d
目录下创建mysql.conf
文件,文件内容如下:
d /run/mysqld 0755 mysql mysql -
或直接使用如下命令:
echo "d /var/run/mysqld 0755 mysql mysql -" > /usr/lib/tmpfiles.d/mysql.conf
操作系统重启后会根据/usr/lib/tmpfiles.d/mysql.conf
创建/var/run/mysqld
目录。
方案二
修改MySQL配置文件/etc/my.cnf
中的pid-file
的路径,文件内容如下:
datadir=/data/deploy/mysql/data
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 16M
table_open_cache = 2048
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 64
query_cache_size = 256M
max_connections = 1024
default-storage-engine=INNODB
lower_case_table_names=1
explicit_defaults_for_timestamp=true
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
character_set_server= utf8
将’pid-file文件路径修改为
/var/lib/mysql`.