概述
本文简单梳理了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):对一些特殊类型的变量做特殊处理,用于解析变量的类型并设置特殊的变量值