当前位置:Gxlcms > 数据库问题 > mysql日志:redo log、binlog、undo log 区别与作用

mysql日志:redo log、binlog、undo log 区别与作用

时间:2021-07-01 10:21:17 帮助过:5人阅读

"。

技术图片

 

 

两阶段提交

  两阶段提交,是为了binlog和redolog两分日志之间的逻辑一致。redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。

  由于 redo log 和 binlog 是两个独立的逻辑,如果不用两阶段提交,要么就是先写完 redo log 再写 binlog,或者采用反过来的顺序。可能造成的问题:

   update 语句来做例子。假设当前 ID=2 的行,字段 c 的值是 0,再假设执行 update 语句过程中在写完第一个日志后,第二个日志还没有写完期间发生了 crash,会出现什么情况呢?

  1. 先写 redo log 后写 binlog。

  假设在 redo log 写完,binlog 还没有写完的时候,MySQL 进程异常重启。由于,redo log 写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行 c 的值是 1。但是由于 binlog 没写完就 crash 了,这时候 binlog 里面就没有记录这个语句。因此,之后备份日志的时候,存起来的 binlog 里面就没有这条语句。然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 c 的值就是 0,与原库的值不同。

  2. 先写 binlog 后写 redo log。

  如果在 binlog 写完之后 crash,由于 redo log 还没写,崩溃恢复以后这个事务无效,所以这一行 c 的值是 0。但是 binlog 里面已经记录了“把 c 从 0 改成 1”这个日志。所以,在之后用 binlog 来恢复的时候就多了一个事务出来,恢复出来的这一行 c 的值就是 1,与原库的值不同。

  如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。

  扩容的时候,也就是需要再多搭建一些备库来增加系统的读能力的时候,现在常见的做法也是用全量备份加上应用 binlog 来实现的,这个“不一致”就会导致线上出现主从数据库不一致的情况。

 

undo log

  undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。

  undo日志用于记录事务开始前的状态,用于事务失败时的回滚操作;redo日志记录事务执行后的状态,用来恢复未写入data file的已成功事务更新的数据。例如某一事务的事务序号为T1,其对数据X进行修改,设X的原值是0,修改后的值为1,那么Undo日志为<T1, X, 0>,Redo日志为<T1, X, 1>。

mysql日志:redo log、binlog、undo log 区别与作用

标签:大小   开始   head   实现   区别   span   cal   还原   版本   

人气教程排行