• 关于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的就没有比较快捷的方法了。

    参考:

    http://dinglin.iteye.com/blog/1846854

  • 相关阅读:
    C++ 友元(friend关键字)、类中的重载、操作符重载(operator关键字)
    C++ 二阶构造模式
    C++ 对象构造顺序、构析函数、临时对象。
    C++ 初始化列表
    C++ 对象的构造
    C++ 类学习笔记 :: 作用域限定符
    linux和window下生成任意大小的文件
    RobotFramework和Eclipse集成-安装和使用说明
    Linux中判断一个命令是否执行成功
    xpath 轴定位表达方式
  • 原文地址:https://www.cnblogs.com/xiaotengyi/p/3568196.html
Copyright © 2020-2023  润新知