mysql.server、mysqld_safe和mysqld
我们知道mysql.server,mysqld_safe和mysqld都是可以用来启动mysql服务,他们之间是有区别的。这三个命令中,其中mysql.server和mysqld_safe是shell脚本写的,我们可以打开来查看里面的内容。下面我们看看这三种启动方法的区别:
mysql.server脚本的主要作用就是为了方便启动和关闭mysql服务,mysql.server程序主要会用到两个程序和一个函数,分别是my_print_defaults、myslqd_safe和parse_server_arguments,它们的介绍如下:
1、my_print_defaults:读取my.cnf配置文件,输出参数传递给parse_server_arguments,该程序只读my.cnf中[mysqld]中的参数。
2、parse_server_arguments:该函数处理my_print_defaults传递过来的参数赋值给--basedir、--datadir、--pid-file、--service-startup-timeout,相关部分的代码如下:
parse_server_arguments() {
for arg do
case "$arg" in
--basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'`
bindir="$basedir/bin"
if test -z "$datadir_set"; then
datadir="$basedir/data"
fi
sbindir="$basedir/sbin"
libexecdir="$basedir/libexec"
;;
--datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`
datadir_set=1
;;
--pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
esac
done
}
3、mysql.server接着调用mysqld_safe这个脚本,把第二步解析到的参数值传递到mysqld_safe的参数列表中,其中调用部分的shell代码如下:
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.
$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
需要注意的是:
mysql.server脚本在调用mysqld_safe脚本去启动MySQL服务器的时候,此时mysqld_safe不能使用参数选项,即不能mysqld_safe --defaults-file这样的模式,此时只能使用默认的/etc/my.cnf配置文件,如上述代码所示。就算是ps -ef|grep mysql显式看到的信息也只是parse_server_arguments函数指定的参数,也是来自my.cnf,相当于mysql.server把my.cnf中的参数传递给mysqld_safe,mysqld_safe再传递给mysqld
总结一下:mysql.server这个脚本就是为了方便启动和关闭mysql服务,但真正启动mysql服务的不是它.
mysqld_safe
我们打开mysqld_safe这个脚本可以发现以下几点:
第一、mysqld_safe程序调用mysqld程序来启动mysql服务
第二、my.cnf配置文件中的[mysqld_safe]部分中的参数会覆盖[mysqld]部分中的参数
第三、在mysqld进程挂掉的时候,mysqld_safe进程会监测到并重新将mysqld启动起来。换句话说,mysqld_safe是mysqld的守护进程,所以mysqld_safe脚本会在启动MySQL服务器后继续监控其运行情况,并在其死机时重新启动它。
所以,当我们启动一个服务时,我们可以看到如下的情况:
root : pts/ :: /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/localhost.localdomain.pid
mysql : pts/ :: /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --socket=/tmp/mysql.sock
root : pts/ :: grep mysqld
即包含两个进程,一个是mysqld_safe、另外一个是mysqld的服务进程,其中mysqld_safe是守护进程,如果我们要kill掉mysqld进程,需要先kill掉守护进程。
添加开机启动,把mysql.server启动脚本放到开机初始化目录:
#创建
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# 赋予可执行权限
chmod +x /etc/init.d/mysqld
启动服务方式变为:
service mysqld start
关闭服务方式变为:
service mysqld stop
mysqld
它是mysql中正常的服务启动方式,一般mysql的初始化和启动都是用mysqld的方法,正常的启动方式为:
/usr/local/mysql/bin/mysqld
--basedir=/usr/local/mysql
--datadir=/usr/local/mysql/data
--plugin-dir=/usr/local/mysql/lib/plugin
--user=mysql
--log-error=/var/log/mysqld.log
--pid-file=/usr/local/mysql/data/localhost.localdomain.pid
--socket=/tmp/mysql.sock
后面的参数中一些是可选参数。
2
my.cnf---启动参数配置文件
在mysql进行启动的时候,需要设定一些启动参数,这些启动参数一般在my.cnf配置文件中,启动参数一般按照大的类型分为三类,一类的client,一类是mysqld另外一类是mysqld_safe,如下是我测试环境的一些启动参数配置:
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
user=mysql
server-id=
port=
log-bin=mysql-bin
binlog-do-db=DBAs
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
binlog-ignore-db=employees
expire_logs_days=
symbolic-links=
[mysql]
prompt="\\u@\\h :\\d\\r:\\m:\\s>"
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
socket=/tmp/mysql.sock
default-character-set=utf8
mysql的启动参数很多,需要注意的是这些参数的具体位置,有些是服务端的,有些是客户端的,例如default-character-set这个参数,如果放在mysqld中,就会报如下错误:
2019-02-17T08::14.855753Z [Note] Plugin 'FEDERATED' is disabled.
2019-02-17T08::14.858853Z [ERROR] unknown variable 'default-character-set=utf8'
2019-02-17T08::14.858867Z [ERROR] Aborting
这些启动参数之间存在一些覆盖关系,这里描述如下:
首先来看mysql的配置文件调用顺序,当我们启动mysql的时候,有时候系统中包含多个my.cnf配置文件,mysql在启动的时候到底是按照什么顺序来启动的呢,通过下面的命令可以看出来:
[root@localhost support-files]# mysql --help|grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
顺序如下,其中,后面的文件参数会覆盖前面的参数,这也就能解释为什么有时候我们已经在my.cnf中更改了相关的配置文件参数,但是参数貌似并没有生效,此时需要查看是否有别的配置文件中的参数对该参数进行了覆盖。
当我们启动mysql的时候单数使用了一些参数,这些参数也会覆盖my.cnf配置文件中的参数,具体的覆盖规则有:
1.mysqld_safe指定的--defaults-file指定的新文件会覆盖默认my.cnf中的配置
2.mysqld_safe指定的参数会覆盖my.cnf中的配置
3.mysqld直接启动使用参数,也会覆盖my.cnf中的配置
3
初始化方法以及初始化时候的一些选项
mysql服务在正式运行之前,需要先进行初始化,常用的初始化方法如下
./mysqld --defaults-file=/etc/my.cnf --initialize-insecure
初始化的时候包含一些参数,如下:
--no-defaults 不读取任何选项文件,该选项在mysql_install_db启动时,若因为读取了未知的参数而启动失败时使用。
--initialize
为“ 默认安全 ”的安装(即包括产生一个随机的初始根密码)。在这种情况下,密码被标记为过期,你需要选择一个新的密码。
--initialize-insecure
没有root密码生成;