MySQL原始碼分析(3) 配置檔案詳解

2021-05-24 15:37:56 字數 1776 閱讀 4154

配置檔案詳解

關於配置檔案存放位置和優先順序

在一次部署中,我們發現mysql沒有按照配置檔案中的innodb_data_path選項建立檔案,查詢後發現這台機器上有多個配置檔案:/etc/my.cnf和/etc/mysql/my.cnf,而mysql會優先讀取/etc/mysql/my.cnf。當出現多個配置檔案時,其優先順序是如何確定的?原始碼面前,了無秘密。

用kdbg跟蹤除錯發現mysql對系統中各處配置檔案的優先順序處理如下:

mysys/default.c

406行: int load_defaults(const char *conf_file, const char **groups,

int *argc, char ***argv)

這裡其實只是包了一層,呼叫另乙個函式。

450行: int my_load_defaults(const char *conf_file, const char **groups,

int *argc, char ***argv, const char ***default_directories)

函式中段呼叫init_default_directories,獲得程式初始化時將會嘗試讀取配置檔案的所有目錄,共五個,依次為:

1. /etc

2. /etc/mysql

3. $basedir/mysql

4. cur_dir

5. ~/

在506行呼叫了乙個函式my_search_option_files,其定義為:

int my_search_option_files(const char *conf_file, int *argc, char ***argv,

uint *args_used, process_option_func func,

void *func_ctx, const char **default_directories)

此函式的第259行

for (dirs= default_directories ; *dirs; dirs++)

配置檔案優先順序在此體現,即使前面的配置檔案中設定了選項,也會被後面配置中設定的值覆蓋。例如在/etc/my.cnf中設定key_bufer_size=200m,但在/etc/mysql/my.cnf中又設定了key_buffer_size=300m,那麼最終mysql啟動時將以後者為準。

幾個重要的配置引數

在mysqld.cc中定義了所有可配置的服務端引數:

enum options_mysqld

當mysql啟動時,會接受命令行和配置檔案中的引數值。

if (init_common_variables(mysql_config_name, argc, argv, load_default_groups))

unireg_abort(1);

init_common_variables會呼叫my_load_defaults,該函式會從配置檔案中讀取引數值並將其放到通過命令列引數傳遞進來的值的前面,從而使得命令列引數可以覆蓋配置檔案中的引數。

接著會呼叫get_options()從合併後的argc, argv中解析出引數值,最後程式呼叫libmysql/my_getopt.c中的handle_options,此函式會跟stuct my_option中的引數比較,如果有模糊或錯誤的引數則返回錯誤,否則呼叫mysqld_get_one_option()處理每乙個引數。

flask 配置檔案的原始碼分析

原始碼分析 第1步 class flask packageboundobject self.config self.make config instance relative config 第2步 def make config self,instance relative false return...

flask原始碼分析 配置檔案 四

class flask packageboundobject config class config 配置由誰來載入配置 default config immutabledict flask定義了一些預設配置,如果自己不配則使用default def init self 這個物件可像操作字典一樣去操...

Nginx原始碼分析 Nginx配置檔案解析(一)

運營研發團隊 李樂 配置檔案是nginx的基礎,對於學習nginx原始碼甚至開發nginx模組的同學來說更是必須深究。本文將從原始碼從此深入分析nginx配置檔案的解析,配置儲存,與配置查詢。獲取限流相關配置 獲取fastcgi相關配置 為什麼可以這樣獲取到限流和fastcgi相關的配置呢?相信學習...