mysql启动源码过程

本文来自三个地方:
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启动源码过程)