这次我们要探索更精细的binlog内容,上次讨论的Query_event和Rows_event肯定有让你疑惑不解的问题。Query_event中的status-vars环境变量有哪些,Rows_event的数据类型是什么,元数据又是个什么鬼东西,今天我们就来一一解答。

一、Query_event中的令人费解的status-vars

status-vars据说是为了兼容低版本的mysql服务器而加入的环境变量设置,告诉低版本的mysql服务器sql语句是在什么环境下执行的

具体的格式是状态枚举值+状态参数

下面以状态枚举值分别讲下比较重要的几个状态:

(1)0x00 Q_FLAGS2_CODE 4个字节

这个主要是对于SQL_AUTO_IS_NULL、FOREIGN_KEY_CHECKS、UNIQUE_CHECKS、AUTOCOMMIT的设置,SQL_AUTO_IS_NULL是自动填充NULL,FOREIGN_KEY_CHECKS是外键检查,UNIQUE_CHECKS是唯一键索引检查,AUTOCOMMIT就是自动提交,在此处SQL_AUTO_IS_NULL = 1,其他均为0。

(2)0x01 Q_SQL_MODE_CODE 8个字节

这里的配置要参考SET sql_mode: http://dev.mysql.com/doc/refman/5.7/en/set-variable.html,这里有大量的sql环境变量

对应的状态列表可以参考http://dev.mysql.com/doc/internals/en/query-event.html#q-sql-mode-code

可以参考下面的中文翻译:

1)单项模式:

  1. ALLOW_INVALID_DATES:该项如果设置,mysql对于日期的月month和日day进行检查。任何日期只要满足0<month<13 , 0<day<32的整数就能成为插入值。
  2. ANSI_QUOTES: 如果设置该项,mysql会将引号“"’”作为引号来看待,而不是字符串符号。
  3. ERROR_FOR_DIVISION_BY_ZERO:该项如果设置,mysql会将任何数除以0以后的数以NULL的形式插入。
  4. HIGH_NOT_PRECEDENCE:该项如果设置,not运算符的优先值会被下降,如mysql会将NOT a BETWEEN b AND c 解析成NOT (a BETWEEN b AND c)
  5. IGNORE_SPACE:该项如果设置,mysql会允许函数名和“(”能有空格。
  6. NO_AUTO_CREATE_USER:该项如果设置,mysql会防止在grant语句执行时自动生成新用户。
  7. NO_AUTO_VALUE_ON_ZERO:该项如果设置,mysql在处理AUTO_INCREMENT列时,仅仅只对null生成下一个序列号。
  8. NO_BACKSLASH_ESCAPES:该项如果设置,mysql不能使用”\”作为转义字符。
  9. NO_DIR_IN_CREATE:该项如果设置,在建表时mysql会忽略所有的INDEX DIRECTORY 和DATA DIRECTORY。
  10. NO_ENGINE_SUBSTITUTION:该项如果设置,在CREATE TABLE 或ALTER TABLE时mysql会对无法使用的引擎报错,但不做实际的操作。
  11. NO_FIELD_OPTIONS仅对SHOW CREATE TABLE命令有效。
  12. NO_KEY_OPTIONS同上。
  13. NO_TABLE_OPTIONS同上。
  14. NO_UNSIGNED_SUBTRACTION:如果该项设置,mysql会在对负数更新到unsingned int数上不进行限制。
  15. NO_ZERO_DATE:如果该项设置,并且严格的SQL模式设置,mysql对于日期是0000-00-00不能插入更新。
  16. NO_ZERO_IN_DAT:如果该项设置,并且严格的SQL模式设置,mysql对于日期有0值的(除了0000-00-00)不能插入更新。
  17. ONLY_FULL_GROUP_BY在5.75新增,对本次开发没有影响。
  18. PAD_CHAR_TO_FULL_LENGTH:如果该项设置,mysql不会在检索回收多余的char空间。
  19. PIPES_AS_CONCAT:如果该项设置,mysql将把||看成CONCAT()。
  20. REAL_AS_FLOAT:如果该项设置,mysql将把REAL看成FLOAT。
  21. STRICT_ALL_TABLES:该项如果设置,mysql会进入严格的sql模式。
  22. STRICT_TRANS_TABLES: 该项如果设置,mysql会进入严格的sql模式,仅对事务有效。

2)混合模式:

1. ANSI:该项如果设置,和REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE等价,在

2. DB2:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS一起设置等价。

3. MAXDB:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER一起设置等价。

4. MSSQL:该项如果设置, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. 一起设置等价。

