ITPub博客

首页 > 数据库 > MySQL > mysql关于mysqld_safe的总结

mysql关于mysqld_safe的总结

原创 MySQL 作者:lusklusklusk 时间:2018-11-23 19:56:11 0 删除 编辑

总结

1、mysqld_safe是服务端工具,用于启动mysqld,并且是mysqld的守护进程,mysqld_safe加&在后台运行$BASEDIR/bin/mysqld_safe &

2、因为mysqld_safe是mysqld的守护进程,所以mysqld_safe脚本会在启动MySQL服务器后继续监控其运行情况,并在其死机时重新启动它。

3、直接使用mysqld_safe启动mysqld时,mysqld_safe可以使用参数选项见mysqld_safe --help,此时可以使用其他配置文件,相当于mysqld_safe把参数传递给mysqld

4、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,如下看到的--datadir也是来自my.cnf

   [root@mydb]# ps -ef|grep mysql

   root      6687     1  0 19:38 pts/1    00:00:00 /bin/sh /mysql/mysql57/bin/mysqld_safe --datadir=/mysql/mysql57/data --pid-file=/mysql/mysql57/data/mydb.pid

5、mysqld_safe指定的--defaults-file会覆盖my.cnf中的配置

   ./bin/mysqld_safe --defaults-file=/etc/my.cnf2 

6、mysqld_safe指定的--datadir参数会覆盖my.cnf中的配置

   ./bin/mysqld_safe --datadir=/mysql/mysql57/data2 &

   mysqld_safe中这条语句they are added to mysqld command line to override settings from my.cnf

   它们被添加到mysqld命令行以覆盖my.cnf中的设置  

7、mysqld直接启动使用--datadi参数,也会覆盖my.cnf中的配置

   &BASEDIR/bin/mysqld --datadir=/mysql/mysql57/data2 --user=root &

8、mysqld_safe多长时间检测一次mysqld呢,即多长时间去把mysqld拉起

这是linux的机制,不是mysql的机制,因为mysqld_safe是父进程,mysqld是子进程,一旦子进程奔溃,linux信号机制下父进程马上就知道自己名下的子进程出问题了,会立即重新fork出一个新的子进程

9、mysqld的端口默认3306,mysqld_safe没有端口



https://dev.mysql.com/doc/refman/5.7/en/mysqld-safe.html

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. A description of error logging is given later in this section.

mysqld_safe是在Unix上启动mysqld服务器的推荐方法。 mysqld_safe添加了一些安全功能,例如在发生错误时重新启动服务器并将运行时信息记录到错误日志中。 本节后面将给出错误日志记录的说明。


mysqld_safe tries to start an executable named mysqld. To override the default behavior and specify explicitly the name of the server you want to run, specify a --mysqld or --mysqld-version option to mysqld_safe. You can also use --ledir to indicate the directory where mysqld_safe should look for the server.

Many of the options to mysqld_safe are the same as the options to mysqld. See Section 5.1.6, “Server Command Options”.

Options unknown to mysqld_safe are passed to mysqld if they are specified on the command line, but ignored if they are specified in the [mysqld_safe] group of an option file. See Section 4.2.6, “Using Option Files”.

mysqld_safe reads all options from the [mysqld], [server], and [mysqld_safe] sections in option files. For example, if you specify a [mysqld] section like this, mysqld_safe will find and use the --log-error option:

[mysqld]

log-error=error.log

mysqld_safe尝试启动名为mysqld的可执行文件。 要覆盖默认行为并明确指定要运行的服务器的名称,请为mysqld_safe指定--mysqld或--mysqld-version选项。 您还可以使用--ledir指示mysqld_safe应该查找服务器的目录。

mysqld_safe的许多选项与mysqld的选项相同。 请参见第5.1.6节“服务器命令选项”。

mysqld_safe未知的选项如果在命令行中指定则传递给mysqld,但如果在选项文件的[mysqld_safe]组中指定它们则忽略。 请参见第4.2.6节“使用选项文件”。

mysqld_safe从选项文件中的[mysqld],[server]和[mysqld_safe]部分读取所有选项。 例如,如果您像如下一样指定[mysqld]部分,mysqld_safe将找到并使用--log-error选项:

[mysqld]

log-error=error.log




mysqld_safe是守护进程,会自动拉起mysqld

[root@mydb ~]# ps -ef|grep mysql|grep -v grep

root      3075     1  0 13:27 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/mydb.pid

mysql     4205  3075  0 13:55 ?        00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/mydb.err --pid-file=/var/lib/mysql/mydb.pid


[root@mydb ~]# kill -9 4205


[root@mydb ~]# ps -ef|grep mysql|grep -v grep

root      3075     1  0 13:27 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/mydb.pid

mysql     4267  3075  5 13:55 ?        00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/mydb.err --pid-file=/var/lib/mysql/mydb.pid





