redo log & binlog

在极客时间上有个丁奇老师的Mysql课程,《MySQL实战45讲》,可以说对MySQL的讲解非常到位了,非常适合DBA和后端开发人员。我刚开始学的时候就想要是我在校招时学了这个课程,找到的工作一定比现在的好。

这个课程虽然我之前学习过一段时间,但是总觉得很多地方似懂非懂,没有完全搞明白,所以这次又重新回来学习一遍。在课程第二讲时讲到了一条更新语句如何执行的,其中涉及到了redo log和binlog。之前的学习工作工程中学习到了binlog是为了记录mysql执行日志的,为了以后的数据恢复和重放。但是对redo log的了解基本没有,其实也不太了解为什么会有两个log,为什么会有两阶段提交。这次就记录一下学习的内容。

首先,我们需要明确的是Mysql为了保证服务和数据的问题,就需要执行策略保证即使服务器异常故障导致宕机也不会丢失数据和保证数据一致性。所以就引入了log。binlog是Mysql服务器的日志记录策略,记录每次用户进行操作的步骤和数据内容。记录的方式有两种:记录每次更改后的数据和记录操作。这两种各有利弊,不展开说了。通过binlog可以将数据库中每次操作的内容记录下来,即使服务器宕机或者因为误操作需要恢复数据,我们就可以备份数据和binlog来进行重放将数据恢复到之前的某一个时刻。

那为什么还会有redo log这个东西呢?redo log的作用是每次数据进行更新时,先将数据更新写到redo log中,然后更新内存就结束了更新操作。这时数据库中的数据并不会改变,用户操作的数据都是内存中的数据,然后通过记日志加快数据更新的操作。这里可以这样理解:更新内存数据要比更新磁盘要快吧,写日志的顺序写要比更新数据库的更新索引更新数据要快吧,所以通过这种方式,加速数据库更新操作。然后在数据库空闲时再把redo log记录的操作更新到数据库中真正的数据中。通过这样的机制就可以保证数据库发生异常重启,之前的提交记录也不会丢失,这个能力就叫做crash-safe。

从数据库上理解,redo log和binlog是为了做不同的事存在的,历史原因是redo log是InnoDB特有的,所以如果使用InnoDB引擎,这两种log必定同时存在。

为了同时写这两个日志,并保证数据一致性,这时就必须两阶段提交。两阶段提交的目的是保证redo log和binlog的记录的操作是一致的,不然使用redo log更新数据库操作或者使用binlog恢复数据时就会导致数据不一致。这也是一种原子操作、事务的体现。