1. 程式人生 > >mysql 原始碼學習筆記:mysqld啟動流程

mysql 原始碼學習筆記:mysqld啟動流程

版本 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結構體,用於命令統計 以上內容為原始碼層面各個函式的基本說明,為後續更深入的學習各個模組做最初的概括介紹,部分函式未列出,更詳細的資訊請檢視原始檔。