mysql5.7 源码分析--初始化

集中在sql\mysqld.cc文件的mysqld_main函数中():

主程序入口

在sql\main.cc文件中:

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

一、mysql为了跨平台,对win32系统做了单独的初始化:

主要包括:

1.my_init函数

my_init()

包括:

1)文件和文件目录权限初始化

  /* Default creation of new files */
  if ((str= getenv("UMASK")) != 0)
    my_umask= (int) (atoi_octal(str) | 0600);
  /* Default creation of new dir's */
  if ((str= getenv("UMASK_DIR")) != 0)
    my_umask_dir= (int) (atoi_octal(str) | 0700);

2)全局错误提示初始化

init_glob_errs();

3)全局线程和互斥锁初始化

 if (my_thread_global_init())
    return 1;

#if defined(SAFE_MUTEX)
  safe_mutex_global_init();		/* Must be called early */
#endif

#if defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX)
  fastmutex_global_init();              /* Must be called early */
#endif

2.windows系统的上服务初始化

主要是为了windows上的服务机制单独做处理

 if (Service.GetOS())  /* true NT family */
  {
...
      /* start the default service */
      start_mode= 1;
      Service.Init(MYSQL_SERVICENAME, mysql_service);
      return 0;
...
  }

二、mysql服务初始化

主要包括:

1.配置文件加载,读取配置文件如:stonedb.cnf

load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv

2.解析初始化

将命令存储在sql_statement_names全局数组里,如SQLCOM_SELECT对应select

init_sql_statement_names()

3.系统变量初始化

将系统变量放入哈希表中

sys_var_init();

4.初期选项初始化

有部分系统变量需要在mysqld --initialize时使用,所以越早初始化越好,handle_early_options函数就是为了初始化这部分系统变量。

handle_early_options()

5.日志互斥锁初始化

init_error_log_mutex();

6.审计初始化

mysql_audit_initialize();

7.日志初始化

  logger.init_base();

8.mysql通用变量初始化

如所有线程的互斥锁初始化,线程缓存大小、日志名称等

init_common_variables()

9.信号初始化

my_init_signals()

10.设置线程栈大小

pthread_attr_setstacksize(&connection_attrib,
                            my_thread_stack_size + guardize);

检查启动时用户的选项

user_info = check_user(mysqld_user)

设置以该用户运行

set_user(mysqld_user, user_info);

11.服务组件初始化

包括一些插件的初始化、默认存储引擎的初始化、最大连接数等

init_server_components()

12.UUID的创建

每个服务都应该有一个自己的UUID,如果没有的话,就创建一个

if (!opt_bootstrap)
{
    if (init_server_auto_options())
    {
    ...
}

13.ssl初始化

如果打开openssl,就初始化ssl

init_ssl()

14.网络初始化

创建连接tcp/ip套接字、命名管道、UNIX socket(共享内存在连接时处理)

network_init()

创建pid文件

start_signal_handler()

删除tmp_table并初始化数据库级别的权限

mysql_rm_tmp_tables() || acl_init(opt_noacl)

初始化status变量

init_status_vars()

binlog初始化

check_binlog_cache_size(NULL);
check_binlog_stmt_cache_size(NULL);
binlog_unsafe_map_init();

初始化information_schema权限

initialize_information_schema_acl();

ddl日志恢复

execute_ddl_log_recovery();

创建shutdown线程

create_shutdown_thread()

创建manager线程

start_handle_manager();

开启连接处理线程

handle_connections_sockets()--unix/ handle_connections_methods()--windows
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩澜大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值