mysqld的端口默认3306,mysqld_safe没有端口

[root@mydb ~]# netstat -anp |grep 4267

tcp        0      0 :::3306                     :::*                        LISTEN      4267/mysqld

unix  2      [ ACC ]     STREAM     LISTENING     13876  4267/mysqld         /var/lib/mysql/mysql.sock

[root@mydb ~]# netstat -anp |grep 3075



mysql.server启动,默认使用/etc/my.cnf配置文件信息,--datadir=/mysql/mysql57/data,看到的--datadir、--pid-file都是parse_server_arguments函数指定的参数

[root@mydb]# service mysqld start

[root@mydb]# ps -ef|grep mysql

root      7747     1  0 21:13 pts/1    00:00:00 /bin/sh /mysql/mysql57/bin/mysqld_safe --datadir=/mysql/mysql57/data --pid-file=/mysql/mysql57/data/mydb.pid

mysql     7866  7747  8 21:13 pts/1    00:00:00 /mysql/mysql57/bin/mysqld --basedir=/mysql/mysql57 --datadir=/mysql/mysql57/data --plugin-dir=/mysql/mysql57/lib/plugin --user=mysql --log-error=/mysql/mysql57/data/mydb.err --pid-file=/mysql/mysql57/data/mydb.pid


mysqld_safe启动,使用了其他配置文件,/etc/my.cnf2中指定了--datadir=/mysql/mysql57/data2,覆盖了/etc/my.cnf中指定的/mysql/mysql57/data

[root@mydb mysql57]# pwd

/mysql/mysql57

[root@mydb mysql57]# ./bin/mysqld_safe --defaults-file=/etc/my.cnf2 &

[root@mydb mysql57]# ps -ef|grep mysql

root      7394  4982  0 21:00 pts/1    00:00:00 /bin/sh ./bin/mysqld_safe --defaults-file=/etc/my.cnf2

mysql     7486  7394  8 21:00 pts/1    00:00:00 /mysql/mysql57/bin/mysqld --defaults-file=/etc/my.cnf2 --basedir=/mysql/mysql57 --datadir=/mysql/mysql57/data2 --plugin-dir=/mysql/mysql57/lib/plugin --user=mysql --log-error=/mysql/mysql57/data2/mydb.err --pid-file=/mysql/mysql57/data2/mydb.pid


mysqld_safe启动,使用了--datadir=/mysql/mysql57/data3,会覆盖/etc/my.cnf中指定的/mysql/mysql57/data,其他配置沿用my.cnf的

[root@mydb mysql57]# ./bin/mysqld_safe --datadir=/mysql/mysql57/data3 &

[root@mydb mysql57]# ps -ef|grep mysql

root      7996  4982  0 21:20 pts/1    00:00:00 /bin/sh ./bin/mysqld_safe --datadir=/mysql/mysql57/data3

mysql     8100  7996 14 21:20 pts/1    00:00:00 /mysql/mysql57/bin/mysqld --basedir=/mysql/mysql57 --datadir=/mysql/mysql57/data3 --plugin-dir=/mysql/mysql57/lib/plugin --user=mysql --log-error=/mysql/mysql57/data3/mydb.err --pid-file=/mysql/mysql57/data3/mydb.pid



mysqld_safe脚本执行的基本流程:


1、检查mysqld_safe命令行参数启用了哪些选项,详见Usage: $0 [OPTIONS]

2、查找basedir和ledir

(basedir表示MySQL安装目录,ledir表示mysqld程序的目录即bin目录)

3、查找datadir

4、解析my.cnf中的组[mysqld]和[mysqld_safe]并和终端里输入的命令合并。

5、调用parse_arguments函数解析用户传递的所有参数,parse_arguments()函数只读取--basedir、--datadir、--pid-file、--plugin-dir、--user、--log-error、--port、--socket这些个参数

6、对选项--user、--pid-file、--socket、--port、--log-error进行处理及赋值,保证启动时如果不给出这些参数它也会有值

7、启动mysqld,启动时会判断一个进程号是否存在,如不存在就删除进程文件

8、启动时对表进行检查。

9、如果服务器异常关闭,那么会restart




mysqld_safe代码中的内容

mysql.server works by first doing a cd to the base directory and from there executing mysqld_safe

mysql.server的工作原理是先cd进入基目录,然后执行mysqld_safe


Usage: $0 [OPTIONS]

--no-defaults              Don't read the system defaults file

--defaults-file=FILE       Use the specified defaults file

--defaults-extra-file=FILE Also use defaults from the specified file

--ledir=DIRECTORY          Look for mysqld in the specified directory

...

All other options are passed to the mysqld program

所有其他选项都传递给mysqld程序


We only need to pass arguments through to the server if we don't handle them here.  So, we collect unrecognized options (passed on the command line) into the args variable

