配置文件详解
- 关于配置文件存放位置和优先级
在一次部署中,我们发现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启动时将以后者为准。- 几个重要的配置参数
- --datadir: 数据文件的存放路径。
- --basedir: mysql: 安装路径。
- --concurrent_insert: 默认情况下(AUTO)mysql允许对MyISAM引擎的select和insert操作并行执行。
- --key_buffer_size: 指定缓存key index用的cache大小。
- --table_open_cache: 所有threads打开的table数量。
- --sort_buffer_size: 每个线程都需要分配一个排序缓存,用于ORDER BY或GROUP BY。
- --read_buffer_size: 每个线程对表做scan操作时需要分配这样的缓存,需要是4k的倍数。
- --read_rnd_buffer_size: Sort_buffer中的数据被按照Key排序,此时MySQL会从中取出一部分数据按照物理磁盘上行指针的顺序排列并放入read_rnd_buffer中。
- --thread_cache_size: 服务端可以重新使用的线程数。当一个客户端连接线程结束工作时,会被放入该缓存中以备重用。
- --tmp_table_size: 可以使用的最大内存中的临时表。
- --query_cache_size: 缓存查询结果的内存使用量,默认为禁止(0)
在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()处理每一个参数。