• 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 =3306
    user=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

    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程序中用来处理参数的一个函数,从下面的代码中可以了解到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

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

    《欢迎交流讨论》

  • 相关阅读:
    Yii框架2.0 数据库操作初接触
    Yii框架2.0的视图和widgets表单的使用
    Yii框架2.0的安装过程
    监控之snmpd 服务
    在HTML里面HEAD部分的META元素要表达的内容是什么
    被table单元格colspan属性折磨了
    excel模版从xp复制到win7系统后出现错误 运行时错误 '429' ActiveX 部件不能创建对象
    oracle左连接连表查询
    Nginx 关闭防火墙
    左连接不能与or否则in连用
  • 原文地址:https://www.cnblogs.com/chenmh/p/5369045.html
Copyright © 2020-2023  润新知