mysql數據庫啓動過程源碼分析

版本信息

mysql5.7.27

啓動過程

sql/main.cc爲啓動入口,調用mysqld_main()函數

mysqld_main函數的啓動流程

int mysqld_main(int argc, char **argv) 啓動流程精簡說明

int mysqld_main(int argc, char **argv)
{
pre_initialize_performance_schema();//初始化性能視圖
my_init();//my_sys相關的library庫和pthreads的初始化
handle_early_options();//進程的一些最早的初始化參數,後續的進程啓動以來這個參數的初始化
init_sql_statement_names();//
sys_var_init();//初始化系統變量
ulong requested_open_files;//定義這個最大的變量
adjust_related_options(&requested_open_files);//通過傳值調用,調整max_open_files及max_open_connections等的變量定義的最大值,在函數內部實現,有相應的計算公式。
PSI_hook= initialize_performance_schema(&pfs_param);//初始化性能視圖performance_schema相關的參數設置,如table_def_size、table_cahce_size、最大連接數、最大打開文件數等。 這些參數值的由來是由定義或handle_early_options()和adjust_related_options來確定的。
psi_server_interface部分:
HAVE_PSI_INTERFACE //性能模式檢測接口,performance schema儀器類原始測量函數的底層接口(ABI)。記錄perforce_schema測量的一些服務器的運行狀態。通過PSI_hook獲取psi_server, set_psi_server(server)傳指針,設置一些初始化的值。
init_server_psi_keys();//初始化psi_server keys。註冊mutex rwlock conditons thread等檢測信息	
PSI_THREAD_CALL和my_thread_global_init() ; //通過啓動線程來進行初始化再初始化


init_error_log();//error log初始化
mysql_audit_initialize();//審計信息初始化

my_init_signals();//信號量初始化

init_server_components();/*初始化server components。 
1、初始化mdl_init(),metadata lock鎖的init。 有兩個部分的實現:init_md_psi_keys(),關於psi的md信息的初始化
2、mdl_locks.init()
*/
init_server_auto_options();/*
自動初始化一些配置,傳入uuid至server_uuid變量,檢測文件系統權限,加載auto.cnf等配置文件
*/
/*當上面加載server_uuid至sid_map並初始化之後,則下面進行的一些gtid的初始化配置,這裏因爲開始學習,並沒有學習的很深入,先跳過*/
gtid相關的操作;// gtid的相關初始化操作,有很多的步驟,暫時先略過

/*下面是重點*/
init_ssl(); //初始化ssl配置,init_ssl_lock()和init_lock_callback_functions() ,ssl rwlock和相關函數的初始化
network_init();/*
網絡模塊的初始化:
set_ports();//設置ip和unix ports,端口3306,及sock文件目錄/tmp/mysql.sock。 基配置所在的文件爲mysql_version.h中定義了這些值
Mysqld_socket_listener();//創建mysql_socket_listener,監聽通過socket連接到mysql的connection,默認socket文件使用/tmp/mysql.sock
通過Connector_accepter模板管理不同類型的listener,調用setup_listener()來進行listener的初始化。 
setup_listener()主要有兩個方面動作: 1、初始化listener mysocket port 2、將tcp_socket信息插入my_socket_map,mysql通過一個socket map來記錄所有socket端口信息
*/

初始化Initialize my_str_malloc(), my_str_realloc() and my_str_free();// 分配相應內存及傳址到具體地址。
 create_pid_file();//創建pid文件
 reload_optimizer_cost_constants();//加載mysql優化器相關配置
 mysql_rm_tmp_tables() || acl_init(opt_noacl) ||
      my_tz_init((THD *)0, default_tz_name, opt_bootstrap) ||
      grant_init(opt_noacl); // 刪除tmp_talbes並初始化數據庫級別授權,初始化時區my_tz_init
server_init(0);/*
server初始化:
Initialize structures responsible for servers used in federated server scheme information for them from the server table in the 'mysql' database. //初始化federated 存儲引擎服務server的配置部分。 fFEDERATED存儲引擎訪問在遠程數據庫的表中的數據,而不是本地的表。這個特性給某些開發應用帶來了便利,你可以直接在本地構建一個federated表來連接遠程數據表,配置好了之後本地表的數據可以直接跟遠程數據表同步。實際上這個引擎裏面是不真實存放數據的,所需要的數據都是連接到其他MySQL服務器上。
  SYNOPSIS
    servers_init()
      dont_read_server_table  TRUE if we want to skip loading data from server table and disable privilege checking. 值爲true時,跳過從server table中加載數據
  NOTES
    This function is mostly responsible for preparatory steps, main work on initialization and grants loading is done in servers_reload().
  RETURN VALUES
    0	ok
    1	Could not initialize servers
*/

init_status_vars();//初始化狀態,mysql中的status變量
initialize_information_schema_acl();//performance_schema_acl權限配置
execute_ddl_log_recovery();//做ddl recovery。 啓動過程中。
 start_signal_handler();//啓動信號量處理線程
 start_processing_signals();//處理啓動過程中的信號量信息
 read_init_file(opt_init_file);//通過線程讀取opt_init_file文件配置
start_handle_manager();//創建handle manager線程
  create_compress_gtid_table_thread();//創建compress_gtid_table線程
  
  再後面則是一些啓動線程的和gtid相關處理的命令;//後續再學習吧

return 0;


}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章