mysql启动时执行过程_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相关检查初始化

服务监听线程创建

等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值