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 |
|
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):對一些特殊型別的變數做特殊處理,用於解析變數的型別並設定特殊的變數值