SQL极简教程 · MySQL · MyBatis · JPA 技术笔记 教程 总结MySQLJava

MySQL的redo log、undo log、binlog

2020-03-16  本文已影响0人  白花蛇草可乐

一、MySQL日志文件类型

   其中,比较重要的包括 redo log 、 undo log 和 binlog。

   redo log 是重做日志,提供前滚操作;undo log 是回滚日志,提供回滚操作。

二、几种日志的对比

2-1、用途

   redo log

     确保事务的持久性。

     如果在发生故障的时间点(比如系统宕机),尚有数据未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达保证事务的持久性。

   undo log

     首先明确undo log绝对不是redo log的逆过程。它可以保存事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制(MVCC)下的读。

   binlog

     1. 用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。

     2. 用于数据库的基于时间点的还原。

2-2、存储内容、格式

   redo log

     物理格式的日志,记录的是物理数据页面的修改的信息(数据库中每个页的修改),面向的是表空间、数据文件、数据页、偏移量等。

   undo log

     逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,与redo log不同。

   binlog

     逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。

     但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息。比如delete操作的话,就对应着delete本身和其反向的insert;update操作的话,就对应着update执行前后的版本的信息;insert操作则对应着delete和insert本身的信息。

     因此可以基于binlog做到闪回功能。

2-3、日志生成

   redo log

     事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中就开始写入。在发出事务提交指令时,先保证缓存中的redo log写入完毕,才执行提交动作。

   undo log

     事务开始之前,根据当前版本的数据生成undo log;产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redo log的产生。

   binlog

     事务提交的时候,一次性将事务中的所有sql语句按照一定的格式记录到binlog中。

     这里与 redo log 相比最明显的差异就是redo log 在事务开始之后就开始逐步写入磁盘。

2-4、删除策略

   redo log

     当对应事务的数据写入完成(持久化完成)之后,redo log的使命也就完成了,日志占用的空间就可以重用(redo log的日志文件是循环写入的)。

   undo log

     事务提交之后,undo log并不会马上被被删除,而是放入待清理的链表。由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

   binlog

     binlog的日志文件是追加写入,也就是文件写到一定大小以后会切换到下一个,不覆盖原有记录。不过同时binlog的默认行为是,对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。

2-5、redo log 与 binlog 的区别

三、两阶段提交

   redo log 保证的是数据库的 crash-safe 能力。采用的策略就是常说的“两阶段提交”。

   一条update的SQL语句是按照这样的流程来执行的:

   将数据页加载到内存 → 修改数据 → 更新数据 → 写redo log(状态为prepare) → 写binlog → 提交事务(数据写入成功后将redo log状态改为commit)

   只有当两个日志都提交成功(刷入磁盘),事务才算真正的完成。

   一旦发生系统故障(不管是宕机、断电、重启等等),都可以配套使用 redo log 与 binlog 做数据修复。

binlog状态 redo log 状态 对策
有记录 commit 事务已经正常完成
有记录 prepare 在binlog写完、提交事务之前发生故障。此时数据完整。恢复策略:提交事务
无记录 prepare 在binglog写完之前发生故障。恢复策略:回滚
无记录 无记录 在写redo log之前发生故障。恢复策略:回滚
上一篇下一篇

猜你喜欢

热点阅读