Mysql杂货铺MySQL

MySQL之binlog日志、undo日志、redo日志

2019-05-28  本文已影响112人  秋慕云

一、MySQL常用的几种日志

MySQL主要包含以下几种日志:

本章主要介绍binlog日志、undo日志、redo日志

二、binlog日志

1. 什么是binlog?

MySQL的基本架构这篇文章中,我们分享了MySQL的基础架构,其中,binlog日志属于Server层的日志,只能用于归档,没有carsh-safe能力。

MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

2. binlog的作用

3. binlog的日志格式

三、redo日志

1. 什么是redo日志?


说明:
write pos是当前记录的位置,一边写一边后移,写到末尾又从头开始
check point是当前要擦除的位置,同样也是往后移动并且循环,擦除记录,先把日志更新到磁盘中

假设有两张表,如下图:


现在要从银行卡账户转400块到理财账户中,事务过程如下:

start transaction;
select balance from bank where name="zhangsan";
// 生成 重做日志 balance=600
update bank set balance = balance - 400; 
// 生成 重做日志 amount=400
update finance set amount = amount + 400;
commit;

上述事务流程图如下:


事务流程图

2. redo log 有什么作用?

mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。

问题:
但随之二来的问题是,如果还没来的及同步就发生宕机或断电怎么办?上面图中红色的操作还没来得及执行,这样会导致丢失部分已提交事务的修改信息!

解决方法:
引入了redo log来记录已成功提交事务的修改信息,并且会把redo log持久化到磁盘,系统重启之后在读取redo log恢复最新数据。

四、undo日志

1. 什么是undo日志?

还用上面那两张表,如下图:

每次写入数据或者修改数据之前都会把修改前的信息记录到 undo log。

2. undo log 有什么作用?

undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。

五、一条更新语句的执行流程(日志两段提交)

通过日志两阶段提交,可以保证redo log和bin log的逻辑一致

六、redo log跟bin log的区别

参考资料

Mysql数据库之Binlog日志使用总结
MySQL的binlog日志
MySQL学习笔记 - 1 - 基本架构与日志两阶段提交
Mysql事务实现原理

上一篇下一篇

猜你喜欢

热点阅读