MySQL源码分析(3):配置文件详解

来源:互联网 发布:灵格斯软件下载 编辑:程序博客网 时间:2024/05/29 10:56
配置文件详解

  1. 关于配置文件存放位置和优先级
    在一次部署中,我们发现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启动时将以后者为准。
  2. 几个重要的配置参数

    • --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()处理每一个参数。
标签: 
  • MySQL
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 与室友关系闹僵怎么办 开庭后被告威胁我们证人怎么办 开车撞了豪车怎么办 我把人撞了全责怎么办 开车撞伤人没钱赔怎么办 开车撞伤无证驾驶人怎么办 开车把人撞伤了只买交强险怎么办 开车撞伤人赔不起怎么办 如果车撞死人了怎么办 给车撞了跑了怎么办 开车把人撞死了怎么办 开车把人蹭了怎么办 驾照被扣54分怎么办? 驾照被扣了12分怎么办 驾驶证丢失后被扣分怎么办 驾照扣了三十分怎么办 一次被扣了12分怎么办 驾照被扣35分后怎么办 我驾驶证扣了6分怎么办 c1驾照被扣6分怎么办 被扣了6分怎么办 今年扣了6分怎么办 驾照分不够扣了怎么办 被扣6分怎么办罚款15 驾照分数扣36分怎么办 驾照12分不够扣怎么办 驾照b证扣分了怎么办 违章18分不够扣怎么办 b2驾驶证扣11分怎么办 驾照一共扣30分怎么办 驾照扣了100分怎么办 驾照扣40多分怎么办 驾照被扣69分怎么办 驾照被扣200多分怎么办 b2驾照扣了分怎么办 驾驶证在外地被冒用怎么办 身份证被冒用办驾照怎么办 外国人在中国境内死了怎么办 台风来临时航船应该怎么办 越南攻占太平岛台湾怎么办 厨房下水pvc管三通漏水怎么办