要研究mysql,最好的资源莫过于源码了,所以本人打算通过调试源码的方式来深入理解mysql的点点滴滴。搭建mysql调试环境很简单,从官方下载mysql源码,利用cmake工具生成工程即可。为了方便调试,也因为vs调试的直观性,我的源码工程是在windows平台下面的,下面进入正题。

在vs环境下,选择mysqld工程,直接启动调试运行,此时我并没有指定任何配置文件,但程序依然正常运行,那么程序应该会使用默认的配置文件。首先需要确定两个问题,程序在哪些个目录下去寻找配置文件,以什么样的顺序来查找。通过调试发现,程序首先会分别收集windows系统目录、C:\根目录、执行码所在的父目录,如果配置了环境变量MYSQL_HOME,这个目录也会被搜集,然后在这些目录下进行查找my.ini文件,这里面涉及到主要接口是my_load_defaults和search_default_file。

而实际情况是,这些目录里面没有任何一个配置文件,说明即使mysqld启动时,一个配置文件信息获取不到,也是可以成功启动的,那么这些默认值一定是在代码里面写死了的。现在我们要去代码里找到这些参数的默认值,以及他们是如何初始化的。在mysqld.cc里面,我们看到了全局变量global_system_variables的定义,该参数是一个结构变量,包含了大部分的mysql系统变量,下一步就是看这个全局变量何时被初始化的了。在vs里面,我们可以设置数据断点,通过数据断点我们能够知道特定内存地址是何时被改变的。我们以max_connections为例,将其地址设置数据断点,看看它是何时被改变的,果然确实被改过,堆栈如下图:

堆栈显示了初始化流程,通过分析各个函数即可以知道初始化逻辑。

代码如下图:

这说明全局变量与value是一一对应的。逐个跟踪变量,找到变量all_sys_vars,该变量是一个结构,包含两个指针,初始化值为NULL,跟踪这个链表找到了问题的答案。在sys_vars.h头文件中,我们找到了all_sys_vars变量的影子,顺藤摸瓜,在sys_vars.cc文件里面,看到大量的静态对象,从名字可以看出,这些对象和变量有千丝万缕的联系。比如Sys_max_connections对象定义如下:

这里很明白了,通过传递max_connections的地址,建立了与对象sys_var的联系,而所有sys_var对象都通过链表对象 all_sys_vars 管理。到目前为止,我们已经很清楚地知道mysql系统变量值初始化的来龙去脉了。通过--defaults-file我们可以指定配置文件。基本逻辑是,读取默认参数值后,会利用配置文件值对其进行覆盖,使配置文件的值生效。下面附几个主要类和接口:

类:
Sys_var_mybool
    Sys_var_typelib
        sys_var
 
Sys_var_ulong
    sys_var
 
接口:
my_search_option_files(搜索文件),
search_default_file_with_ext(读取配置文件内容),
handle_default_option(处理每一行参数)
getopt_compare_strings(查找匹配项,设置特定参数的值)
insert_dynamic(将变量插入链表)
 

mysql源码解读之配置文件的更多相关文章

  1. mysql源码解读之事务提交过程(二)

    上一篇文章我介绍了在关闭binlog的情况下,事务提交的大概流程.之所以关闭binlog,是因为开启binlog后事务提交流程会变成两阶段提交,这里的两阶段提交并不涉及分布式事务,当然mysql把它称 ...

  2. mysql源码解读之事务提交过程(一)

    mysql是一种关系型数据库,关系型数据库一个重要的特性就是支持事务,这是区别于no-sql产品的一个核心特性.当然了,no-sql产品支持键值查询,不能支持sql语句,这也是一个区别.今天主要讨论下 ...

  3. MYSQL 源码解读系列 [线程池。。] ----dennis的博客

    http://blog.sina.com.cn/s/articlelist_1182000643_0_1.html

  4. php-msf 源码解读【转】

    php-msf: https://github.com/pinguo/php-msf 百度脑图 - php-msf 源码解读: http://naotu.baidu.com/file/cc7b5a49 ...

  5. swoft 源码解读【转】

      官网: https://www.swoft.org/ 源码解读: http://naotu.baidu.com/file/814e81c9781b733e04218ac7a0494e2a?toke ...

  6. Prometheus 源码解读(一)

    Prometheus 源码解读(一) Prometheus 是云原生监控领域的事实标准,越来越来的开源项目开始支持 Prometheus 监控数据格式.从本篇开始,我将和大家一起阅读分析 Promet ...

  7. spring IOC DI AOP MVC 事务, mybatis 源码解读

    demo https://gitee.com/easybao/aop.git spring DI运行时序 AbstractApplicationContext类的 refresh()方法 1: pre ...

  8. SDWebImage源码解读 之 SDWebImageCompat

    第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...

  9. SDWebImage源码解读之SDWebImageCache(上)

    第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...

随机推荐

  1. 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸

    [源码下载] 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸 作者:webabcd 介绍背水一战 Windows 10 之 UI 窗口全屏 窗口尺寸 示例1.窗口全屏UI/F ...

  2. 由一个异常开始思考springmvc参数解析

    首先记录一下异常,以及异常出现的原因和解决方案 异常主要信息: -- ::, ERROR [.jsp] - Name for argument type [java.lang.String] not ...

  3. Oracle 数据库基础学习 (六) 子查询

    子查询在一个select中出现多个嵌套查询语句 1.在where子句中使用子查询(一般返回"单行单列" "单行多列" "多行单列"(可以提供 ...

  4. 袋鼠过河---DP

    题目:一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远,每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5, ...

  5. ThinkCMF变量输出+使用函数

    ThinkCMF变量输出+使用函数的方式同ThinkPHP. ThinkPHP变量输出: 在模板中输出变量的方法很简单,例如,在控制器中我们给模板变量赋值: $name = 'ThinkPHP'; $ ...

  6. socket.io,远程控制你的幻灯片

    原文:http://www.cnblogs.com/xiezhengcai/p/3964455.html 中秋休息了几天,今天又开始捣鼓socket.io了.今天的任务是通过socket.io控制你的 ...

  7. 服务器端高性能的IO模型 转自酷勤网

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(BlockingIO):即传统的IO模型. (2)同步非阻塞IO(Non-blockingIO):默认创建的soc ...

  8. Quartz任务调度器

    在使用jdk的timer时发现无法满足开发需求:即无法在指定的日期进行执行任务. 这便引入一个优秀的开源任务调度框架“quartz”.   这里加入的是quartz-1.8.6版本.Quart的官网: ...

  9. Timeline Portfolio - 时间轴作品集效果

    这里分享一个超炫的时间轴展示作品集效果.设计师和前端开发人员可以借助这个效果来制作新颖的作品集和个人简历.时间轴专门用来呈现出年代的一系列事件.您可以把这种效果嵌入各种媒体,包括微博,视频和地图,并把 ...

  10. 原生JS:Number对象详解

    Number对象 本文参考MDN做的详细整理,方便大家参考MDN JavaScript 的 Number 对象是经过封装的能让你处理数字值的对象.Number 对象由 Number() 构造器创建. ...