一、问题背景

开发环境的数据库服务器重启后,启动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`.