MySQL系列(3):mysqld解析之入口和加载配置

引言

上一节介绍了mysqld_safe的执行过程,这一节根据mysqld_safe生成的启动命令,来跟踪mysqld的入口和加载配置流程。

分析

入口

sql/main.cc的main函数调用了sql/mysqld.cc的mysqld_main函数。
这里我们以如下方式启动mysqld:

/usr/local/mysql/bin/mysqld \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data \
--plugin-dir=/usr/local/mysql/lib/plugin \
--user=mysql

加载配置

load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv)

MYSQL_CONFIG_NAME的值为"my",argc为参数个数,argv为参数值。此时argv为{"/usr/local/mysql/bin/mysqld", “–basedir=/usr/local/mysql”, “–datadir=/usr/local/mysql/data”, “–plugin-dir=/usr/local/mysql/lib/plugin”, “–user=mysql”}

  1. 初始化配置目录
dirs= init_default_directories(&alloc)

初始化的目录dirs有"/etc/","/etc/mysql/","/usr/local/mysql/etc/","~/"。

  1. 读取配置文件
my_search_option_files(conf_file, argc, argv,&args_used, handle_default_option, (void *) &ctx, dirs, false, found_no_defaults)

读取目录中的配置文件。我们选择"~/"目录进行调试,在目录下新建.my.cnf隐藏文件。如果选择初始化目录中的其它目录,文件名则为my.cnf。在.my.cnf中随便输入一些内容,如下:

[mysqld]
max-connections = 300
port = 3306

此时ctx.m_args.m_array_ptr指向的值为{"–max-connections=300", “–port=3306”}

  1. 追加配置参数
memcpy((res+1), &my_args[0], my_args.size() * sizeof(char*));
set_args_separator(&res[my_args.size() + 1]);
memcpy((uchar*) (res + 1 + my_args.size() + args_sep), (char*) ((*argv)+1), (*argc-1)*sizeof(char*));

my_args的值被复制到res,并追加分隔符和argv的值,形成的效果是配置文件中读取的参数加到启动参数的前面。最后argv为{"/usr/local/mysql/bin/mysqld", “–max-connections=300”, “–port=3306”, “----args-separator----”, “–basedir=/usr/local/mysql”, “–datadir=/usr/local/mysql/data”, “–plugin-dir=/usr/local/mysql/lib/plugin”, “–user=mysql”}

总结

查看源码时,要先从主函数入手,一步步跟踪调试。当前加载配置流程,需要抓住argv的变化过程。

关键词

入口;初始化配置目录;读取配置文件;追加配置参数


欢迎关注公众号,获取推送更方便,遇到问题来交流!

技术长跑

你可能感兴趣的:(MySQL)