5. TRADITIONA:该项如果设置,与STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

6. POSTGRESQL:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS一起设置等价。

7. ORACLE:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS一起设置等价。

8. MYSQL323:仅对SHOW CREATE TABLE有影响。

9. MYSQL40:同上。

(3)0x02 Q_CATALOG

默认记录为"\x3std\x0",即mysql服务器所使用的目录。一字节长度+NULL字符串

(4)0x03 Q_AUTO_INCREMENT

与AUTO_INCREMENT有关,4字节,前2个字节表示AUTO_INCREMENT,后2个字节表示AUTO_INCREMENT_OFFSET

(5)0x04 Q_CHARSET_CODE

字符集 在连接时客户端设定的字符集(2字节)+连接校对时的字符集(2字节)+服务器校对时的字符集(2字节)

(6)0x05 Q_TIME_ZONE_CODE

时区  一字节长度+字符串,如"\x6+08:00" 就是北京时间,这个待确认。

(7)0x07 Q_LC_TIME_NAMES_CODE

星期和月的名称,例如:在英文文中星期一是MON,一月是Jan,在其他文字中就不是这样。

二、Rows_event的数据类型和元数据

这里仅仅介绍常用的数据类型

(1)日期时间类型

1)元数据代表的可以精确到微秒的值 n通常为0-3

对与这种类型的在my_time.h中有相应的定义。

MYSQL_TYPE_DATETIME2,是用longlong数据存储的, 固定是4位+n,元数据代表的是额外数据的长度n

 //来自mysql5.7.13源码 my_time.c
//将longlong时间转化成字符串
//longlong时间格式:
//按位计算
//1 bit sign(used when on disk)
//17 bits year * 13 + month(year 0 - 9999, month 0 - 12)
//5 bits day(0 - 31)
//5 bits hour(0 - 23)
//6 bits minute(0 - 59)
//6 bits second(0 - 59)
//24 bits microseconds(0 - 999999)
//
//Total: 64 bits = 8 bytes
//
//SYYYYYYY.YYYYYYYY.YYdddddh.hhhhmmmm.mmssssss.ffffffff.ffffffff.ffffffff

MYSQL_TYPE_TIME2,也是是用longlong数据存储的, 固定是3位+n,元数据代表的是额外数据的长度n

MYSQL_TYPE_TIMESTAMP2,是时间戳,固定是4位,元数据代表的是额外数据的长度n

MYSQL_TYPE_NEWDATE也是以这种方式存的,但是没有元数据

2)不存在元数据,以十进制yyyymmddhhmmss存储的

MYSQL_TYPE_TIMESTAMP,MYSQL_TYPE_DATETIME都是以这种方式存的。

MYSQL_TYPE_TIME是时间戳。

3)MYSQL_TYPE_YEAR,不存在元数据。

这个是1900开始的年份存的

(2)整形,不存在元数据

MYSQL_TYPE_TINY, MYSQL_TYPE_SHORT, MYSQL_TYPE_INT24,MYSQL_TYPE_LONG,MYSQL_TYPE_LONGLONG和原先我们理解的方式一样,只不过是小端数据

(3)实数型

MYSQL_TYPE_FLOAT和MYSQL_TYPE_DOUBLE也是通过小端数据存储的,不同的是他们有一字节元数据,他们的元数据代表他们有效数据的长度。

MYSQL_TYPE_NEWDECIMAL这个小数存储方式不是很明确,仅仅在decimal.h中有定义,但是他的元数据第一个字节代表他有效数据的长度,第二个代表他的精度即小数点后长度

(4)字符串类型

MYSQL_TYPE_VARCHAR 他两字节的元数据是他的最长长度。

MYSQL_TYPE_STRING,MYSQL_TYPE_VAR_STRING 他们的元数据第一个字节代表真正的类型,而第二个字节代表存储字符串长度的字节数大小

(5)bit类型

MYSQL_TYPE_BLOB 他的元数据存储的是bit类型长度的字节数大小

MYSQL_TYPE_BIT 他的元数据存储第一个字节代表有多少bit,而第二个字节代表存储bit类型的字节数大小

为此我们可以得到结论,元数据更多存储的是该类型的长度信息。

具体更详细的请查看mysql5.7.13的源码 log_event.cc:1953::log_event_print_value()获取更多的信息

