引言
为什么写这篇文章?
大家当年在学MySQL的时候,为了能够迅速就业,一般是学习一下MySQL的基本语法,差不多就出山找工作了。水平稍微好一点的童鞋呢还会懂一点存储过程的编写,又或者是懂一点索引的创建和使用。但是呢,基本上大家都忽略了对底层知识的学习。为什么呢?因为工作中很少用到嘛。然后呢,市面上流传的大部分这种底层的知识,又比较偏运维,研发懂这么多意义也不是太大,很多知识可能这辈子都不会用到。
因此,我整理了一部分相关的知识,希望大家有所收获。
研发究竟要懂哪些?
主要分为两个部分
- binlog的相关概念
- 怎么解析binlog
计划分上下两个部分来叙述。上部分讲述binlog的相关概念这部分的知识,我们不需要像运维懂的那么深,我会列举一些常见概念和常见配置,大家匆匆扫一眼,有个概念即可。这样大家以后和运维讨论问题的时候,也不会一脸的懵逼。正所谓
懵逼树上懵逼果,懵逼树下你和我。
懵逼树前排排坐,一人一个懵逼果。
博主一个人默默的把懵逼果收走独享就好,各位读者还是懂点基本概念,以后方便和运维沟通。下半部分讲怎么解析binlog。
另外,这篇文章是给研发大大看的,可能有些概念我理解的也不对,请运维大大轻喷。
正文
记得我的"一个定义,两个误解,三个用途,四个常识"
一个定义
先从定义开始讲起
binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。
binlog不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但你可以通过查询通用日志来查看MySQL执行过的所有语句。
多说一句,如果update操作没有造成数据变化,也是会记入binlog。
两个误解
误解一:binlog只是一类记录操作内容的日志文件
因为binlog称之为二进制日志,很多研发会把这个二进制日志和我们平时在代码里写的代码日志联系在一起。因为我们的代码日志,只有一类记录操作容的文件,并不包含索引文件。然而,这个二进制日志包括两类文件:
- 索引文件(文件名后缀为.index)用于记录哪些日志文件正在被使用
- 日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
这么说可能还有一点抽象,假设文件my.cnf中有这么三条配置
log_bin:on 打开binlog日志 log_bin_basename:bin文件路径及名前缀(/var/log/mysql/mysql-bin) log_bin_index:bin文件index(/var/log/mysql/mysql-bin.index)那么你会在文件目录/var/log/mysql/下面发现两个文件mysql-bin.000001和mysql-bin.index。mysql-bin.index就是我们所说的索引文件,打开瞅瞅,内容是下面这样,记录哪些文件是日志文件。
./mysql-bin.000001那么说到日志文件。在innodb里其实又可以分为两部分,一部分在缓存中,一部分在磁盘上。这里业内有一个词叫做刷盘,就是指将缓存中的日志刷到磁盘上。跟刷盘有关的参数有两个:sync_binlog和binlog_cache_size。这三个参数作用如下
binlog_cache_size: 二进制日志缓存部分的大小,默认值32k sync_binlog=[N]: 表示写缓冲多少次,刷一次盘,默认值为0注意两点:
- (1)
binlog_cache_size设过大,会造成内存浪费。binlog_cache_size设置过小,会频繁将缓冲日志写入临时文件。具体怎么设,有兴趣自行查询,我觉得研发大大根本没机会去设这个值的,了解即可。 - (2)
sync_binlog=0:表示刷新binlog时间点由操作系统自身来决定,操作系统自身会每隔一段时间就会刷新缓存数据到磁盘,这个性能最好。
