知识分享 | mysql服务器启动后,为啥有mysqld_safe和mysqld 2个进程?

在mysql服务器启动后,有2个进程mysqld_safe和mysqld,这是为啥?

如下:

[root@ethanyang bin]# ps -ef | grep mysqld
root       6488   3324  0 Sep03 pts/0    00:00:00 /bin/sh /mysqlsoft/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql
mysql      7327   6488  0 Sep03 pts/0    00:00:13 /mysqlsoft/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/mysqlsoft/mysql --datadir=/mysqldata/data --plugin-dir=/mysqlsoft/mysql/lib/plugin --user=mysql --log-error=/mysqldata/log/mysql-error.log --open-files-limit=10240 --pid-file=/mysqldata/tmp/mysql.pid --socket=/tmp/mysql.sock

其中mysqld_safe是mysqld的父进程, /etc/init.d/mysql 中针对start的执行,执行的mysqld_safe,而mysqld_safe是一个脚本,通过查看mysqld_safe的选项信息以及脚本内容,确定mysqld_safe启动的是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.

Note

For some Linux platforms, MySQL installation from RPM or Debian packages includes systemd support for managing MySQL server startup and shutdown. On these platforms, mysqld_safe is not installed because it is unnecessary

这里注意下:

对于一些Linux平台,从RPM或Debian包安装MySQL包括systemd支持管理MySQL服务器的启动和关闭。在这些平台上,没有安装mysqld_safe。

在 Unix 机器上,MySQL 官方推荐使用 mysqld_safe 启动 mysqld 服务。

这里先简要说下原因:
mysqld_safe 增加了一些安全特性,比如它会在遇到错误时重启 mysqld 服务,并把运行时信息记录到 error log 中。

以 CentOS和redhat环境 为例,使用 mysqls_safe 启动 mysqld 服务的命令如下:

mysqld_safe --defaults-file=/etc/my.cnf --user=mysql > mysqld.log 2>&1 &

其中 --defaults-file=my.cnf 指定了默认的配置文件为/etc/my.cnf,当然这里的参数文件路径可以任意指定,常规还是放在路径/etc/下。

1.>mysqld_log 指定了将标准输出重定向到 msyqld.log,
3. 2>&1 表示将标准错误输出重定向到标准输出,
5. 末尾的 & 表示后台运行。

执行上述命令mysqls_safe,使用 mysqld_safe 和 my.cnf 中的配置,会启动了一个 mysqld 进程,始终在后台运行,所有的输出(包括错误输出)都将汇集到 mysqld.log 文件中。

按下回车执行命令后,终端将返回这个任务的编号和进程号,如果后续想要再次查看,可以通过 jobs -l 命令来查看当前 Shell 环境中所有的任务。

[root@ethanyang init.d]# mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
[1] 5092

jobs -l 命令来查看当前 Shell 环境中所有的任务

[root@ethanyang init.d]# jobs -l
[1]+  5092 Running                 mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &

其中 [1] 代表任务号,+ 代表这是最近一个任务,5092 代表进程号 PID。

至此,mysqld 服务启动成功。

具体再来详细了解下mysqld_safe与mysqld区别:

【mysqld】:是mysql的核心程序,用于管理mysql的数据库文件以及用户的请求操作。

首先说一点:直接运行mysqld来启动,可不可以,当然也可以,只是直接运行mysqld程序来启动MySQL服务的方法在实际生产中很少几乎不使用,且官方刚才也说过:不推荐,mysqld_safe 增加了一些安全特性。

mysqld可以读取配置文件中的[mysqld]中的内容。

mysqld启动命令:

[root@ethanyang init.d]# bin/mysqld --defaults-file=/etc/mysql/my.cnf &

查看mysqld支持的选项:

[root@ethanyang init.d]# bin/mysqld --verbose --help

【mysqld_safe】:会在启动MySQL服务器后继续监控其运行情况,并在其死机时重新启动它。

用mysqld_safe脚本来启动MySQL服务器的做法在BSD风格的unix系统上很常见,非BSD风格的UNIX系统中的 mysql.server脚本其实也是调用mysqld_safe脚本去启动MySQL服务器的。

mysqld_safe脚本方式启动mysql server 进程,通常做如下事情:

1. 检查系统和选项。
2. 检查MyISAM表。
3. 保持MySQL服务器窗口。
4. 启动并监视mysqld,如果因错误终止则重启。
5. 记录mysqld进程运行信息,保存在错误日志中(error.log,通常在my.cnf中指定)
6. mysqld_safe的启动和运行参数与mysqld通用,对mysqld_safe进程施加参数等同于在mysqld进程上施加参数。

mysqld_safe从选项文件的[mysqld]、[server]和 [mysqld_safe]部分读取所有选项。

