公众号merlinsea
背景
在数据库事务的机制中,mysql需要保证事务的原子性,一致性,持久性。原子性就是要同一个事务中的若干条sql语句要么同时成功要么同时失败,失败以后要恢复事务开启之前的数据,这就是undo log所负责解决的问题。一致性和持久性是说事务要从一个状态转变到另一个状态,但数据库执行器实际上还是对buffer pool内存的操作,因此可能存在内存没刷到磁盘的时候就崩溃的情况发生,这就是redo log 所负责解决的问题。
undo log介绍
作用:记录事务变更前的状态。操作数据之前,先将旧数据备份到undo log,然后进⾏数据修改,如果出现错误或⽤户执⾏了rollback语句, 则系统就可以利⽤undo log中的备份数据恢复到事务开始之前的状态。
内容:逻辑格式的⽇志,在执⾏undo的时候,仅仅是将数据从逻辑上恢复⾄事务之前的状态,⽽不是从物理页⾯上操作实现的。
⽂件位置:位于数据库的data⽬录下的ibdata
解决的问题:解决了事务的原子性问题。
redo log介绍
作用:记录事务变更后的状态。在事务提交前,只要将redo log持久化即可,数据在内存中变更。当系统崩溃时,虽然数据没有落盘, 但是redo log已持久化,系统可以根据redo log的内容,将所有数据恢复到最新的状态。
内容:物理格式的⽇志,记录的是物理数据⻚⾯的修改的信息。
⽂件位置:位于数据库的data⽬录下的ib_logfile1&ib_logfile2
redo log相当于是数据库最新数据的一个快照,那么触发将数据库中redo log缓存持久化到文件的事件是什么呢?
上面存在一个现象就是redo log会随着时间的积累越来越大,因此引入了一个check point机制,即将redo log日志文件中已经被同步的数据打上标记,定期将point之前已经同步的数据删除。