欢迎重视MySQL专栏MySQL历险记
强烈建议收藏本导航文【MySQL历险记】MySQL的核心特性汇总

前语

bin log想必咱们多多少少都有听过,它是MySQL中一个非常重要的日志,所以各位架构师们,假设有不了解的,一定要好好学习了,由于它涉及到数据库层面的主从仿制、高可用等规划。

bin log是什么?

bin log全称binary log二进制日志文件,它记载了数据库一切履行的 DDLDML 等数据库更新的句子,可是不包含select或许show等没有修正任何数据的句子。它是MySQL级别的日志,也便是说一切的存储引擎都会产生bin log,而redo log或许undo log业务日志只有innoDB存储引擎才有。

bin log有什么用呢?

  • 数据康复,假设MySQL数据库意外挂了,能够使用bin log进行数据康复,由于该日志记载一切数据库一切的改变,确保数据的安全性。
  • 数据仿制,使用一定的机制将主节点MySQL的日志数据传递给从节点,完成数据的共同性,完成架构的高可用和高性能。

所以bin log关于数据备份主从主主等都都起到了关键作用。

详解MySQL非常重要的日志—bin log

bin log和redo log差异?

看了上面的bin log介绍,是不是感觉和业务日志redo log特别像呢?也是在业务履行的时分记载日志,可是他们还是有差异的。

你知道redo log吗, 假设不了解的话请参阅这篇文章:详解MySQL业务日志——redo log

咱们现在从多个视点对比下他们俩终究有什么不一样?

使用场景视点来说:

  • redo log主要完成故障情况下的数据康复,确保业务的持久性
  • bin log主要用于数据灾备、同步

数据内容视点来说:

  • redo log是”物理日志”, 记载的是详细数据页上做了什么修正
  • bin log是”逻辑日志”, 记载内容是句子的原始逻辑,相似于“给 ID=2 这一行的 name 改为alvin”

生成范围视点来说:

  • redo logInnoDB存储引擎生成的业务日志,其他存储引擎没有
  • bin log是MySQL Server生成的日志,一切的存储引擎都有

生成时机视点来说:

  • redo log是在业务履行进程中就会write
  • bin log是在业务提交的时分write

bin log怎样写的?

bin log是什么时分写的,写入的机制又是怎样样的呢?

bin log写入的全体流程如下图所示:

详解MySQL非常重要的日志—bin log

  • 为了确保写的功率,会将业务的bin log先写到binlog cache中,留意,这个cache坐落业务线程的内存中,主要是一个业务的bin log不能被拆开,是一个全体
  • 在提交业务的时分,将binlog cache中的数据共同写道文件体系缓存page cache中,这个进程速度也很快
  • 然后依据不同的战略,将文件体系缓存中的bin logfsync刷到磁盘中,这儿的战略后边详细解说。

3种刷盘战略:

bin logredo log相似,都有3种刷盘战略, bin log的write和fsync时机是由参数 sync_binlog 操控,默认是 0 。

  1. sync_binlog = 0

详解MySQL非常重要的日志—bin log

为0的时分,表明每次提交业务都只 write,由体系自行判断什么时分履行fsync。虽然性能得到提高,可是机器宕机,page cache里边的 binglog 会丢掉。

  1. sync_binlog = 1

详解MySQL非常重要的日志—bin log

  • 表明每次提交业务都会履行fsync,愈加安全
  1. sync_binlog = N

详解MySQL非常重要的日志—bin log

  • 能够设置为N(N>1),表明每次提交业务都write,但累积N个业务后才fsync

咱们现已知道,业务履行时会一起记载redo logbin log两种日志,那会有日志犯错不共同问题吗?

详解MySQL非常重要的日志—bin log

  • redo log在业务履行进程中能够不断写入
  • bin log只有在提交业务时才写入

假设业务履行sqlupdate T set c = 1 where id = 2,在写完redo log日志后,bin log日志写期间产生了反常,会呈现什么情况呢?