为了保证向后兼容性,它还读取 [safe_mysqld]部分,尽管在MySQL 5.1安装中你应将这部分重新命名为[mysqld_safe]。

mysqld_safe支持下面的选项:

image.png

具体参数解释详见官方文档:

【reference】

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

简翻如下:

--help显示帮助消息并退出。

--autoclose(只在NetWare中)在NetWare中,mysqld_safe可以保持窗口。当你关掉mysqld_safe NLM时,窗口不按默认设置消失。相反,它提示用户输入:**如果你想让NetWare自动关闭窗口,在mysqld_safe中使用--autoclose选项。

--basedir=pathMySQL安装目录的路径。

--core-file-size=sizemysqld能够创建的内核文件的大小。选项值传递给ulimit -c。--datadir=path 数据目录的路径。

--defaults-extra-file=path除了通用选项文件所读取的选项文件名。如果给出,必须首选该选项。

 --defaults-file=path读取的代替通用选项文件的选项文件名。如果给出,必须首选该选项。

 --ledir=path包含mysqld程序的目录的路径。使用该选项来显式表示服务器位置。

 --log-error=path将错误日志写入给定的文件。参见5.11.1节,“错误日志”。

 --mysqld=prog_name想要启动的服务器程序名(在ledir目录)。如果你使用MySQL二进制分发版但有二进制分发版之外的数据目录需要该选项。

 --mysqld-version =suffix该选项类似--mysqld选项,但你只指定服务器程序名的后缀。基本名假定为mysqld。例如,如果你使用--mysqld-version =max,mysqld_safe启动ledir目录中的mysqld-max程序。如果--mysqld-version的参数为空,mysqld_safe使用目录中的mysqld。

 --nice=priority使用nice程序根据给定值来设置服务器的调度优先级。

 --no-defaults不要读任何选项文件。如果给出,必须首选该选项。

 --open-files-limit=countmysqld能够打开的文件的数量。选项值传递给 ulimit -n。请注意你需要用root启动mysqld_safe来保证正确工作。

 --pid-file=path进程ID文件的路径。

 --port=port_num用来帧听TCP/IP连接的端口号。端口号必须为1024或更大值,除非MySQL以root系统用户运行。

 --skip-character-set-client-handshake忽略客户端发送的字符集信息,使用服务器的默认字符集。(选择该选项,MySQL的动作与MySQL 4.0相同)。

 --socket=path用于本地连接的Unix套接字文件。

 --timezone=zone为给定的选项值设置TZ时区环境变量。从操作系统文档查阅合法的时区规定格式。

 --user={user_name | user_id}以用户名user_name或数字用户ID user_id运行mysqld服务器。(本文中的“用户”指系统登录账户,而不是 授权表中的MySQL用户)。

执行mysqld_safe时,必须先给出–defaults-file或–defaults-extra-option,或不使用选项文件。
该命令将不使用选项文件,因为第一个参数不是选项文件:

mysqld_safe --port=3306 --defaults-file=/etc/mysql/my.cnf

相反,使用下面的命令,则可以使用选项文件:

mysqld_safe --defaults-file=/etc/mysql/my.cnf --port=3306

mysqld_safe脚本位置通常在什么位置?

  1. 可以根据调用mysqld_safe的目录找到服务器和数据库。在二进制分发版中,mysqld_safe看上去在bin和data目录的工作目录下。对于源码分发版,为libexec和var目录。如果你从MySQL安装目录执行mysqld_safe应满足该条件(例如,二进制分发版为/usr/local/mysql);

  2. 如果不能根据工作目录找到服务器和数据库,mysqld_safe试图通过绝对路径对它们定位。典型位置为/usr/local/libexec和 /usr/local/var。实际位置由构建分发版时配置的值确定如果MySQL安装到配置时指定的位置,它们应该是正确的。

最后,简单总结下:

1. 可以mysqld把mysql server拉起来,但生产环境不建议这么干;
2. mysqld_safe的启动和运行参数与mysqld通用,对mysqld_safe进程施加参数等同于在mysqld进程上施加参数;
3. mysqld_safe相当于多了一个守护进程,mysqld挂了会自动把mysqld进程拉起来 ;
4. mysqld_safe严重错误产生时自动重启mysqld进程;
5. mysqld_safe记录mysqld进程运行信息,保存在错误日志中(error.log,通常在my.cnf中指定);
6. 若每秒启动失败5次,mysqld_safe进程为了防止消耗cpu资源,启动进程将会停顿1s。
7. 官方推荐在类UNIX系统中使用mysqld_safe脚本来启动mysqld进程。

【参考】

https://www.cnblogs.com/benwu/articles/9061345.html

【参考】

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

文章结束

以下是个人微信公众号,欢迎关注:
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值