MYSQL日志系统
- server 层:bing log
- InnoDB存储引擎层:redo log
redo log(重做日志)
redo log类似于缓存。但是又区别于缓存。
- 类似是说它和缓存一样,不会直接就被操作到物理数据库
- 区别在于redo log是记录在某某页上做了什么样的修改。而缓存存的是结果。
引入问题
- 酒店掌柜记录赊账人的信息。如果每次有人赊账都需要翻开账本,从几千页帐溥上找到一个人的信息非常耗时。但是如果具有了一个下黑板,人多的时候,就现在小黑板上写下这次的记录。等到打样的时候,再翻出账本慢慢把新账记录回账本。
- 上面的过程也是innoDB的数据存入逻辑。 redo log 对应的就是小黑板。
- 问题:小黑板记满了怎么办?
- 对于 redo log来说,确实也是循环写入,也就是说,他是具有固定大小的。这个大小可以自己设定
- 如果记满,那就不得不停下手里的活,将一部分数据记回账簿。然后擦掉已经更新的记录。
可以看见,在逻辑上就像一个循环队列,当两个指针快要碰到时,就会推进前一个指针。而推进的过程就是 记回账本 。
- 注意:
- 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 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
两阶段提交
两阶段提交是为了保证两份日志的一致性。
利用反证法,如果没有两阶段提交。
- 在 redo log 写完后,系统突然崩溃。bing log还没写。重启后事务回滚。数据就会不一致
- 先写bing log 后写redo log 。反过来依然是这样
简单说,redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。
打赏
支付宝扫一扫
微信扫一扫