mysql启动原理_MySQL 启动原理剖析

介绍

本篇文章主要从查看MySQL的启动命令的代码来详细了解MySQL的启动过程,内容多为概念知识;理解MySQL的启动原理对熟悉MySQL至关重要,启动mysql服务有三种方式分别是:mysql.sever,mysqld,mysqld_safe。

my.cnf

[client]

socket=/tmp/mysql.sock

port=3306[mysqld]

#################[base]##########################

basedir=/usr/local/mysql

datadir=/data/mysql/innodb_data_home_dir=/data/mysql/innodb_log_group_home_dir=/data/mysql/port=3306user=mysql

pid-file=/data/mysql/mysql.pid

socket=/tmp/mysql.sock

default_storage_engine=innodb

character_set_server=utf8

open_files_limit=65535[mysqld_safe]

log_error=/usr/local/mysql/log/mysql-error.log

pid-file=/usr/local/mysql/log/mysql.pid

open_files_limit=15000

mysql.server

默认的mysql的服务启动程序是mysql.server,mysql.server程序主要是会用到两个程序和一个函数,分别是my_print_defaults、myslqd_safe和parse_server_arguments

my_print_defaults:读取my.cnf配置文件,输出参数传递给parse_server_arguments,该程序只读my.cnf中[mysqld]中的参数。

parse_server_arguments:该函数处理my_print_defaults传递过来的参数赋值给--basedir、--datadir、--pid-file、--server-startup-timeout

myslqd_safe:mysqld_safe程序调用mysqld程序来启动mysql服务

mysql.server

36a1debbc72ba191e741f4b84780174b.png

parse_server_arguments

7da599d075c5f445fc4cf7223ed9187c.png

ffc6ae7e09d9dc8fc2955b7451786c18.png

查看mysql进程信息可以看到通过mysql.server启动首先会对参数--datedir和--pid-file赋值,这两个参数是从my.cnf文件[mysqld]部分中读取来的,而且这两个参数的值不会受到mysqld_safe程序中的参数赋值给覆盖。但是在my.cnf中其它的参数值如果[mysqld]和[mysqld_safe]相同的话就以mysqld_safe为主,上图中的--open-files-limit就是说明的例子。

mysqld_safe

在以前老的版本mysqld_safe是主要的启动方式,而且参数也非常多;对于多实例的服务器需要用到mysqld_safe来启动。mysqld_safe会调用mysqld程序启动mysql服务,并且mysqld_safe会读取my.cnf中的配置参数值来启动mysql服务。mysqld_safe本身也有一些启动参数并且这些启动参数优先于配置文件中相应的参数。

mysqld_safe --help

--no-defaults 不读任何选项文件--defaults-file=FILE 配置自定义的默认文件,如果是多实例的服务器这里就需要配置成对应的my.cnf--defaults-extra-file=FILE 除了默认文件之外所读取的选项文件名--ledir=DIRECTORY : 指定mysqld文件所在的路径,对于多实例的服务器可以用来分别指定实例的位置。--open-files-limit=LIMIT 能打开的最大文件数量--core-file-size=LIMIT mysqld能够创建的内核文件的大小。选项值传递给ulimit -c--timezone=TZ : 为给定的选项值设置TZ时区环境变量。从操作系统文档查阅合法的时区规定格式--malloc-lib=LIB 预加载共享库lib--mysqld=FILE 想要启动的服务器程序名(在ledir目录)。默认是mysqld也可以是其它的名称。--mysqld-version=VERSION 如果你使用--mysqld-version =max,mysqld_safe启动ledir目录中的mysqld-max程序。如果--mysqld-version的参数为空,mysqld_safe使用目录中的mysqld。--nice=NICE 使用nice程序根据给定值来设置mysqld的调度优先级。--plugin-dir=DIR 配置mysql服务的plugin路径,/usr/local/mysql/lib/plugin--skip-kill-mysqld Don't try to kill stray mysqld processes

--syslog Log messages to syslog with 'logger'

--skip-syslog Log messages to error log (default)--syslog-tag=TAG Pass -t "mysqld-TAG" to 'logger'

pare_arguments函数

该函数是mysqld_safe程序中用来处理参数的一个函数,从下面的代码中可以了解到mysqld_safe主要处理哪些参数。

parse_arguments() {

# We only need to pass arguments through to the serverif we don't

# handle them here. So, we collect unrecognized options (passed on

# the command line) into the args variable.

pick_args=

if test "$1" = PICK-ARGS-FROM-ARGV

then

pick_args=1shift

fifor arg do# the parameter after"=", or the whole $arg ifno match

val=`echo "$arg" | sed -e 's;^--[^=]*=;;'`

# what's before "=", or the whole $arg if no match

optname=`echo "$arg" | sed -e 's/^\(--[^=]*\)=.*$/\1/'`

# replace"_" by "-" ; mysqld_safe must accept "_"like mysqld does.

optname_subst=`echo "$optname" | sed 's/_/-/g'`

arg=`echo $arg | sed "s/^$optname/$optname_subst/"`case "$arg" in# thesegetpassed explicitly to 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 beenset ina [mysqld_safe] section of my.cnf

# they are added to mysqld command line tooverride settings frommy.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])!

--core-file-size=*) core_file_size="$val";;--ledir=*) ledir="$val";;--malloc-lib=*) set_malloc_lib "$val";;--mysqld=*) MYSQLD="$val";;--mysqld-version=*)if test -n "$val"then

MYSQLD="mysqld-$val"PLUGIN_VARIANT="/$val"

elseMYSQLD="mysqld"fi

;;--nice=*) niceness="$val";;--open-files-limit=*) open_files="$val";;--open_files_limit=*) open_files="$val";;--skip-kill-mysqld*) KILL_MYSQLD=0;;--syslog) want_syslog=1;;--skip-syslog) want_syslog=0;;--syslog-tag=*) syslog_tag="$val";;--timezone=*) TZ="$val"; export TZ; ;;--help) usage ;;*)if test -n "$pick_args"then

append_arg_to_args"$arg"fi

;;

esac

done

}

通过mysqd_safe启动

7491f7fb8552608fb1413a174365a613.png

查看mysql进程信息可以看到通过mysqld_safe启动mysql服务后,myslqd_safe会对my.cnf配置文件的配置进行读取,如果配置文件中【mysqld】和【mysqld_safe】同时配置了相同的参数以[mysqld_safe]为主,所以会看到--pid-file也是以my.cnfa文件中的[mysqld_safe]中的为主。

mysqld

直接运行mysqld程序也是可以启动mysql服务,mysqld会使用默认的配置进行启动,对于多实例的mysql使用这种方法就不好实现。

总结

在现在的新版本中不建议在[mysqld_safe]中进行参数的配置,对应多实例的服务器在启动的时候可以通过mysqld_safe来指定不同实例的路径和配置文件进行启动,需要用到----defaults-file、--ledir两个参数进行启动,从启动的代码可以看出mysql的启动要用到的两个关键参数--datadir --pid-file,所以为什么经常会在启动和关闭mysql的时候提示找不到pid了。

备注:

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值