Mysql——日志模块(bin log、redo log、undo log的介绍和不同)

关于redo log(重做日志)和bin log(归档日志)的异同。


  • redo log

redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。它是物理日志,记录内容是“在某个数据页上做了什么修改”。

InnoDB的redo log是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块“粉板”总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。

 write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称crash-safe


  • binlog

属于MySQL Server层自己的日志,称为binlog。它是逻辑日志,记录内容是语句的原始逻辑,类似于“给ID=2的这一行的c字段加1”。不管用什么存储引擎,只要发生了表数据更新,都会产生binlog日志。主要用在MySQL数据库的数据备份、主备、主主、主从的同步数据,保证了数据的一致性


这两种日志有以下三点不同:

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。

  2. redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。

  3. redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。


什么是两阶段提交?

        在执行更新操作的时候,执行器找引擎取到需操作的数据后,将数据更新,然后提交给引擎,引擎将这行新数据更新到内存,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态,然后告知执行器完成了,随时可以提交事务。执行器生成这个操作的binlog,并把binlog写入磁盘。执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交(commit)状态,更新完成。 

        将redo log的写入拆成了两个步骤:prepare和commit,这就是两阶段提交

为什么必须有“两阶段提交”?

        这是为了让两份日志(binlog和redolog)之间的逻辑一致。


  • undo log

如果要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行回滚,在MySQL中,回复机制是通过回滚日志(undo log)实现的。详细介绍可看数据库中MVCC机制的实现。


总结:

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性

MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值