你的位置:首页 > 数据库

[数据库]MySQL 启动原理剖析


介绍

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

 

 my.cnf

[client]socket=/tmp/mysql.sockport=3306[mysqld]#################[base]##########################basedir =/usr/local/mysqldatadir =/data/mysql/innodb_data_home_dir=/data/mysql/innodb_log_group_home_dir=/data/mysql/port =3306user=mysqlpid-file=/data/mysql/mysql.pidsocket =/tmp/mysql.sockdefault_storage_engine=innodbcharacter_set_server=utf8open_files_limit=65535[mysqld_safe]log_error=/usr/local/mysql/log/mysql-error.logpid-file=/usr/local/mysql/log/mysql.pidopen_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

parse_server_arguments

 

查看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程序中用来处理参数的一个函数

parse_arguments() { # 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. pick_args= if test "$1" = PICK-ARGS-FROM-ARGV then  pick_args=1  shift fi for arg do  # the parameter after "=", or the whole $arg if no 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   # these get passed 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 been set in a [mysqld_safe] section of my.cnf   # they are added to mysqld command line to override settings from 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])!   --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"    else     MYSQLD="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启动

查看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了。

 

 

 

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

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

《欢迎交流讨论》