zoukankan      html  css  js  c++  java
  • 关于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++类中的函数重载
    C++中的友元
    bzoj 2820
    莫比乌斯函数
    bzoj 2440: [中山市选2011]完全平方数
    莫比乌斯反演1
    [转]C++ 指针和引用
    P2756 飞行员配对方案问题
    P2055 [ZJOI2009]假期的宿舍
    P2654 原核生物培养
  • 原文地址:https://www.cnblogs.com/xiaotengyi/p/3568196.html
Copyright © 2011-2022 走看看