文档章节

Mysql底层之binlog日志了解

谢思华
 谢思华
发布于 2018/11/29 10:21
字数 2171
阅读 19
收藏 4

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.000001mysql-bin.index
mysql-bin.index就是我们所说的索引文件,打开瞅瞅,内容是下面这样,记录哪些文件是日志文件

./mysql-bin.000001

那么说到日志文件。在innodb里其实又可以分为两部分,一部分在缓存中,一部分在磁盘上。这里业内有一个词叫做刷盘,就是指将缓存中的日志刷到磁盘上。跟刷盘有关的参数有两个个:sync_binlogbinlog_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 logundo log)。此时宕机,重启数据库,数据被回滚。但是binlog里已经记录,这里存在不一致问题。这个事务日志和binlog一致性的问题,大家可以查询mysql的内部XA协议,该协议就是解决这个一致性问题的。

误解二:binlog是InnoDb独有的
binlog是以事件形式记录的,这句话通俗点说,就是binlog的内容都是一个个的事件。这块具体的我会在下一篇讲,这篇记住binlog的内容就是一个个事件就行。
注意了,这里的用词,是一个个事件,而不是事务。大家应该知道Innodbmysiam最显著的区别就是一个支持事务,一个不支持事务
因此你可以说,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格式的二进制文件,用下面命令就可以

mysqlbinlog mysql-bin.000001 

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

mysqlbinlog -vv mysql-bin.000001 

常识三:怎么删binlog
binlog的方法很多,有三种是常见的
(1) 使用reset master,该命令将会删除所有日志,并让日志文件重新从000001开始
(2) 使用命令

PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }

例如

purge master logs to "binlog_name.00000X" 

将会清空00000X之前的所有日志文件.
(3) 使用expire_logs_days=N选项指定过了多少天日志自动过期清空

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

本文转载自:https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653196018&idx=1&sn=27f2466a6b2bbdda8b73b0a...

共有 人打赏支持
谢思华
粉丝 70
博文 216
码字总数 151992
作品 0
广州
程序员
私信 提问
MYSQL 数据丢失讨论

1. 概述 很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下,各种原因导致MySQL会丢失部分数据。本文不讨论Oracle和MySQL的优劣,仅仅关注MySQL...

鉴客
2013/04/09
2.6K
7
MySQL的binlog恢复(Windows下)

前言   在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的...

JJian
2018/08/02
0
0
MYSQL性能调优及架构设计学习笔记-基础篇MYSQL架构组成

目录 小结 MYSQL物理文件组成 MYSQL系统架构 MYSQL自带工具使用介绍 小结 本章主要从逻辑层与物理层两个方面介绍了MYSQL软件本身及数据存储的架构,同时还包括了部分重要的客户端工具的功能介...

邪恶的小Y
2011/09/01
0
1
【DOC分享】来自腾讯公司的 Mysql binlog浅析.doc

这是一份腾讯内部的技术文档,详细讲述了 MySQL 数据库启用二进制日志 binlog 的细节,非常有参考价值。 前言: 日志是把数据库的每一个变化都记载到一个专用的文件里,这种文件就叫做日志文...

红薯
2010/09/02
1K
11
基于文件系统逻辑卷LVM快照备份

LVM快照备份原理图 2.1 LVM: 几乎热备、物理备份,加读锁,直接备份原卷,那么你就得等备份操作完成后才能解锁. 2.2而LVM快照就是备份完成就可以解锁,速度极快,这就是为什么是几乎热备的原...

aha45
2014/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
2
0
微信网页授权获取用户信息(ThinkPHP5)+ 微信发送客服消息(一)

以thinkphp5为实例,创建控制器 class Kf extends Controller { /** * [protected description]微信公众号appid * @var [type] */ protected $appid = "xxxxxxxxxxxxxxx"; /** * [protected......

半缘修道半缘君丶
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部