什么是redo log?
记录对数据库操作的日志。
举个例子,在孔乙己中,有个酒馆,里面的老板有个黑板,上记录的都是一些赊账还账的信息。为什么不直接记录到账本上呢?因为太慢,想想,如果直接记录到账本,先找到账本,再找到对应的人,然后在找到最后一笔这个人对应的总额,然后在修改,这个是不是太麻烦了。所以先在黑板上记录,要快很多。那什么时候记录到账本上呢?可以再晚上酒馆打烊后,慢慢弄,也可以再酒馆不忙了之后再写。
但是如果酒馆的生意太好了,黑板不够写了,怎么办?那就要马上拿出账本,吧黑板上的记录都统计到账本上。然后在擦出黑板上的记录,给新纪录腾出空间。
这个例子中,这个黑板相当于就是redo log,作用就是用来记录数据库的操作。
账本就是硬盘,打烊后再慢慢统计实际上就是把数据写到磁盘上
redo 是有参数设置的,可以设置1组N个文件,每个文件可以设置固定大小

checkpoint 就是擦除的文职, check point 和 write 之间相当于黑板上的内容, write 和 checkpoint 之间,就是黑板上剩余可以写的空间。
如果write 追上了 checkpoint ,则表示黑板上没有空间了,这个时候就要等待老板把黑板上的记录转移到账本上,然后擦除黑板,腾出空间。
以上就是对 redo log 的描述
下面在说说 binlog。
binlog 是 server 层的事务日志
记录的也是 数据库操作,为什么要有2种日志都来记录数据库的操作?
因为在早期,mysql 的默认存储引擎是 myisam,而且他不支持 caresh-safe,而binlog 又只能用于归档,所以后来innodb 又搞了一套自己的 日志系统,redo log,所以这就有2种日志。
这两种日志有什么不同?
1.redo log 是 物理日志,记录的是物理上的操作,比如修改哪个页的,而 binlog 是逻辑日志,主要记录的是执行的sql语句。
2.redo log 是循环写的。binlog 是可以归档的。
3.redo log 是存储引擎层的,binlog 是server层的
了解完 redo log 和binlog 后,我么看看update 到底是怎么执行的。
首先,既然要修改他,那肯定要找到他,故查询语句那一套有走一遍
找到要修改的记录后,执行 update
1.引擎层接收到 update 并执行,这里就写入 redo log,并将新值更新到内存,并把该事务状态修改为prepare,并通知server 层随时可以commit
2.server层收到通知后,写binlog,并发出 commit
3.引擎层接收到 commit 命令后,将 prepare 改为 commit状态
整个过程完成。
最后3步为什么redo log binlog 要2阶段提交?
这里用反证法来举个例子
如果不用2阶段提交,采用顺序提交,2种情况
1.先redo log,后 binlog
2.先binlog ,后redo log
情况1:如果在redo log 先写完成后,还没写binlog 时,mysql宕机了。
这个时候 因为redo log 写完了,在开机后,数据不会丢失,但是因为binlog 没写,所以binlog 里面没有这条语句。如果后续需要新建一个slave,或测试库,那么在用binlog 恢复的时候就会少一条数据。
情况2:如果在binlog 写完后,还没写redo log 时,mysql 宕机了。
这个时候redo log 因为没有,所以开机后,数据库没有这个数据,但是binlog里面有,当用该binlog 来恢复数据时,就会发现新的库里多了记录,这样就造成了2着的数据差异。