详解MySQL非常重要的日志—bin log

由于bin log没写完就反常,这时分bin log里边没有对应的修正记载。因此,之后用bin log日志康复数据时,就会少这一次更新,康复出来的这一行c值为0,而原库由于redo log日志康复,这一行c的值是1,最终数据不共同。

那有什么解决计划吗?二阶段提交计划。

为了解决两份日志之间的共同性问题,InnoDB存储引擎使用两阶段提交计划。将redo log的写入拆成了两个步骤preparecommit

详解MySQL非常重要的日志—bin log

  • 假设现在写入bin log时MySQL产生反常,这时分的redo log还处于prepare阶段,重启MySQL后,依据redo log记载中的业务ID,发现没有对应的bin log日志,回滚前面已写入的数据。
  • 假设redo logcommit阶段产生移除,可是能通过业务id找到对应的bin log日志,所以MySQL认为是完好的,就会提交业务康复数据。

bin log写到哪了?

前面解说了bin log写入的进程,那么它写到了哪里去了呢?

  1. 检查bin log方位

能够通过指令show variables like '%log_bin%';检查bin log最终输出的方位。

详解MySQL非常重要的日志—bin log

  • log_bin_basename: 是bin log日志的根本文件名,后边会追加标识来表明每一个文件
  • log_bin_index: 是binlog文件的索引文件,这个文件管理了一切的binlog文件的目录

通过 SHOW BINARY LOGS;检查当时的二进制日志文件列表及巨细,如下图:

详解MySQL非常重要的日志—bin log

  1. 修正 bin log方位

修正MySQL的my.cfgmy.ini配置

#启用二进制日志
log-bin=cxw-bin
binlog_expire_logs_seconds=600
max_binlog_size=100M
  • log-bin: bin log日志保存的方位
  • binlog_expire_logs_seconds: bin log日志保存的时间,单位是秒
  • max_binlog_size: 单个bin log日志的容量

bin log内容长啥样?

咱们现已知道了bin log的方位了,那它里边的内容长什么样呢?

咱们能够用show binlog events指令东西检查bin log日志中的内容。

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
  • IN ‘log_name’ :指定要查询的binlog文件名(不指定便是第一个binlog文件)
  • FROM pos :指定从哪个pos起始点开端查起(不指定便是从整个文件首个pos点开端算)
  • LIMIT [offset] :偏移量(不指定便是0)
  • row_count :查询总条数(不指定便是一切行)

详解MySQL非常重要的日志—bin log

bin log 格局

实际上bin log输出的格局类型有3种,默认是ROW类型,便是上面比方中的格局。

详解MySQL非常重要的日志—bin log

  1. Statement格局:每一条会修正数据的sql都会记载在bin log
  • 长处:不需要记载每一行的变化,减少了bin log日志量,节约了IO,提高性能。
  • 缺陷:比方sql中存在函数如now()等,依赖环境的函数,会导致主从同步、康复数据不共同
  1. ROW格局:为了解决Statement缺陷,记载详细哪一个分区中的、哪一个页中的、哪一行数据被修正了
  • 长处:清楚的记载下每一行数据修正的细节,不会呈现某些特定情况下 的存储进程,或function无法被正确仿制的问题。
  • 缺陷:比方对ID<600的一切数据进行了修正操作,那么意味着许多数据产生变化,最终导致同步的log许多,那么磁盘IO、网络带宽开销会很高。
  1. Mixed格局: 混合形式,即Statment、Row的结合版
  • 关于能够仿制的SQL选用Statment形式记载,关于无法仿制的SQL选用Row记载。

总结

本文解说了MySQL中的一个非常重要的日志bin log,它主要用来做数据康复和同步的,所以作为程序员的咱们,还是很有必要对它有一个深化的认识。

假设本文对你有协助的话,请留下一个赞吧

本文正在参与「金石计划 . 分割6万现金大奖」