1. 程式人生 > >mysql配置檔案和啟動引數的處理

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