zoukankan      html  css  js  c++  java
  • MySQL学习笔记——MySQL启动过程(一)

    首先去官网或者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相关检查初始化
    • 服务监听线程创建

    等。

  • 相关阅读:
    php错误抑制符
    php执行运算符
    php中一个经典的!==的用法
    php实现简单验证码的功能
    jquery是什么
    php连接符
    php与java语法的区别
    考雅思策略
    php魔术常量
    PHP中数据类型转换的三种方式
  • 原文地址:https://www.cnblogs.com/zifeiy/p/10311226.html
Copyright © 2011-2022 走看看