关于mysql:研发应该懂的binlog知识上

53次阅读

共计 4149 个字符,预计需要花费 11 分钟才能阅读完成。

原创】研发应该懂的 binlog 常识(上)

引言

为什么写这篇文章?

大家当年在学 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.000001mysql-bin.indexmysql-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 常见格局 这块常识我用一个表格来示意,没必要啰嗦一大堆。

format

定义

长处

毛病

statement

记录的是批改 SQL 语句

日志文件小,节约 IO,进步性能

准确性差,对一些零碎函数不能精确复制或不能复制,如 now()、uuid()等

row

记录的是每行理论数据的变更

准确性强,能精确复制数据的变更

日志文件大,较大的网络 IO 和磁盘 IO

mixed

statement 和 row 模式的混合

准确性强,文件大小适中

有可能产生主从不统一问题

业内目前举荐应用的是 row 模式,准确性高,尽管说文件大,然而当初有 SSD 和万兆光纤网络,这些磁盘 IO 和网络 IO 都是能够承受的。那么,大家肯定想问,为什么不举荐应用 mixed 模式,理由如下 假如 master 有两条记录,而 slave 只有一条记录。master 的数据为

idn
1d24c2c7e-430b-11e7-bf1b-00155d016710
2ddd

slave 的数据为

idn
1d24c2c7e-430b-11e7-bf1b-00155d016710

当在 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

常识三: 怎么删 binlogbinlog 的办法很多,有三种是常见的 (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 常见参数 常见参数,列举如下,有个印象就好。

参数名

含意

log_bin = {on | off | base_name}

指定是否启用记录二进制日志或者指定一个日志门路

sql_log_bin ={on | off}

指定是否启用记录二进制日志

expire_logs_days

指定主动删除二进制日志的工夫,即日志过期工夫

log_bin_index

指定 mysql-bin.index 文件的门路

binlog_format = {mixed | row | statement}

指定二进制日志基于什么模式记录

max_binlog_size

指定二进制日志文件最大值

binlog_cache_size

指定事务日志缓存区大小

max_binlog_cache_size

指定二进制日志缓存最大大小

sync_binlog = {0 | n}

指定写缓冲多少次,刷一次盘

思考题

请问,我说的

  • 一个定义
  • 两个误会
  • 三个用处
  • 四个常识

说的是什么呢?

另外,我会在下一篇进行介绍,怎么用代码解析 binlog 日志。

作者:孤单烟 出处:http://rjzheng.cnblogs.com/

正文完
 0