前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL的启动原理

MySQL的启动原理

作者头像
AsiaYe
发布2019-11-06 16:34:36
2K0
发布2019-11-06 16:34:36
举报
文章被收录于专栏:DBA随笔DBA随笔
MySQL的启动原理
1

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,相关部分的代码如下:

代码语言:javascript
复制
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代码如下:

代码语言:javascript
复制
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服务器后继续监控其运行情况,并在其死机时重新启动它。

所以,当我们启动一个服务时,我们可以看到如下的情况:

代码语言:javascript
复制
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启动脚本放到开机初始化目录:

代码语言:javascript
复制
#创建
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的方法,正常的启动方式为:

代码语言:javascript
复制
/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,如下是我测试环境的一些启动参数配置:

代码语言:javascript
复制
[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中,就会报如下错误:

代码语言:javascript
复制
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在启动的时候到底是按照什么顺序来启动的呢,通过下面的命令可以看出来:

代码语言:javascript
复制
[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服务在正式运行之前,需要先进行初始化,常用的初始化方法如下

代码语言:javascript
复制
./mysqld --defaults-file=/etc/my.cnf --initialize-insecure

初始化的时候包含一些参数,如下:

--no-defaults 不读取任何选项文件,该选项在mysql_install_db启动时,若因为读取了未知的参数而启动失败时使用。

--initialize

为“ 默认安全 ”的安装(即包括产生一个随机的初始根密码)。在这种情况下,密码被标记为过期,你需要选择一个新的密码。

--initialize-insecure

没有root密码生成;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档