本文来自三个地方:
mysql 源码学习笔记:mysqld启动流程
mysql运维内参
mysql核心内幕:祝定泽
mysql启动过程简述
主要函数和流程包括:
- 初始化系统变量和系统状态
- 初始化服务器的各个模块
mysql启动过程
- mysqld服务器是C++生成的可执行文件,main()函数是总的入口函数
- 入口函数在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); }
- 所有操作在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文件,等待客户端连接 |
启动到等待客户端连接,说明一切已经准备就绪,可以对外提供服务了。