关于session variables 和 global variables

背景

    有同学问到这样一个问题:原来的binlog格式是statement,为什么执行了 set global binlog_format='row' 和 set binlog_format='row',在binlog里面还是会看到有生成statement格式的事件?



变量分类

很多文章都说到MySQL的按照可见性范围分成两类 session和global。实际上是三类 session_only, both, global_only.如下图见到的关系。


session_only是仅线程级别意义的,比如 last_insert_id

    global_only 是仅全局级别有意义的,比如 sync_master_info

    both则是同时有全局和线程两个状态。这类变量需要特别注意它的规则:

    1) 每个新线程创建时从global获取值,设置为线程值

    2) 单独执行 set var_name=var_value时,只改变本线程的值,不改变global.value

       单独执行 set global var_name=var_value时,只改变全局的值,本线程的不改变



    前面说到的问题中,binlog_format就是这种both类的变量。因此即使两个命令都执行了,但是对于那些执行命令之前已经存在的长连接线程的本地值,仍然是statement,因此仍会生成statement格式的binlog 事件。



区分变量类型

既然有三种类型,那么如何区分呢。

在现在的MySQL各个版本中, show variables 是等效与 show session variables. 如果要看global类的,需要特别指明 show global variables. 但是这里容易造成一个误解。

需要明确的是, show global variables 是包含上图蓝色和绿色部分,而show session variables 是包含全部!

这个效果是因为在执行show variables的时候,作了这么一个判断

“// don't show session-only variables in SHOW GLOBAL VARIABLES”(来源于代码注释),但是对于show session variables这个命令,则无限制,因此显示所有的变量。不太合理



因此如果要归纳那些session_only的,可以将这两个命令的结果作个diff。但要看global_only的就没有比较快捷的方法了。

猜你喜欢

转载自lotuo.iteye.com/blog/1867079