原标题:什么是 binlog?

本文转载自公众号 打杂的ZRJ

引言为什么写这篇文章?

大家当年在学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时间点由操作系统自身来决定,操作系统自身会每隔一段时间就会刷新缓存数据到磁盘,这个性能最好。sync_binlog=1,代表每次事务提交时就会刷新binlog到磁盘。sync_binlog=N,代表每N个事务提交会进行一次binlog刷新。

另外,这里存在一个一致性问题,sync_binlog=N,数据库在操作系统宕机的时候,可能数据并没有同步到磁盘,于是再次重启数据库,会带来数据丢失问题。

当sync_binlog=1,事务在Commit的时候,数据写入binlog,但是还没写入事务日志(redo log和undo log)。此时宕机,重启数据库,数据被回滚。但是binlog里已经记录,这里存在不一致问题。这个事务日志和binlog一致性的问题,大家可以查询mysql的内部XA协议,该协议就是解决这个一致性问题的。

误解二:binlog是InnoDb独有的

binlog是以事件形式记录的,这句话通俗点说,就是binlog的内容都是一个个的事件。这块具体的我会在下一篇讲,这篇记住binlog的内容就是一个个事件就行。

注意了,这里的用词,是一个个事件,而不是事务。大家应该知道Innodb和mysiam最显著的区别就是一个支持事务,一个不支持事务。

因此你可以说,binlog是基于事务来记录二进制日志,比如sync_binlog=1,每提交一次事务,就写入binlog。你却不能说binlog是事务日志,binlog不仅记录innodb日志,在myisam中,也一样存在binlog。

三个用途

这三个用途,出自《MySQL技术内幕 InnoDB存储引擎》一书,分别为恢复、复制、审计。这三个用途,研发大大们了解一下即可,比如数据恢复,你碰到同事删库的机会实在太少。假如真的有同事舍己为人,冒着离职的风险给你提供做数据恢复的机会,大把运维工程师待命在那,轮不到你的。所以,这三个功能了解即可。

恢复:这里网上有大把的文章指导你,如何利用binlog日志恢复数据库数据。如果你真的觉得自己很有时间,就自己去创建个库,然后删了,再去恢复一下数据,练练手吧。

复制: 如图所示(图片不是自己画的,偷懒了)

主库有一个log dump线程,将binlog传给从库

从库有两个线程,一个I/O线程,一个SQL线程,I/O线程读取主库传过来的binlog内容并写入到relay log,SQL线程从relay log里面读取内容,写入从库的数据库。

审计:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入攻击。

四个常识

常识一:binlog常见格式

这块知识我用一个表格来表示,没必要啰嗦一大堆。

业内目前推荐使用的是row模式,准确性高,虽然说文件大,但是现在有SSD和万兆光纤网络,这些磁盘IO和网络IO都是可以接受的。

那么,大家一定想问,为什么不推荐使用mixed模式,理由如下

假设master有两条记录,而slave只有一条记录。

当在master上更新一条从库不存在的记录时,也就是id=2的记录,你会发现master是可以执行成功的。而slave拿到这个SQL后,也会照常执行,不报任何异常,只是更新操作不影响行数而已。并且你执行命令show slave status,查看输出,你会发现没有异常。但是,如果你是row模式,由于这行根本不存在,是会报1062错误的。

常识二:怎查看binlog

binlog本身是一类二进制文件。二进制文件更省空间,写入速度更快,是无法直接打开来查看的。

因此mysql提供了命令mysqlbinlog进行查看。

一般的statement格式的二进制文件,用下面命令就可以

mysqlbinlogmysql-bin.000001

如果是row格式,加上-v或者-vv参数就行,如

mysqlbinlog-vvmysql-bin.000001

常识三:怎么删binlog

删binlog的方法很多,有三种是常见的

(1) 使用reset master,该命令将会删除所有日志,并让日志文件重新从000001开始。

(2) 使用命令

PURGE{ BINARY| MASTER} LOGS{ TO'log_name'| BEFOREdatetime_expr }

例如

purgemasterlogsto"binlog_name.00000X"

将会清空00000X之前的所有日志文件.

(3) 使用expire_logs_days=N选项指定过了多少天日志自动过期清空。

常识四:binlog常见参数

常见参数,列举如下,有个印象就好。

责任编辑:

