主函数会调用mysqld.cc中的mysqld_main函数,进行DB的一系列初始化动作。
执行基本的线程库和堆内存初始化
#ifdef _WIN32
int win_main(int argc, char **argv)
#else
int mysqld_main(int argc, char **argv)
#endif
{
..
/*
Perform basic thread library and malloc initialization,
to be able to read defaults files and parse options.
*/
my_progname = argv[0];
calculate_mysql_home_from_my_progname();
#ifndef _WIN32
#ifdef WITH_PERFSCHEMA_STORAGE_ENGINE
pre_initialize_performance_schema();
#endif /*WITH_PERFSCHEMA_STORAGE_ENGINE */
// For windows, my_init() is called from the win specific mysqld_main
if (my_init()) // init my_sys library & pthreads
{
LogErr(ERROR_LEVEL, ER_MYINIT_FAILED);
flush_error_log_messages();
return 1;
}
#endif /* _WIN32 */
加载参数文件
orig_argc = argc;
orig_argv = argv;
my_getopt_use_args_separator = true;
my_defaults_read_login_file = false;
if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv,
&argv_alloc)) {
flush_error_log_messages();
return 1;
}
argc_cached = argc;
argv_cached = new (&argv_alloc) char *[argc_cached + 1];
memcpy(argv_cached, argv, argc_cached * sizeof(char *));
argv_cached[argc_cached] = nullptr;
设置数据目录
/* Set data dir directory paths */
strmake(mysql_real_data_home, get_relative_path(MYSQL_DATADIR),
sizeof(mysql_real_data_home) - 1);
初始化参数的缓存
/*
Initialize variables cache for persisted variables, load persisted
config file and append parse early read only persisted variables
to command line options if present.
*/
bool arg_separator_added = false;
if (persisted_variables_cache.init(&argc, &argv) ||
persisted_variables_cache.load_persist_file() ||
persisted_variables_cache.append_parse_early_variables(
&argc, &argv, arg_separator_added)) {
flush_error_log_messages();
return 1;
}
remaining_argc = argc;
remaining_argv = argv;
init_variable_default_paths();
如果开启了performance_schema,初始化相关配置
#ifdef WITH_PERFSCHEMA_STORAGE_ENGINE
/*
Initialize the array of performance schema instrument configurations.
*/
init_pfs_instrument_array();
#endif /* WITH_PERFSCHEMA_STORAGE_ENGINE */
初始化资源组
// Initialize the resource group subsystem.
auto res_grp_mgr = resourcegroups::Resource_group_mgr::instance();
if (!is_help_or_validate_option() && !opt_initialize) {
if (res_grp_mgr->init()) {
LogErr(ERROR_LEVEL, ER_RESOURCE_GROUP_SUBSYSTEM_INIT_FAILED);
unireg_abort(MYSQLD_ABORT_EXIT);
}
}
审计接口初始化
/* Initialize audit interface globals. Audit plugins are inited later. */
mysql_audit_initialize();
查询日志初始化
/*
Perform basic query log initialization. Should be called after
MY_INIT, as it initializes mutexes.
*/
query_logger.init();
信号初始化
my_init_signals();
决定默认的数据库端口和socket名字
/* Determine default TCP port and unix socket name */
set_ports();
初始化网络
if (network_init()) unireg_abort(MYSQLD_ABORT_EXIT);
初始化GTID的设置
if (opt_bin_log) {
/*
Initialize GLOBAL.GTID_EXECUTED and GLOBAL.GTID_PURGED from
gtid_executed table and binlog files during server startup.
*/
Gtid_set *executed_gtids =
const_cast<Gtid_set *>(gtid_state->get_executed_gtids());
Gtid_set *lost_gtids = const_cast<Gtid_set *>(gtid_state->get_lost_gtids());
Gtid_set *gtids_only_in_table =
const_cast<Gtid_set *>(gtid_state->get_gtids_only_in_table());
Gtid_set *previous_gtids_logged =
const_cast<Gtid_set *>(gtid_state->get_previous_gtids_logged());
Gtid_set purged_gtids_from_binlog(global_sid_map, global_sid_lock);
Gtid_set gtids_in_binlog(global_sid_map, global_sid_lock);
Gtid_set gtids_in_binlog_not_in_table(global_sid_map, global_sid_lock);
if (mysql_bin_log.init_gtid_sets(
>ids_in_binlog, &purged_gtids_from_binlog,
opt_source_verify_checksum, true /*true=need lock*/,
nullptr /*trx_parser*/, nullptr /*partial_trx*/,
true /*is_server_starting*/))
unireg_abort(MYSQLD_ABORT_EXIT);
将pid保存到文件中
/* Save pid of this process in a file */
if (!opt_initialize) {
if (create_pid_file()) abort = true;
}
读取优化器成本模型配置表
/* Read the optimizer cost model configuration tables */
if (!opt_initialize) reload_optimizer_cost_constants();
if (
/*
Read components table to restore previously installed components. This
requires read access to mysql.component table.
*/
(!opt_initialize && mysql_component_infrastructure_init()) ||
mysql_rm_tmp_tables()) {
abort = true;
}
检查binlog
check_binlog_cache_size(nullptr);
check_binlog_stmt_cache_size(nullptr);
binlog_unsafe_map_init();
ReplicaInitializer replica_initializer(opt_initialize, opt_skip_replica_start,
rpl_channel_filters,
&opt_replica_skip_errors);
初始化存储引擎等核心模块
server_components_initialized();
输出运行的pid号
if (opt_daemonize) {
if (nstdout != nullptr) {
// Show the pid on stdout if daemonizing and connected to tty
fprintf(nstdout, "mysqld is running as pid %lu\n", current_pid);
fclose(nstdout);
nstdout = nullptr;
接收连接
mysqld_socket_acceptor->connection_event_loop();
2417

被折叠的 条评论
为什么被折叠?



