背景

有同学问到这样一个问题:原来的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

最新文章

  1. 谈谈Delphi中的类和对象1---介绍几个概念 && 对象是一个地地道道的指针
  2. linux中的namespace
  3. 【搭建开发环境】Linux 中安装 Eclipse 进行 C/C++ 开发
  4. Wpf 鼠标拖动元素实例
  5. 把C#程序(含多个Dll)合并打包成单一文件
  6. 基于visual Studio2013解决C语言竞赛题之0603打印素数
  7. insertBefore 和 insetAfter函数详解
  8. Linux下查看alert日志文件的两种方法
  9. Tensorflow系列——Saver的用法
  10. python3学习笔记13(数据结构)
  11. Vue之axios请求数据
  12. BZOJ3730震波——动态点分治+线段树(点分树套线段树)
  13. Netty多人聊天室
  14. NO.1 hadoop简介
  15. SQL UPDATE嵌套使用
  16. ajax请求本地文件
  17. greendao3.2.0使用
  18. 2017-2018-2 20165312实验二《Java面向对象程序设计》实验报告
  19. oracle 表空间创建和删除
  20. content-type对照表

热门文章

  1. libpng的使用
  2. struts2架构网站漏洞修复详情与利用漏洞修复方案
  3. (数据科学学习手札29)KNN分类的原理详解&Python与R实现
  4. CS61B sp2018笔记 | Lists
  5. ABS(引数と同じ大きさの正の数を返す)
  6. MyEclipse - 问题集 - 创建Maven项目,JDK版本默认是1.5
  7. .NET中调用不安全代码
  8. 【Luogu P4644】Cleaning Shifts
  9. ionic 向路由中的templateUrl(模板页)传值
  10. Qt Qwdget 汽车仪表知识点拆解4 另类进度条实现