mysql配置文件和启动参数的处理

概述

本文简单梳理了mysql配置文件和启动参数的读取和解析过程

相关处理源码

load_defaults函数:

 这个函数在mysqld_main函数开始的地方调用,注意load_default_groups参数:mysqld、server、mysql5.7,表示该函数只处理配置文件中这些group的内容。

init_default_directories:设置配置文件的初始化目录。后续可能会根据这个目录读取配置文件内容。

my_search_option_files(conf_file, argc, argv, &args_used, handle_default_option, (void *) &ctx, dirs):该函数参数ctx->group存储了要检索配置文件中哪些group的信息。并读取配置文件的信息到ctx->m_args中,m_args每一项的内容格式:--mysql=use

新分配ptr指针数组:1. ptr[0]为进程名

                                  2.ptr之后的内容是ctx->m_args的内容,即读取的配置文件内容

                                 3.ptr之后的内容是分隔项:----args-separator---- 

                                 4.ptr最后的内容是原命令行的配置信息: argv的数组信息添加到结尾

更新argc和argv的内容,argv=ptr

 

handle_early_options

处理argv配置项中flag为parse_early的配置项。系统的option在初始化的时候分为两种类型:PARSE_EARLY和PARSE_NORMAL两部分。在sys_var.cc文件中具体看sys_var成员m_parse_flag的值。eg:Sys_var_integer的定义

 Sys_var_integer(const char *name_arg,
          const char *comment, int flag_args, ptrdiff_t off, size_t size,
          CMD_LINE getopt,
          T min_val, T max_val, T def_val, uint block_size, PolyLock *lock=0,
          enum binlog_status_enum binlog_status_arg=VARIABLE_NOT_IN_BINLOG,
          on_check_function on_check_func=0,
          on_update_function on_update_func=0,
          const char *substitute=0,
          int parse_flag= PARSE_NORMAL)

sys_var_add_options:将parse_early的系统变量存入all_early_options。系统变量的来源是all_sys_vars,每个系统变量初始化的时候加入到all_sys_vars中,具体代码见sys_var 的构造函数结尾一部分。

将my_long_early_options的成员加入all_early_options成员。

handle_options(&remaining_argc, &remaining_argv, &all_early_options[0], mysqld_get_one_option):该函数检查命令行参数中是否有对应的配置,并将对应的值设置到all_early_option中option->value。

init_common_variables

get_options(&remaining_argc, &remaining_argv)

               sys_var_add_options(&all_options, sys_var::PARSE_NORMAL):加载PARSE_NORMAL的系统变量

              handle_options(argc_ptr, argv_ptr, &all_options[0], mysqld_get_one_option)):将命令中的参数值设置到all_options中

 

 

init_default_directories

注意获取的缺省目录的先后顺序,后面的配置会覆盖前面配置文件的内容。该函数设置的先后顺序如下:

File Name Purpose
/etc/my.cnf Global options
/etc/mysql/my.cnf Global options
SYSCONFDIR/my.cnf Global options
$MYSQL_HOME/my.cnf Server-specific options (server only)
defaults-extra-file The file specified with --defaults-extra-file, if any
~/.my.cnf User-specific options

my_search_option_files(conf_file, argc, argv, &args_used, handle_default_option, (void *) &ctx, dirs)

函数功能:读取配置文件的内容到ctx->m_args中。具体处理流程如下:

第一次调用:读取--defaults-file、--defaults-extra-file、--defaults-group-suffix、--login-path这几个配置项的内容,这几个配置项会影响读取配置文件的行为,这几个配置项的含义参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/option-file-options.html  。读取之后根据defaults-group-suffix的内容扩展ctx- >group的内容。eg:如果该配置项内容为_test,即要检索grup为mysqld_test的内容

如果是第二次调用:向ctx->group中添加两项内容:m_login_path和m_login_path + defaults-group-suffix

如果处理的配置文件是绝对路径,读取指定的配置文件内容存

如果设置了参数defaults-file但是未设置no-defaults参数,读取defaults-file配置文件的内容

否则:根据配置文件的初始化目录依次读取配置文件的内容

 

search_default_file_with_ext函数

该函数读取配置文件的内容。search_default_file函数是根据配置文件匹配后缀后调用search_default_file_with_ext,linux下该处匹配为.cnf 。具体处理流程如下:

根据文件夹、文件名 后缀获取完整文件名

检查文件是否有读权限

读取每行记录:

跳过#、:和空行

对于!开头的行,检查是否包含子配置文件

找到[]中的组信息,赋值给curr_gr,调用handle_default_option处理

删除本行结尾#的注释

如果没有参数,将--配置项添加到ctx中

对value的去掉前后空格,去掉开头和结尾的‘  “

对option前面添加--,放在--option=value放入ctx中

 

handle_options函数

init_variables(longopts, init_one_value):将系统变量的值设置为初始值,对每个成员u_max赋值为max,value赋值为def _value.

       init_one_value:为单个变量设置初始值。eg:调用getopt_ll_limit_value函数为int类型赋初值。在复制过程中会检测先关的条件:max_value\min_value\block_size的整数倍

 for (pos= *argv, pos_end=pos+ *argc; pos != pos_end ; pos++) :遍历每个命令行配置项

         if (!is_cmdline_arg && (my_getopt_is_args_separator(cur_arg))):跳过分隔行

         解析命令行中的值字段

         opt_str= check_struct_option(cur_arg, key_name);

          optend= strcend(opt_str, '=');

          length= (uint) (optend - opt_str);

         if (!(opt_found= findopt(opt_str, length, &optp))) :查找该参数匹配的系统变量,如果匹配不到,进行前缀匹配

         argument= optend;通过value保存该变量对应的值

         setval(optp, optp->value, argument, set_maximum_value) // 赋值操作:将argument的值放入opttp->value中

        get_one_option && get_one_option(optp->id, optp, argument):对一些特殊类型的变量做特殊处理,用于解析变量的类型并设置特殊的变量值

你可能感兴趣的:(mysql源码)