mysql-源码-001

MySQL 服务启动流程

mysqld 这个程序启动之后直接调用了 mysqld_main 函数

#/data/repos/mysql-server-mysql-8.0.32/sql/main.cc, line 25

25  int main(int argc, char **argv) { return mysqld_main(argc, argv); }

第 2 步执行 mysqld_main 函数

#代码位置 /data/repos/mysql-server-mysql-8.0.32/sql/mysqld.cc:7208

7201 #ifdef _WIN32
7202 int win_main(int argc, char **argv)
7203 #else
7204 int mysqld_main(int argc, char **argv)
7205 #endif
{

第 2.1 步

计算 basedir 和 mysqld 程序的绝对路径

#/data/repos/mysql-server-mysql-8.0.32/sql/mysqld.cc, line 7031

7216      my_progname = argv[0];
7217      calculate_mysql_home_from_my_progname();

第 2.2 步

第一次初始化 ps 数据库

#/data/repos/mysql-server-mysql-8.0.32/storage/perfschema/pfs_server.cc, line 69.

7220    #ifdef WITH_PERFSCHEMA_STORAGE_ENGINE
7221      pre_initialize_performance_schema();
7222    #endif /*WITH_PERFSCHEMA_STORAGE_ENGINE */

第 2.3 步

执行 my_init

#/data/repos/mysql-server-mysql-8.0.32/mysys/my_init.cc, line 133
7224      if (my_init())  // init my_sys library & pthreads

/**
 1、配置文件对应的 umask 值 `my_umask`
 2、配置目录对应的 umask 值 `my_umask_dir`
 3、配置线程互斥变量 my_thread_global_init()
/

第 2.4 步

加载配置文件&设置 datadir

7236      if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv,
7237                        &argv_alloc)) {
7238        flush_error_log_messages();
(gdb) 
7239        return 1;
7240      }
7241    
7242      /* Set data dir directory paths */
7243      strmake(mysql_real_data_home, get_relative_path(MYSQL_DATADIR),
7244              sizeof(mysql_real_data_home) - 1);