有关binlog的那点事(三)(mysql5.7.13)的更多相关文章

  1. 有关binlog的那点事(mysql5.7.13)

    binlog作为mysql中最重要的日志之一,能实现异常恢复以及主从复制. 我们主要讨论的是主从复制中的binlog,这里将以mysql5.7.13的源码为主要依据来分析binlog. 在主从复制中, ...

  2. Win10下Mysql5.7.13,解压版安装流程

    一.环境变量配置 1.将下载好的压宿包解压到安装目录,我的安装目录就是:D:\DevelopmentTool\Mysql5.7.13\mysql-5.7.13-winx64 2.鼠标选择计算机右键,点 ...

  3. mysql5.6.13通用二进制格式安装并使用amoeba实现对mysql5.6数据库读写分离

    proxy 192.168.8.39 master 192.168.8.40 slave 192.168.8.20 一.安装mysql-5.6.13服务器 安装包: mysql-5.6.13-linu ...

  4. Centos6.4_X64编译安装php-5.4.17、nginx-1.4.2、mysql-5.6.13

    安装参考: CentOS 6.3编译安装Nginx1.2.2+MySQL5.5.25a+PHP5.4.5 http://www.dedecms.com/knowledge/servers/linux- ...

  5. MySQL-5.6.13解压版(zip版)安装配置教程

    来源:http://www.splaybow.com/post/mysql-5-6-13-zip-install.html [下载MySQL 5.6.13] 从MySQL官方网站mysql.com找到 ...

  6. MySQL5.7.13源码编译安装指南

    系统 CenterOs 6.5 1.安装依赖包(cmake make gcc等,其实好多都有了,不需要更新,为了防止世界被破坏,就装下) yum install gcc gcc-c++ -yyum i ...

  7. MySQL-5.6.13免安装版配置方法

    MySQL-5.6.13免安装版配置方法   1. 下载MySQL Community Server 5.6.13 2. 解压MySQL压缩包    将以下载的MySQL压缩包解压到自定义目录下,我的 ...

  8. linux安装MySQL5.7.13(二进制|源码)

    二进制和源码版本安装MySQL5.7.13,并简单介绍不同之处. 一.通用二进制部分 1.下载MySQL通用二进制软件包.[root@node1 ~]# wget http://120.52.72.2 ...

  9. MySQL5.7.13源码编译安装指南(转)

    系统 CenterOs 6.5 1.安装依赖包(cmake make gcc等,其实好多都有了,不需要更新,为了防止世界被破坏,就装下) yum install gcc gcc-c++ -yyum i ...

随机推荐

  1. windows 常用命令整合--脚本工具

    到年终了,手里活不多了,平时就想着将平时一些常用的命令整合一下,于是下面的一个小小脚本就出来了... 好了,直接上菜:(http://files.cnblogs.com/files/hsuchan/c ...

  2. Windows安装程序 报错 “已安装了较新版本” 导致无法安装程序的解决方法

    打开注册表 HKEY_CURRENT_USER\Software\Microsoft\Installer\Products ,“查找”程序名称 如果有程序名和安装程序相同的 ,删除整个 项 ! 然后就 ...

  3. css箭头

    .aui-list-item-arrow:before { content: ''; width: 0.4rem; height: 0.4rem; position: absolute; top: 5 ...

  4. Codeforces CF#628 Education 8 C. Bear and String Distance

    C. Bear and String Distance time limit per test 1 second memory limit per test 256 megabytes input s ...

  5. 【虚拟机】在VMware中安装Server2008之后配置网络连接的几种方式

    VMware虚拟机的网络连接方式分为三种:桥接模式.NAT模式.仅主机(Host Only) (1)桥接模式 桥接模式即在虚拟机中虚拟一块网卡,这样主机和虚拟机在一个网段中就被看作是两个独立的IP地址 ...

  6. ListView总结

    ListView类作为在Android开发中经常会使用到的组件,作为新手,还是感到这一块变化形式还是很多的,需要慢慢学习.现在这里大概总结一下. 基于数组的ListView:使用android:ent ...

  7. linux kernel elv_queue_empty野指针访问内核故障定位与解决

    1. 故障描述 故障操作步骤: 单板上插了一个U盘,出问题前正在通过FTP往单板上拷贝文件,拷贝的过程中单板自动重启. 故障现象: Entering kdb (current=0xc000000594 ...

  8. [NOIP2013]华容道

    1.题面 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间.小 B 玩的华容道与经典 ...

  9. 【填坑向】bzoj2038小Z的袜子 莫队

    学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...

  10. css选择器万年不变的优先级和权重

    我们在使用CSS对网页元素定义样式时经常会遇到这种情况:要对一般元素应用一般样式,然后在更特殊的元素上覆盖它们.那么我们怎么样来保证我们所新定义的元素样式能覆盖目标元素上原有的样式呢? 在CSS中,会 ...