安装完成 mysql 之后,每次启动和停止都很麻烦,有时候记不住去网上搜一下,看见大家都用 service 来进行服务的管理,试了一下,果然好用。推荐大家也要这么用。
启动和停止 mysql 服务
# 启动
/usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –plugin-dir=/usr/local/mysql/lib/plugin –log-error=/var/log/mysqld.log –pid-file=/var/run/mysqld/mysqld.pid –socket=/tmp/mysql.sock
# 停止
kill `cat /usr/local/mysql/var/mysqld.pid`
这样启动和停止需要记住 mysql 的路径和 pid 的保存位置,因此比较麻烦。
service 系统服务管理
service 命令用于管理系统服务,比如启动(start),停止(stop),重启(restart),查看状态(status)等。service 命令本身就是一个 shell 脚本,用于方便的调用该脚本来完成任务,它在 /etc/init.d/ 目录下查找指定的服务脚本。
相关的命令还有:
chkconfig:用于查看、设置服务的运行级别
ntsysv:用于设置服务的自启动
service 运行指定服务(称为 System V 初始脚本),只保留 LANG 和 TERM 两个环境变量,并设置当前路径为 /。如果一个服务脚本想要由 service 进行管理,至少需要支持 start 和 stop 命令,并将脚本保存在 /etc/init.d/ 目录下。
service 的使用方式
## 命令格式
Usage: service < option > | –status-all | [service_name [ command | –full-restart] ]
# 查看指定服务的命令行使用帮助
service <service>
## mysqld 举例
$ service mysqld
Usage: mysqld {start|stop|restart|reload|force-reload|status} [MySQL server options]
# 启动、停止、重启指定服务
service <service> start|stop|restart
## mysqld 举例 restart,即先执行 stop 再执行 start 命令
$ service mysqld restart
Shutting down MySQL.. [OK]
Starting MySQL. [OK]
# 显示指定服务的状态
$ service mysqld status
MySQL running (27390) [OK]
# 显示所有服务的状态
service –status-all
# 查看系统服务列表,以及每个服务的运行级别
chkconfig –list
# 设置指定服务开机时是否自动启动
chkconfig <service> on|off
# 以全屏幕文本界面设置服务开机时是否自动启动
# 必须以 root 启动,空格切换状态,tab 切换按钮,上下鼠标移动光标
ntsysv
除了用 mysqld 示例外,我们修改了主机名、IP 地址等信息时,也要经常重启网络生效,此时可以调用:
service network status|restart
用 service 管理 mysqld 服务
我们已经了解了基础的知识,现在就可以开始改造了,首先要在你的安装目录里找到 mysql.server 文件。
$ locate mysql.server
/usr/local/mysql/support-files/mysql.server
这个文件在安装时初始化,其实也就是一个脚本文件,支持输入不同的参数执行不同的功能,我们可以查看它的 start 函数:
# 根据输入的命令执行不同的脚本,首先判断是否为 start
case “$mode” in
‘start’)
# Start daemon
# Safeguard (relative paths, core dumps..)
cd $basedir
echo $echo_n “Starting MySQL”
# 查看该 bin/mysqld_safe 命令是否存在,如果不存在,就直接报错:找不到
if test -x $bindir/mysqld_safe
then
# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
# 直接执行 mysqld_safe 命令,并传入参数,然后创建 pid 文件
$bindir/mysqld_safe –datadir=”$datadir” –pid-file=”$mysqld_pid_file_path” $other_args >/dev/null &
wait_for_pid created “$!” “$mysqld_pid_file_path”; return_value=$?
# Make lock for RedHat / SuSE
if test -w “$lockdir”
then
touch “$lock_file_path”
fi
exit $return_value
else
log_failure_msg “Couldn’t find MySQL server ($bindir/mysqld_safe)”
fi
;;
‘stop’)
然后将它复制到 /tmp/init.d/ 目录下:
cp /usr/local/mysql/support-files/mysql.server /tmp/init.d/mysqld
此时,就可以直接调用 service 来进行启动了:
service mysqld start
遇到的一些问题
上面的理论很简单,但在启动的过程中还是遇到了一些问题,解决问题最简单的方法就是 Google+ 查看日志文件,这两个方法可以非常快的速度定位并解决。
配置文件被忽略
直接看启动时的报错信息:
$ service mysqld start
Warning: World-writable config file ‘/etc/my.cnf’ is ignored
Starting MySQL.Warning: World-writable config file ‘/etc/my.cnf’ is ignored
直接看报错原因,提示的是全局可写的配置文件被忽略。这个错误是指该配置文件可以被所有用户修改,因此有被恶意篡改的可能,因此不会引入这个文件的配置,忽略。
解决方案就是将该文件改为用户和用户组可读写,其他用户只读不可写:
chmod 664 /etc/my.cnf
PID 文件无法创建
直接看报错信息:
$ service mysqld start
Starting MySQL.The server quit without updating PID file (/usr/var/mysql/var/mysqld.pid).
报错原因显示,启动 MySQL 时意外退出,因为没有更新 PID 文件。
这个时候,可能有些人看不太懂,没关系,我们直接看错误日志:
2019-03-21 22:29:45 32896 [ERROR] /usr/local/mysql/bin/mysqld: Can’t create/write to file ‘/usr/var/mysql/var/mysqld.pid’ (Errcode: 2 – No such file or directory)
2019-03-21 22:29:45 32896 [ERROR] Can’t start server: can’t create PID file: No such file or directory
这个日志就很清楚的写明了无法创建这个 mysqld.pid 文件,要么是权限问题,要么是路径不存在的问题,后面看发现是路径写错了,更改为正确的路径即可。
错误日志路径的设置:
$ vim my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
pid-file = /usr/var/mysql/var/mysqld.pid
log-error = /user/local/mysql/log/mysql.err
log 指令被废弃
解决了上面的问题,我们继续执行,依然发现同样的报错信息,但是日志文件却不同了:
$ service mysqld start
Starting MySQL.The server quit without updating PID file (/usr/var/mysql/var/mysqld.pid).
# 日志文件
2019-03-21 22:37:33 0 [ERROR] /usr/local/mysql/bin/mysqld: ambiguous option ‘–log=/usr/local/mysql/log/mysql.log’ (log-bin, log_slave_updates)
2019-03-21 22:37:33 0 [ERROR] Aborting
发现日志报错信息提示:模糊的选项 –log,这个不太明白,Google 一下就能看到原因:–log 指令已经被废弃很久了,现在使用 –general-log 来代替。修改 my.cnf 配置文件即可:
$ vim my.cnf
[mysqld]
general-log = /user/local/mysql/log/mysql.log
启动成功
解决了上面这些问题,终于可以成功启动了,这个时候我们可以方便的对 mysqld 服务进行启停以及 reload 了:
$ service mysqld start
Starting MySQL. [OK]
总结
Service 服务管理工具,可以帮助我们快速的启停应用程序。在 Mysql 启动的过程中,掌握日志文件的查看和 Google 的搜索,对我们来说是最大的助力。
参考资料
我使用过的 Linux 命令之 service – 系统服务管理:https://codingstandards.iteye…
安装 mysql 后设置为 linux 服务:https://blog.csdn.net/qq84545…
service 命令:http://man.linuxde.net/service
MySQL 无法重启问题解决 Warning: World-writable config file‘/etc/my.cnf’is ignored:http://www.ttlsa.com/mysql/wa…
my.cnf:https://devilbox.readthedocs….
MySQL Error on Startup: ambiguous option ‘–log=/var/log/mysqld.log’:https://serverfault.com/quest…