aboutUseServiceToControlMysqld
通常是通过 service 这个指令来控制 mysql 的. 作为一条有梦想的咸鱼. 只使用 service 而不用 mysql 原始指令, 这怎么能行( ̄▽ ̄)*. 所以就试了试 (作死) 使用 mysql 原生的指令来控制. 试了试发现, 其实还是有一些坑的.
No zuo no die.
mysqld
根据 mysql 官方文档 4-3 节开头的:
This section describes mysqld, the MySQL server, and several programs that are used to start the server.
可知 mysqld 就是 mysql 的服务端.
mysqld_safe
mysqld_safe is the recommended way to start a mysqld server on Unix. mysqld_safe adds some
safety features such as restarting the server when an error occurs and logging runtime information to
an error log
一中附带一些功能的 mysqld
mysql.server
MySQL distributions on Unix and Unix-like system include a script named mysql.server, which starts
the MySQL server using mysqld_safe. It can be used on systems such as Linux and Solaris that use
System V-style run directories to start and stop system services. It is also used by the macOS Startup
Item for MySQL.
一个使用 mysqld 的脚本.
Zuo
一开始我是想 service 关闭之后直接 mysqld 的, 结果 mysqld 并不建议使用 root 启动:
2020-03-11T09:19:32.477114Z 0 [ERROR] [MY-010123] [Server] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
2020-03-11T09:19:32.477401Z 0 [ERROR] [MY-010119] [Server] Aborting
google 了一下, 需要指定--user=root
, 但是不能正常运行, 为什么呢? 查了一下 log
Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock.
于是又 google 了一下, 简单的方案是创建 /var/run/mysqld/ 这个文件夹. 这个文件夹的用处是:
This directory was once intended for system information data describing the system since it was booted. These functions have been moved to /run; this directory exists to ensure compatibility with systems and software using an older version of this specification.
好像有点不妙… 为什么需要我来创建? 这时候我有点明白为什么答案大多都是使用 service 启动了.
结果是正常运行了. 但是表现很奇怪, 首先是进程无反应. 好像一直在等待输入. 但是用其他的 ssh 上去试 mysql 的功能是正常的. 并且把当前 ssh 关了也是正常的.
这时候我准备试试关闭了, 查了一下, 比较推荐的方案是 mysqladmin -u root -p shutdown
, 使用了之后输入 mysql root 密码就好了. 关闭也比较正常. 但是当我再使用 service 启动时候, 问题出现了.
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2020-03-11 16:42:24 CST; 17min ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 8961 ExecStart=/usr/sbin/mysqld (code=exited, status=1/FAILURE)
Process: 8926 ExecStartPre=/usr/share/mysql-8.0/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 8961 (code=exited, status=1/FAILURE)
Status: "Server startup in progress"
Error: 13 (Permission denied)
CPU: 343ms
Mar 11 16:42:24 VM-0-13-debian systemd[1]: Starting MySQL Community Server...
Mar 11 16:42:24 VM-0-13-debian systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE
Mar 11 16:42:24 VM-0-13-debian systemd[1]: Failed to start MySQL Community Server.
Mar 11 16:42:24 VM-0-13-debian systemd[1]: mysql.service: Unit entered failed state.
Mar 11 16:42:24 VM-0-13-debian systemd[1]: mysql.service: Failed with result 'exit-code'.
看了看 log 文件, 没什么头绪, google 了一下没有任何成果
mysqld: File './binlog.index' not found (OS errno 13 - Permission denied)
看到 permission denied 的时候, 突然想了想, 去 /var/lib/mysql 下去看看, 原来经过之前的 root 登录. 其中一些文件所有者已经被改成 root 了 (我不完全确定是这个原因, 但是好像只有这个原因了) 后 chown 更改所有者后变正常了.
这时候我又想了想. service 是如何启动的呢? 它是用 mysql 这个用户启动的么? 我想尝试切换程 mysql 来试试, 但是 su 后无改变, whoami 依旧是 root , 我还以为长久不切其他用户, 用错了指令, 但是好像并不是这样. 我想了想. 去看看 /etc/password, 然后发现了这一行
mysql:x:107:112:MySQL Server,,,:/var/lib/mysql:/bin/false
哦. 怪不得, mysql 用户好像被做了限制, 所以我改成 /bin/bash 之后达到了预期的效果.
但是 mysqld 的执行并不如人意.
13 2020-03-11T09:22:14.311301Z 0 [ERROR] [MY-010273] [Server] Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock. 12 2020-03-11T09:22:14.311311Z 0 [ERROR] [MY-010268] [Server] Unable to setup unix socket lock file.
:( 它又要我创建文件. 那算了吧. 如果每启动次我都需要创建一次的话, 那未免也太低效了…
(PS: 其实中途的时候我没注意我登录的用户, 因为是多窗口, 我不小心把内网的主机的 mysql 给关了! (;´д`)ゞ谢天谢地, 还好是内网. 我关闭的时候是直接查进程 kill 的, 导致 mysql.sock 文件依旧在, 还出了点小问题. 但是问题又来了! 我用 mysql 居然能登录, 还能正常 SQL !!! w(゚Д゚)w.什么鬼… 这或许和之前 mysqld 的行为有关系)