centos7中使用二进制文件部署的mysql
启动mysql 服务时一直提示
ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid)
不管是执行 systemctl start mysqld
还是执行support-file目录下的mysql.service start
按照网上能找到的方法(参考 mysql提示The server quit without updating PID file /usr/local/mysql/data/localhost.localdomain.pid_zhou75771217的博客-CSDN博客 )都尝试过还是报错
最后发现在/var/lib/目录下有个mysql 目录 里面竟然有个localhost.pid 文件
于是将my.cnf配置文件中的datadir 及 log-error 文件, pid-file 文件都指向该目录
即
保存后重新执行/usr/local/mysql/support-files/mysql.server start
竟然奇迹般的成功了
那么为什么会出现这种情况呢 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 程序
由于我是所有操作都是用root 用户执行的, (这是个坑)
而用root用户执行mysqld 跟mysqld_safe 不加–user=root参数 指定用户时会报错的
为了让mysqld_safe能过执行,需要对mysql.service文件进行一点点修改
还是在281行, 在执行mysqld_safe 时 我加入了 --user=root 参数
此时再执行 mysql.server start 终于看到了久违的SUCCESS!
再看下面的内容
此时localhost.pid 文件中保存的就是mysqld的pid
再查看 ps进程
可以看到存在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代码
再看wait_for_pid函数代码
通过注释可以看出: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 报错信息