美文网首页
mysql启动源码过程

mysql启动源码过程

作者: ermaot | 来源:发表于2020-03-18 20:11 被阅读0次

    本文来自三个地方:
    mysql 源码学习笔记:mysqld启动流程
    mysql运维内参
    mysql核心内幕:祝定泽

    mysql启动过程简述

    主要函数和流程包括:

    1. 初始化系统变量和系统状态
    2. 初始化服务器的各个模块

    mysql启动过程

    1. mysqld服务器是C++生成的可执行文件,main()函数是总的入口函数
    2. 入口函数在sql/main.cc中
      sql/main.cc
    extern int mysqld_main(int argc, char **argv);
    
    int main(int argc, char **argv) { return mysqld_main(argc, argv); }
    
    1. 所有操作在mysqld_main中完成,该函数在sql/mysqld.cc中定义
    int mysqld_main(int argc, char **argv) {
    ……
    //
    if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv,
                        &argv_alloc)) {
        flush_error_log_messages();
        return 1;
      }
    }
    
    序号 子序号 步骤 解释
    1 pre_initialize_performance_schema() 初始化performance shcema相关内容
    2 my_init()
    3 load_defaults() 处理配置文件及启动参数等。如果有defaults-file则读取,没有则从特定路径查找文件
    4 init_pfs_instrument_array() 初始化performance shcema相关内容
    5 handle_early_options() 初始化部分变量,为mysqld初始化系统表等做装备
    5.1 my_long_early_options() 变量设置,包括bootstrap、skip-grant-tables、help、verbose、version、initialize、initialize-insecure
    6 init_sql_statement_names() 初始化命令,为后续status统计操作数量做准备
    7 sys_var_init() 初始化系统变量hash桶,将所有的系统变量插入到hash桶中(这里的变量为sys_vars.cc中定义的变量)
    8 init_error_log() 初始化error log 锁
    9 mysql_audit_initialize() 初始化audit plugin锁,为后续初始化audit plugin做准备
    10 init_common_variables() 所有变量相关内容初始化,包括变量本身的值以及部分变量控制的特性
    10.1 mysql_init_variables() 设置部分全局变量的默认值
    10.2 init_thread_environment() 初始化全局mutex和condition
    10.3 if (gethostname(glob_hostname,sizeof(glob_hostname)) < 0) 生成pid文件
    10.4 default_storage_engine="innodb" 设置默认存储引擎
    10.5 if (add_status_vars(status_vars)) 将全局变量status_vars中的系统 status存入all_status_vars中
    10.6 get_options() 将设置的系统变量的值更新到系统变量中
    10.7 set_default_auth_plugin 设置默认的身份验证插件(通常为native_password)
    10.8 set_server_version() 设置mysql版本的后缀(-embedded、-log、-debug...)
    10.9 init_errmessage()/init_client_errs() 设置默认存储引擎
    10.10 初始化 charset/collation 设置默认存储引擎
    10.11 lex_init() 初始化解析sql使用的lex
    10.12 default_storage_engine="innodb" 初始化general log 和 slow log的日志名
    11 init_server_components() 服务器各个模块的初始化
    11.1 mdl_init() 服务器各个模块的初始化
    11.2 table_def_init/hostname_cache_init/my_timer_initialize
    11.3 init_server_query_cache query cache初始化
    11.4 randominit 随机数初始化
    11.5 init_slave_list 初始化从机hash桶
    11.6 transaction_cache_init() 事务缓存hash桶和锁初始化
    11.7 delegates_init delegates用于执行回调函数
    11.8 if(opt_bin_log) 如果变量中开启了binlog 生成binlog_index 和 binlog的文件名
    11.9 if(opt_relay_logname) 如果变量中开启了relaylog生成relaylog_index 和 relay log的文件名
    11.10 if(ha_init_errors()) 将handler模块的错误信息注册到mysqld的my_error中
    11.11 if(gtid_server_init()) 初始化gitd结构体
    11.12 if(plugin_init(&remaining_argc, remaining_argv ... 初始化所有的插件(包括编译、配置、命令行加载的参数)
    11.13 query_logger.set_handlers(log_output_options); 初始化general log/slow log的日志处理模块
    11.14 if(initialize_storage_engine(default_storage_engine, "".... 初始化默认的存储引擎
    11.15 if(tc_log->open(opt_bin_log ? opt_bin_logname : opt_tc_log_file)) tc_log打开binlog,主要用于binlog和存储引擎的recovery使用,打开当前index中最后一个文件
    11.16 if(ha_recover(0)) recovery
    11.17 if(mysql_bin_log.open_binlog(opt_bin_logname, 0, mysql_bin_log打开binlog,生成新的binlog,在index文件中加入新的内容
    11.18 mysql_bin_log.purge_logs_before_date(purge_time, true); 如果开启了复制,同时开启了binlog定期删除时间,删除过期的binlog
    11.19 init_max_user_conn(void) 初始化连接hash桶
    11.20 init_update_queries(); 初始化server_command_flags结构体,用于命令统计
    12 init_server_auto_options() 初始化UUID
    13 if(gtid_state->read_gtid_executed_from_table() == -1) 从gtid_execute表中读取gtid_execute
    14 if(opt_bin_log)
    15 init_ssl()/network_init 初始化ssl和网络
    16 create_pid_file() 创建pid文件
    17 acl_init(opt_noacl) 初始化用户名、密码等信息缓存,并将user表中的内容读取缓存
    18 grant_init(opt_noacl) 初始化权限缓存,将tables_priv等表中的权限信息读取缓存
    19 servers_init(0) 初始化mysql.servers表,并读入缓存
    20 udf_init() 初始化用户自定义函数
    21 init_status_vars() 初始化系统状态,system status排序
    22 init_slave() 初始化slave相关的结构体。如存在复制相关的信息,同时skip_slave_start未设置,则启动复制
    23 execute_ddl_log_recovery () 执行ddl语句的crash recovery
    24 start_signal_handler() 创建信号处理线程,处理信号SIGTERM/SIGQUIT/SIGHUP
    25 if (opt_bootstrap) error= bootstrap(mysql_stdin) 初始化数据目录、系统表
    26 if (opt_init_file && *opt_init_file) read_init_file(opt_init_file) 从文件中初始化数据目录、系统表
    27 mysqld_socket_acceptor->connection_event_loop() 监听端口和sock文件,等待客户端连接

    启动到等待客户端连接,说明一切已经准备就绪,可以对外提供服务了。

    相关文章

      网友评论

          本文标题:mysql启动源码过程

          本文链接:https://www.haomeiwen.com/subject/nymhjhtx.html