由源码看mysql启动过程

  • 所有操作都在mysqld_main中完成。
  • 首先是查找配置文件,系统就会从上面已经构造的几个系统目录中找名为my.cnf 及my.ini的文件,如果最终没有找到,则系统退出。
  • 当确定了配置文件之后,系统通过函数search_default_file_with_ext打开并解析每一行内容,因为配置文件支持分组,所以它同时会确定当前解析的参数属于哪个组。
  • 每个参数都会被缓存到内存中,这个缓存操作是由函数handle_default_option来完成的
  • load_defaults,它的作用就是找到配置文件并从中解析出服务器对应的参数
  • 接下来的函数是sys_var_init,这里是将所有的系统变量加入到哈希表system_variable_hash中
  • all_sys_vars参数,这是一个单链表,它包含了sys_vars.cc文件中指定的所有类似Sys_pfs_enabled的变量,这些变量都是全局变量,在没有执行main函数时就加入到链表中了
  • sys_var分成两类,在MySQL启动时,有些模块必须很早就要执行,而它会用到一些参数,所以就将参数按照使用顺序分为了PARSE_EARLY和PARSE_NORMAL两部分,区分这两个不同属性,要看在创建一个参数时通过类(sys_var)成员m_parse_flag所指定的值是什么
  • longopts变量,这里面存储的是所有PARSE_EARLY类型的变量地址,源变量信息存储在argv数组中,个数通过argc来表示
  • logger.init_base函数。logger是MySQL用来记录系统运行情况的日志系统,默认情况下,系统会将日志信息写入到文件中,但可以通过设置将其记录到表中
  • init_common_variables函数,是用来初始化一些全局变量的
    首先可以看到,设置默认存储引擎default_storage_engine也是在这里做的,之后初始化了权限验证插件。 接着,函数add_status_vars是将所有的状态变量存储到all_status_vars中,这也是我们经常使用的show status命令所对应的信息。
    这次初始化的目标是mysqld.cc文件中的结构体数组my_long_ options,再加上上面介绍的sys_vars.cc中的所有变量,不过这次使用的是PARSE_NORMAL类型的
    my_long_options中的变量可以被指定为命令行启动参数
    再往下,还是对一些零散全局变量的初始化操作。
  • 再回到上面的函数mysqld_main中,继续下一个核心函数init_server_components。 在核心函数init_server_components中,将初始化一些系统模块,包括mdl(元数据锁)、表定义缓存、查询结果集缓存、创建错误日志文件。如果配置了Binlog,则初始化并打开Binlog系统,然后初始化存储引擎,它会将所有系统支持且经过配置的存储引擎初始化
  • 继续跟踪下去,下面是network_init。这个函数的主要作用是创建服务器的socket,并绑定端口,然后调用listen函数将当前套接字转换为被动套接字。
  • 接着是函数reopen_fstreams,这就是为什么不管在Windows还是Linux下,系统内部的printf都没有显示在终端上,而是被记录在log文件中的原因,因为这里将输出重定位了。所有的输出都被重定位到文件中,如果为了方便调试,可以稍微修改一下这里的代码,就可以让信息重新显示到终端。
  • 接下来,调用函数grant_init,它是在变量opt_noacl为0的时候才被执行的。而看一下opt_noacl这个变量在什么地方初始化就会发现,原来它是通过参数skip-grant-tables设置的,如果设置这个参数为真,那么任何操作都不再受权限限制。
  • 再下来就是init_slave函数,它是初始化复制的。如果之前没有配置过向其他主库的复制操作,或者设置了参数–skip_slave_start,这里就会在初始化之后直接返回;而如果之前已经开启过复制,同时又没有设置这个参数,这里就会同时开始复制操作。
  • 最后,MySQL做的另外一个重要的操作就是调用函数handle_connections_sockets。这个函数与创建用户线程有关系

  • 又读了一次,简单来说,启动过程就是找到配置文件,解释文件,将信息缓存起来,以供使用;
  • 读取文件,导入更多的全局变量,变量导入有先有后分两部分,变量的导入在main程序之前就已经导入,这些包括自定义的变量, 也包括默认的变量,类似默认数据库引擎等信息;
  • 启动日志的函数,日志函数也是启动得比较早
  • 然后是主函数的操作,启动系统模块
  • 接着的创建socket的函数,用于通信
  • 然后是权限参数,设置是否需要检查登陆权限
  • 之后是开始从主机复制的函数
  • 最后就是connection函数,用于创建用户线程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值