启动Mysql一直提示ERROR! The server quit without updating PID file

启动mysql 服务时一直提示

ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid)

不管是执行 systemctl start mysqld

都提示ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid)

1.png

还是执行support-file目录下的mysql.service start

2.png

按照网上能找到的方法(参考 https://blog.csdn.net/zhou75771217/article/details/82893997 )都尝试过还是报错

最后发现在/var/lib/目录下有个mysql 目录 里面竟然有个localhost.pid 文件

3.png

于是将my.cnf配置文件中的datadir 及 log-error 文件, pid-file 文件都指向该目录

4.png

保存后重新执行/usr/local/mysql/support-files/mysql.server start

竟然奇迹般的成功了

5.png

那么为什么会出现这种情况呢 datadir , log-error ,pid-file 的路径为什么是/var/lib/mysql

而不是执行初始化时指定的 /usr/local/mysql/data 目录

出现该问题的原因,

很有可能是 在部署二进制mysql, 使用yum rpm 安装过mysql (其实就是这个问题)

重新新建了一台虚拟机,重新部署就没有出现过该问题

(事情并没有这么简单,新装的虚拟机启动mysql服务时依旧提示pid-file错误)

经过近1天的研究终于找到了问题所在!!!

注意:support-files目录下的mysql.server 执行的是 mysqld_safe 而不是 mysqld

使用vim查看mysql.server的内容

找到第281 可以看出,执行参数start,运行的是$bindir目录下的/mysqld_safe 程序

6.png

由于我是所有操作都是用root 用户执行的, (这是个坑)

而用root用户执行mysqld 跟mysqld_safe 不加–user=root参数 指定用户时会报错的

7.png

为了让mysqld_safe能过执行,需要对mysql.service文件进行一点点修改

还是在281, 在执行mysqld_safe 我加入了 –user=root 参数

8.png

此时再执行 mysql.server start 终于看到了久违的SUCCESS!

9.png

再看下面的内容

10.png

此时localhost.pid 文件中保存的就是mysqld的pid

再查看 ps进程

11.png

可以看到存在2个进程mysqld_safe 与 mysqld

归根结底:出现该错误的原因就是由于我在root用户下部署导致的,

如果不想修改mysql.server 文件的话建议还用新建mysql 用户运行

顺便说一句:修改完mysql.server 文件后, 成功运行mysql 服务用的都是系统自带的默认参数, 因为我压根就没创建 my.cnf 文件!

启动报错跟my.cnf 文件中的配置信息也无关!

注意:pid-file文件是在系统中有mysql服务在运行时才会生成,mysql服务没有运行的情况下找不到PID文件也是正常的!!!

——————————————————————————————————————————————————-

那么为什么会一直提示 ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid) 这个错误的

通过分析mysql.server 文件

下面是部分shell代码

12.png

再看wait_for_pid函数代码

13.png

通过注释可以看出:wait_for_pid 需要3个参数

第一个参数verb 可选值为 create | removed 创建或删除 pid-file

第二个参数pid 为mysqld 运行时的PID

第三个参数pid_file_path 为 pid-file 文件的路径

注意看184 行到199行的代码

通过注释可以看出,如果mysqld 服务没有运行的话, pid-file 文件 将不会被更新

196行调用了log_failure_msg 输出了我们熟悉的错误信息 The server quit without updating PID file (/usr/local/mysql/data/localhost.pid)

由于没有运行mysqld服务, 没有对应的PID, 也就无法创建对应的pid文件,

因此就出现了那句 我们熟悉的 The server quit without updating PID file (/usr/local/mysql/data/localhost.pid) 错误信息

这就是为什么每次都出现那句PID file 报错信息

进一步分析mysql.server 的代码

在调用wait_for_pid 函数时第一个参数是removed

可以看出 pid-file 文件 在执行mysql.server stop 时会被删除掉

14.png

———————————————————————————————————————————————————

附:查看pid-file文件的方法

登录mysql 执行 show variable like ‘pid_file'; 查看pid 文件路径

15.png

查看mysqld 运行时的PID

可以使用pidof 查看mysqld的pid

16.png

启动Mysql一直提示ERROR! The server quit without updating PID file

转载请注明来源:幽幽过客_{启动Mysql一直提示ERROR! The server quit without updating PID file}