mysql binlog是什么_什么是 binlog?相关推荐

  1. mysql binlog查看工具_【使用 Rust 写 Parser】4. 解析 binlog

    系列所有文章 PrivateRookie:[使用 Rust 写 Parser]1. 初识 nom​zhuanlan.zhihu.com PrivateRookie:[使用 Rust 写 Parser] ...

  2. mysql binlog线程恢复_使用MySQL SQL线程回放Binlog实现恢复

    [toc] 1. 需求部分 1.1 基于MySQL复制同步特性,尝试使用Replication的SQL线程来回放binlog,可基于以下逻辑模拟场景 做全量xtrabackup备份模拟日常备份 执行s ...

  3. mysql 刷新二进制日志_使用binlog日志恢复MySQL数据库删除数据的方法

    binlog日志简介: binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间. b ...

  4. mysql binlog查看工具_数据同步工具otter(一)谈谈binlog和canal

    之前因为懒,没有针对otter做更多的解释和说明,在使用过程中,也发现了一些问题,此次补上一个完整的文档,方便大家使用. Otter是基于cannal开源的,canal又是基于mysql binlog ...

  5. mysql 数据增量抽取_通过Maxwell实时增量抽取MySQL binlog并通过stdout展示

    下载,解压Maxwell 修改MySQL的配置文件my.cnf [root@hadoop000 etc]# vi my.cnf [mysqld] server-id = 1binlog_format= ...

  6. mysql bin的过期时间_Mysql设置binlog过期时间并自动删除

    问题: Mysql数据库由于业务原因,数据量增长迅速,binlog日志会增加较多,占用大部分磁盘空间. 解决方案: 出于节约空间考虑,可进行删除多余binary日志,并设置定期删除操作. 1.查看bi ...

  7. MySQL数据库的mysqldump完全备份、binlog的增量备份与还原

    MySQL数据库的mysqldump完全备份.binlog的增量备份与还原 一. 备份的目的: 做灾难性恢复:对损坏的书籍进行恢复和还原 需求改变:因需求改变而需要把数据还原到改变以前 二. 备份需要 ...

  8. mysql通过日志恢复数据_mysql通过binlog日志来恢复数据

    简介 在生产的过程中有这么一个业务场景:比如我在2016-11-19 09:30:00 通过mysqldump的方式备份了数据库,但是在2016-11-19 10:30:00的时候数据库崩溃了,如果通 ...

  9. mysql binlog解析 c_解析MYSQL BINLOG二进制格式(9)--infobin解析binlog帮助文档

    原创:转载请说明出处谢谢! 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作 http ...

最新文章

  1. Centos6 系统下,已经安装vim的前提下。执行操作vim,出现报错
  2. Fiddler无法抓取HTTPS的问题,Fiddler证书无法安装终极解决方案,
  3. MAC下《暗黑世界》客户端版本编译说明!!
  4. 终于也为自己开了技术博客
  5. 面试题(9)之 leetcode-189
  6. AI给植物看病,宾大用TensorFlow做的这款应用造福坦桑尼亚农民
  7. #VSTS日志# Xamarin构建支持和一大波更新
  8. 打印机怎么扫描到电脑_扫描全能王怎么把图片变成pdf_扫描全能王怎么把文件传到电脑上_问答...
  9. 20190218每日一句
  10. 微信扫码支付开发流程
  11. 朗强科技讲解:HDMI分配器的作用与使用方法
  12. TCP粘包以及UDP丢包问题
  13. sqlserver 登录方式修改,由默认的windows账户改为用sa等sql server账户登录问题
  14. VBA:获取工作簿中所有表的名称、地址
  15. zblog插件-zblog插件zblog主题必备小插件
  16. Open Images Dataset V5 - Data Formats - Class Names
  17. 如何快速将pdf表格转换成excel
  18. 以mysql为例有几种隔离级别_mysql有几种隔离级别
  19. 7月7日易用性SIG技术分享活动精彩回顾
  20. (2008-10-31)山西五日自助游记

热门文章

  1. java在win8闪退_win8.1应用闪退
  2. Mac 升级Python 有python2.7到python3.9
  3. 微信小程序 音乐播放代码(播放方式,歌词滚动) (更新优化版:添加文字颜色过渡)
  4. Python爬虫实战四之抓取淘宝MM照片
  5. 【Int. J. Mol. Sci.】黄瓜液泡转化酶基因CsVI1参与对低温胁迫的响应和己糖积累
  6. 数字图像处理学习总结(1):灰度变换与空间滤波
  7. 矩阵方程的计算求解(Matlab实现)
  8. TOSCA自动化测试工具
  9. SPOOLing和虚拟化
  10. 科创板拟上市企业申联生物和传音控股已提交注册