首页 > 数据库 > MySQL > MySQL源码分析(3):配置文件详解
配置文件详解
在一次部署中,我们发现MySQL没有按照配置文件中的innodb_data_path选项创建文件,查找后发现这台机器上有多个配置文件:/etc/my.cnf和/etc/mysql/my.cnf,而MySQL会优先读取/etc/mysql/my.cnf。当出现多个配置文件时,其优先级是如何确定的?源码面前,了无秘密。
用kDbg跟踪调试发现MySQL对系统中各处配置文件的优先级处理如下:
mysys/default.c
406行: int load_defaults(const char *conf_file, const char **groups,
int *argc, char ***argv)
这里其实只是包了一层,调用另一个函数。
450行: int my_load_defaults(const char *conf_file, const char **groups,
int *argc, char ***argv, const char ***default_directories)
函数中段调用init_default_directories,获得程序初始化时将会尝试读取配置文件的所有目录,共五个,依次为:
1. /etc
2. /etc/mysql
3. $BASEDIR/mysql
4. cur_dir
5. ~/
在506行调用了一个函数my_search_option_files,其定义为:
int my_search_option_files(const char *conf_file, int *argc, char ***argv,
uint *args_used, Process_option_func func,
void *func_ctx, const char **default_directories)
此函数的第259行
for (dirs= default_directories ; *dirs; dirs++)
配置文件优先级在此体现,即使前面的配置文件中设置了选项,也会被后面配置中设定的值覆盖。例如在/etc/my.cnf中设定key_bufer_size=200M,但在/etc/mysql/my.cnf中又设定了key_buffer_size=300M,那么最终MySQL启动时将以后者为准。
在mysqld.cc中定义了所有可配置的服务端参数:
enum options_mysqld
{
OPT_ISAM_LOG=256, OPT_SKIP_NEW,
OPT_SKIP_GRANT, OPT_SKIP_LOCK,
OPT_ENABLE_LOCK, OPT_USE_LOCKING,
. .
. .
. .
OPT_SYNC_RELAY_LOG_INFO,
OPT_SYNC_MASTER_INFO
}
当MySQL启动时,会接受命令行和配置文件中的参数值。
if (init_common_variables(MYSQL_CONFIG_NAME, argc, argv, load_default_groups))
unireg_abort(1);
init_common_variables会调用my_load_defaults,该函数会从配置文件中读取参数值并将其放到通过命令行参数传递进来的值的前面,从而使得命令行参数可以覆盖配置文件中的参数。
接着会调用get_options()从合并后的argc, argv[]中解析出参数值,最后程序调用libmysql/my_getopt.c中的handle_options,此函数会跟stuct my_option中的参数比较,如果有模糊或错误的参数则返回错误,否则调用mysqld_get_one_option()处理每一个参数。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29114615/viewspace-1792434/ ,如需转载,请注明出处,否则将追究法律责任。