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