1. 程式人生 > >MySQL學習筆記——MySQL啟動過程(一)

MySQL學習筆記——MySQL啟動過程(一)

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啟動過程(一)