mysql 原始碼學習筆記:mysqld啟動流程
阿新 • • 發佈:2019-01-25
版本
CentOS release 6.7環境下mysql-5.7.16 社群版
概述
主要從原始碼層面梳理mysql-5.7.16啟動過程中呼叫函式的順序和作用。主要函式和流程包括:
1. 初始化系統變數和系統狀態
2. 初始化伺服器的各個模組
原始碼分析
main
mysqld_main(argc, argv)
| pre_initialize_performance_schema(); 初始化performance shcema相關內容
| my_init()
| load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv) 讀取配置檔案
| init_pfs_instrument_array 初始化performance shcema相關內容
| handle_early_options 初始化部分變數,為mysqld初始化系統表等做裝備
| my_long_early_options變數設定,包括bootstrap、skip-grant-tables、help、verbose、version、initialize、initialize-insecure
| init_sql_statement_names 初始化命令,為後續status統計運算元量做準備
| sys_var_init() 初始化系統變數hash桶,將所有的系統變數插入到hash桶中(這裡的變數為sys_vars.cc中定義的變數)
| init_error_log 初始化error log 鎖
| mysql_audit_initialize 初始化audit plugin鎖,為後續初始化audit plugin做準備
| query_logger.init(); 初始化general log和slow log的鎖
| init_common_variables() 所有變數相關內容初始化,包括變數本身的值以及部分變數控制的特性
| init_server_components() 伺服器各個模組的初始化,包括
| init_server_auto_options() 初始化UUID
| if (gtid_state->read_gtid_executed_from_table() == -1) 從gtid_execute表中讀取gtid_execute
| if (opt_bin_log)
| gtid_state->get_executed_gtids()/gtid_state->get_lost_gtids() .... 如果開啟了binlog,則初始化gtid相關資訊
| 將gtid 資訊更新到 mysql_bin_log中
| 將表中記錄的gtid資訊與binlog同步(包括purge,crash recovery恢復等)
| init_ssl()/network_init 初始化ssl和網路
| create_pid_file(); 建立pid檔案
| acl_init(opt_noacl) 初始化使用者名稱、密碼等資訊快取,並將user表中的內容讀取快取
| grant_init(opt_noacl) 初始化許可權快取,將tables_priv等表中的許可權資訊讀取快取
| servers_init(0); 初始化mysql.servers表,並讀入快取
| udf_init(); 初始化使用者自定義函式
| init_status_vars(); 初始化系統狀態,system status排序
| init_slave() 初始化slave相關的結構體
如存在複製相關的資訊,同時skip_slave_start未設定,則啟動複製
| execute_ddl_log_recovery 執行ddl語句的crash recovery
| start_signal_handler(); 建立訊號處理執行緒,處理訊號SIGTERM/SIGQUIT/SIGHUP
| if (opt_bootstrap) error= bootstrap(mysql_stdin); 初始化資料目錄、系統表
| if (opt_init_file && *opt_init_file) read_init_file(opt_init_file) 從檔案中初始化資料目錄、系統表
| mysqld_socket_acceptor->connection_event_loop(); 監聽埠和sock檔案,等待客戶端連線
init_common_variables() 所有變數相關的初始化
| init_thread_environment 初始化全域性mutex和condition
| mysql_init_variables 設定部分全域性變數的預設值
| if (gethostname(glob_hostname,sizeof(glob_hostname)) < 0) ...... 生成pid檔案
| 設定預設儲存引擎
| if (add_status_vars(status_vars)) 將全域性變數status_vars中的系統 status存入all_status_vars中
| get_options 將設定的系統變數的值更新到系統變數中
| set_default_auth_plugin 設定預設的身份驗證外掛(通常為native_password)
| set_server_version 設定mysql版本的字尾(-embedded、-log、-debug...)
| init_errmessage/init_client_errs 初始化error message
| item_create_init/item_init 初始化所有的item類和函式(解析和後續執行使用)
| 初始化 charset/collation
| lex_init 初始化解析sql使用的lex
| 初始化general log 和 slow log的日誌名
get_options 將檔案中、命令列中設定的引數,設定到系統引數中
|將my_long_options存入all_options |將all_sys_vars存入all_options 所有的系統變數均已存入all_options中 |將 {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}; 存入all_option 作為結束符 |handle_options |if (Connection_handler_manager::init()) 初始化連線管理模組 |if (Global_THD_manager::create_instance()) 初始化執行緒管理模組 init_server_components() | mdl_init 初始化mdl鎖 | table_def_init/hostname_cache_init/my_timer_initialize | init_server_query_cache query cache初始化 | randominit 隨機數初始化 | init_slave_list 初始化從機hash桶 | transaction_cache_init() 事務快取hash桶和鎖初始化 | delegates_init delegates用於執行回撥函式 | if (opt_bin_log) 如果變數中開啟了binlog | 生成binlog_index 和 binlog的檔名 | if (opt_relay_logname) 如果變數中開啟了relaylog | 生成relaylog_index 和 relay log的檔名 | if (ha_init_errors()) 將handler模組的錯誤資訊註冊到mysqld的my_error中 | if (gtid_server_init()) 初始化gitd結構體 | if (plugin_init(&remaining_argc, remaining_argv ... 初始化所有的外掛(包括編譯、配置、命令列載入的引數) | query_logger.set_handlers(log_output_options); 初始化general log/slow log的日誌處理模組 | if (initialize_storage_engine(default_storage_engine, "".... 初始化預設的儲存引擎 | if (tc_log->open(opt_bin_log ? opt_bin_logname : opt_tc_log_file)) tc_log開啟binlog,主要用於binlog和儲存引擎的recovery使用,開啟當前index中最後一個檔案 | if (ha_recover(0)) recovery | if (mysql_bin_log.open_binlog(opt_bin_logname, 0, mysql_bin_log開啟binlog,生成新的binlog,在index檔案中加入新的內容 | mysql_bin_log.purge_logs_before_date(purge_time, true); 如果開啟了複製,同時開啟了binlog定期刪除時間,刪除過期的binlog | init_max_user_conn(void) 初始化連線hash桶 | init_update_queries(); 初始化server_command_flags結構體,用於命令統計 以上內容為原始碼層面各個函式的基本說明,為後續更深入的學習各個模組做最初的概括介紹,部分函式未列出,更詳細的資訊請檢視原始檔。
|將my_long_options存入all_options |將all_sys_vars存入all_options 所有的系統變數均已存入all_options中 |將 {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}; 存入all_option 作為結束符 |handle_options |if (Connection_handler_manager::init()) 初始化連線管理模組 |if (Global_THD_manager::create_instance()) 初始化執行緒管理模組 init_server_components() | mdl_init 初始化mdl鎖 | table_def_init/hostname_cache_init/my_timer_initialize | init_server_query_cache query cache初始化 | randominit 隨機數初始化 | init_slave_list 初始化從機hash桶 | transaction_cache_init() 事務快取hash桶和鎖初始化 | delegates_init delegates用於執行回撥函式 | if (opt_bin_log) 如果變數中開啟了binlog | 生成binlog_index 和 binlog的檔名 | if (opt_relay_logname) 如果變數中開啟了relaylog | 生成relaylog_index 和 relay log的檔名 | if (ha_init_errors()) 將handler模組的錯誤資訊註冊到mysqld的my_error中 | if (gtid_server_init()) 初始化gitd結構體 | if (plugin_init(&remaining_argc, remaining_argv ... 初始化所有的外掛(包括編譯、配置、命令列載入的引數) | query_logger.set_handlers(log_output_options); 初始化general log/slow log的日誌處理模組 | if (initialize_storage_engine(default_storage_engine, "".... 初始化預設的儲存引擎 | if (tc_log->open(opt_bin_log ? opt_bin_logname : opt_tc_log_file)) tc_log開啟binlog,主要用於binlog和儲存引擎的recovery使用,開啟當前index中最後一個檔案 | if (ha_recover(0)) recovery | if (mysql_bin_log.open_binlog(opt_bin_logname, 0, mysql_bin_log開啟binlog,生成新的binlog,在index檔案中加入新的內容 | mysql_bin_log.purge_logs_before_date(purge_time, true); 如果開啟了複製,同時開啟了binlog定期刪除時間,刪除過期的binlog | init_max_user_conn(void) 初始化連線hash桶 | init_update_queries(); 初始化server_command_flags結構體,用於命令統計 以上內容為原始碼層面各個函式的基本說明,為後續更深入的學習各個模組做最初的概括介紹,部分函式未列出,更詳細的資訊請檢視原始檔。