2-日志系统

MYSQL日志系统

  • server 层:bing log
  • InnoDB存储引擎层:redo log

 

redo log(重做日志)

  • redo log类似于缓存。但是又区别于缓存。

    • 类似是说它和缓存一样,不会直接就被操作到物理数据库
    • 区别在于redo log是记录在某某页上做了什么样的修改。而缓存存的是结果。

 

引入问题
  • 酒店掌柜记录赊账人的信息。如果每次有人赊账都需要翻开账本,从几千页帐溥上找到一个人的信息非常耗时。但是如果具有了一个下黑板,人多的时候,就现在小黑板上写下这次的记录。等到打样的时候,再翻出账本慢慢把新账记录回账本。

 

  • 上面的过程也是innoDB的数据存入逻辑。 redo log 对应的就是小黑板。

 

 

  • 问题:小黑板记满了怎么办?
  • 对于 redo log来说,确实也是循环写入,也就是说,他是具有固定大小的。这个大小可以自己设定
  • 如果记满,那就不得不停下手里的活,将一部分数据记回账簿。然后擦掉已经更新的记录。

img

可以看见,在逻辑上就像一个循环队列,当两个指针快要碰到时,就会推进前一个指针。而推进的过程就是 记回账本

 

  • 注意:
  • mysql 执行一条语句,在 innoDB 看来,就是在 redo log 上写入了一条记录。
  • redo log是记录在哪个数据页做了哪些更改。
  • 因为有了 redo log 。InnoDB 就可以保证数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe

 

 

bing log (归档日志)

  • 因为 mysql 分为服务层和存储引擎层,所以服务层也有自己的日志模块。
  • bing log是记录 什么人在什么时候对什么地方做了什么改变 。也就是他会将执行的sql语句记录到 bing log中。

 

  • 注意

    • bing log 是追加写入,也就是说,你只要设置保存日志的时间是无限长。那么你的日志也就会记录这么多记录。
    • bing log只能用于归档,并不 具有 crash-safe 能力。因为想要逆向解析sql语句似乎会有歧义。

 

比较

  • 不同

    • redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
    • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
    • redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

 

两阶段提交

img

  • 两阶段提交是为了保证两份日志的一致性。

  • 利用反证法,如果没有两阶段提交。

    • 在 redo log 写完后,系统突然崩溃。bing log还没写。重启后事务回滚。数据就会不一致
    • 先写bing log 后写redo log 。反过来依然是这样
  • 简单说,redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。