MySQL學習筆記——MySQL啟動過程(一)
阿新 • • 發佈:2019-01-23
clas oot handler lis done con replica mut groups
首先去官網或者github下載MySQL5.7的源碼。
官網地址:https://dev.mysql.com/downloads/mysql/
github地址:https://github.com/mysql/mysql-server/tree/5.7
但是好像都下在不到《MySQL運維內參》中的5.7.16版本,所以我這裏下載了5.7.25版本,和5.7.16版本比較接近。
我這裏下載的是mysql-boost-5.7.25.tar.gz
。
下載好後運行如下命令,解壓,並將其移動到~/文檔
中:
tar -zxvf mysql-boost-5.7.25.tar.gz
mv mysql-5.7.25 ~/文檔/
入口函數在sql/main.cc,該文件中又調用了mysqld_mian,從這個函數開始到結束,就完成了mysqld的啟動操作。
/*
main() for mysqld.
Calls mysqld_main() entry point exported by sql library.
*/
extern int mysqld_main(int argc, char **argv);
int main(int argc, char **argv)
{
return mysqld_main(argc, argv);
}
在sql/mysqld.cc中對mysqld_main函數的定義進行一些精簡,如下:
int mysqld_main(int argc, char **argv) { my_progname= argv[0]; orig_argc= argc; orig_argv= argv; /* 處理配置文件及啟動參數 */ if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv)) { flush_error_log_messages(); return 1; } sys_var_init(); /* 繼續處理參數變量 */ ho_error= handle_options(&remaining_argc, &remaining_argv, &all_early_options[0], mysqld_get_one_option); mysql_audit_initialize(); /* 日誌系統初始化 */ query_logger.init(); // 書上是 logger.init_base(); /* 初始化很多系統內部變量 */ if (init_common_variables()) unireg_abort(MYSQLD_ABORT_EXIT); // Will do exit /* 信號系統初始化 */ my_init_signals(); /* 核心模塊啟動,包括存儲引擎等 */ if (init_server_components()) unireg_abort(MYSQLD_ABORT_EXIT); if (init_ssl()) unireg_abort(MYSQLD_ABORT_EXIT); /* 終端重定向處理 */ reopen_fstream(); /* 網絡系統初始化 */ if (network_init()) unireg_abort(MYSQLD_ABORT_EXIT); start_signal_handler(); // Creates pidfile if (!opt_noacl) { udf_init(); // 書中是 (void) grant_init(); } /* 狀態變量初始化 */ init_status_vars(); /* Binlog相關檢查初始化 */ check_binlog_cache_size(NULL); check_binlog_stmt_cache_size(NULL); binlog_unsafe_map_init(); if (!opt_bootstrap) { set_slave_skip_errors(&opt_slave_skip_errors); if (server_id != 0) init_slave(); /* Ignoring errors while configuring replication. */ } create_shutdown_thread(); start_handle_manager(); /* 服務監聽線程創建 */ setup_conn_event_handler_threads(); // 書上是 handle_connections_sockets(); /* Wait until cleanup is done 從這裏開始,服務器啟動線程一直等待,直到shutdown後,繼續向下執行*/ mysql_mutex_lock(&LOCK_socket_listener_active); socket_listener_active= false; mysql_cond_broadcast(&COND_socket_listener_active); mysql_mutex_unlock(&LOCK_socket_listener_active); int ret= 0; if (shutdown_thr_handle.handle) ret= my_thread_join(&shutdown_thr_handle, NULL); shutdown_thr_handle.handle= NULL; if (0 != ret) sql_print_warning("Could not join shutdown thread. error:%d", ret); clean_up(1); mysqld_exit(MYSQLD_SUCCESS_EXIT); }
所以,從上面的代碼看出,mysqld啟動時做了以下功能:
- 處理配置文件及啟動參數
- 日誌系統初始化
- 初始化很多系統內部變量
- 信號系統初始化
- 核心模塊啟動,包括存儲引擎等
- 終端重定向處理
- 網絡系統初始化
- 狀態變量初始化
- Binlog相關檢查初始化
- 服務監聽線程創建
等。
MySQL學習筆記——MySQL啟動過程(一)