前言
这是一个关于 mysql 中的一些配置的探索
起因是需要 看一下 mysql 自增长的实现, 这里面涉及到两个变量
auto_increment_increment, auto_increment_offset, 然后 需要探索一下 这两个变量的来历
然后 就有了这里的相关介绍
global_variables 的初始化
global_variables 来自于外部
可以看到 在 main 入口的地方, 已经被初始化一次了
init_common_variables 中有对 global_system_variables 做一定的初始化
线程中的 variables 的初始化
在线程的构造方法中, 初始化为 global_system_variables 然后之后再进行更新
配置文件中的配置对应于哪里?
在 my.cnf 中增加, max_allowed_packet = 100M
然后 来调试看一下, 入口的地方 max_allowed_packet 为 4194304, 4M
设置我们配置的 max_allowed_packet 的值的地方是在这里 my_handle_options
我们在 my.cnf 中增加的配置, 是作为 mysqld 的命令行参数传递进来的
将 my.cnf 中的配置附加到 程序参数的地方是在 load_defaults 中, 之前是 “/root/mysql/mysql-5.7.27/bin/mysqld --user=root”更新之后为 “/root/mysql/mysql-5.7.27/bin/mysqld --max_allowed_packet=100M --args-seprator-- --user=root”
set global max_allowed_packet = 1011000
假设我这里执行 “set global max_allowed_packet = 1011000;”
如下地方是计算保存的值的地方, 这里有一定的 调整, 比如这里 option.block_size 为 1024, 1011000 按照 1024 对齐, 计算得到的结果为 1010688
具体更新 global_system_variables.max_allowed_packet 的地方如下
global_var(T) 获取的是 global_system_variables 中 max_allowed_packet 的指针
然后这里设置其值为 1010688
set session autocommit = 1
其他的预处理 同上, 我们这里主要看一下 更新的哪里的数据
这里和 全局处理差不多, 只是这里是使用的 session_var_ptr 获取的当前线程的 variables
获取目标变量地址的地方
是基于 THD->variables, 获取 autocommit 的偏移, 作为指针返回
为什么上面不使用 max_allowed_packet 进行测试呢
因为 session 范围内, max_allowed_packet 是只读的, 然后 会响应 ER_VARIABLE_IS_READONLY[1621] 给客户端
具体的各个变量的相关配置 是在这里, 定义了需要的各类属性
show variables / show global variables
这里来看一下 show variables 的实现
查询的实际上是 performance_schema 中的 global_variables, session_variables
这两张表示 逻辑上的数据结构
真实数据是 取自于 内存中, 比如 global_variables 来自于 global_system_variables, session_variables 来自于 THD.variables
这里是从 global_system_variables 取数据的地方, 可以看到 performance_schema 是由 PFS 引擎支撑实现的
这里是从 global_system_variables 取数据的地方, 然后 这里拿到的数据 放到了 m_cache 中, 这个是后面 迭代当前表数据的基础
也就是 system_variables 中的数据来自于 global_system_variables
在更上层 table_global_variables 这一层级是由 m_sysvar_cache 来维护这些变量, 可以理解为 m_sysvar_cache 中组合了上面的 m_cache
这里是遍历 整张表的地方, ha_rnd_next 中实现的具体的迭代
具体的迭代的实现, 遍历的是 m_sysvar_cache 中的 m_cache 的相关数据
这里是填充每一行数据的地方, 填充对应的 key, value
session 变量这边同样的道理, 只是说 他数据是取自当前 线程
有几种取数据的方式, 如下是 直接通过 偏移获取
如下是通过 sys_var_tmp 获取
完