如果我们不在这里处理它们,我们只需要将参数传递给服务器。 因此,我们将无法识别的选项(在命令行上传递)收集到args变量中


parse_arguments() {

# these get passed explicitly to mysqld//这些明确地传递给mysqld

--basedir=*) MY_BASEDIR_VERSION="$val" ;;

--datadir=*) DATADIR="$val" ;;

--pid-file=*) pid_file="$val" ;;

--plugin-dir=*) PLUGIN_DIR="$val" ;;

--user=*) user="$val"; SET_USER=1 ;;

# these might have been set in a [mysqld_safe] section of my.cnf//这些可能是在my.cnf的[mysqld_safe]部分设置的

# they are added to mysqld command line to override settings from my.cnf//它们被添加到mysqld命令行以覆盖my.cnf中的设置

--log-error=*) err_log="$val" ;;

--port=*) mysql_tcp_port="$val" ;;

--socket=*) mysql_unix_port="$val" ;;

# mysqld_safe-specific options - must be set in my.cnf ([mysqld_safe])//mysqld_safe特定的选项 - 必须在my.cnf中设置([mysqld_safe])

--core-file-size=*) core_file_size="$val" ;;


First, try to find BASEDIR and ledir (where mysqld is)

首先,尝试找到BASEDIR和ledir(mysqld所在的地方)


Second, try to find the data directory

其次,尝试查找数据目录


Get first arguments from the my.cnf file, groups [mysqld] and [mysqld_safe] and then merge with the command line arguments

从my.cnf文件,组[mysqld]和[mysqld_safe]获取第一个参数,然后与命令行参数合并


A pid file is created for the mysqld_safe process. This file protects the server instance resources during race conditions

为mysqld_safe进程创建了一个pid文件。 此文件在竞争条件期间保护服务器实例资源

safe_pid="$DATADIR/mysqld_safe.pid"

log_error "A mysqld_safe process already exists"

log_error "Fatal error: Can't remove the mysqld_safe pid file"


If the user doesn't specify a binary, we assume name "mysqld"

does not exist or is not executable. Please cd to the mysql installation directory and restart this script from there as follows:

./bin/mysqld_safe&

如果用户没有指定二进制文件,我们假设名称为“mysqld”

不存在或不可执行。 请cd到mysql安装目录并从那里重新启动此脚本,如下所示:

./bin/mysqld_safe&


If there exists an old pid file, check if the daemon is already running

如果存在旧的pid文件,请检查守护程序是否已在运行

log_error "A mysqld process already exists"

log_error Fatal error: Can't remove the pid file

mysqld daemon not started


Uncomment the following lines if you want all tables to be automatically checked and repaired during startup. 

You should add sensible key_buffer and sort_buffer values to my.cnf to improve check performance or require less disk space.

Alternatively, you can start mysqld with the "myisam-recover" option. 

如果要在启动期间自动检查和修复所有表,请取消注释以下行。 

您应该向my.cnf添加合理的key_buffer和sort_buffer值,以提高检查性能或减少磁盘空间。

或者,您可以使用“myisam-recover”选项启动mysqld。


Avoid 'nohup: ignoring input' warning

log_notice "Starting $MYSQLD daemon with databases from $DATADIR"

log_notice "$pid_file.shutdown present. The server will not restart."

log_notice "mysqld restarted"



解压文件安装时,如果使用绝对路径执行mysqld_safe时,它默认去/usr/local/mysql/bin/mysqld路径下找mysqld会报错,到mysqld_safe上级bin目录下,使用相对路径执行mysql_safe时没有问题./bin/mysqld_safe&

[root@mydb ~]# /mysql/mysql57/bin/mysqld_safe --port=3306 --default-file=/etc/my.cnf

181026 15:26:03 mysqld_safe Logging to '/mysql/mysql57/data/mydb.err'.

181026 15:26:03 mysqld_safe The file /usr/local/mysql/bin/mysqld

does not exist or is not executable. Please cd to the mysql installation

directory and restart this script from there as follows:

./bin/mysqld_safe&

See http://dev.mysql.com/doc/mysql/en/mysqld-safe.html for more information


mysqld_safe代码中里面其实也给出了上面的答案

MY_PWD=`pwd`

ledir="$MY_PWD/bin"                   # Where mysqld is

# Since we didn't find anything, used the compiled-in defaults

else

MY_BASEDIR_VERSION='/usr/local/mysql'

ledir='/usr/local/mysql/bin'

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2221483/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Welcome to Lukes DB HOME。 10G OCP、11G OCM, 8年以上DBA工作经验,博客仅记录自己的一个学习过程,不代表完全准确,如有需要,欢迎转载。

注册时间:2015-02-02

  • 博文量
    396
  • 访问量
    578814