MySQL运维21-灾难恢复

1、MySQL为什么需要灾难恢复

  • InnoDB的表数据是存于innodb_buffer_pool里的,但数据被修改后,不会马上写入到磁盘,而是会先写日志,这个日志就是事务日志(Redo日志),这种方式叫做预写式日志(Write-Ahead Logging,WAL)方式,因为写磁盘是随机写,而写日志是顺序写要快得多,通过WAL方式可以大幅提高写效率,也就是先写日志,真正的将数据刷写到磁盘被延后了,可以等到系统不忙的时候再执行。
  • 事实是InnoDB会按一定的机制批量将脏数据刷新到磁盘。如果突然断电了,那么InnoDB是不能保证数据已经刷写到磁盘的,所以在数据库重启后需要基于Redo日志(所有事务日志)和Undo日志(未提交事务日志)进行灾难恢复。

2、MySQL灾难恢复的步骤:Redo+Undo

灾难恢复过程可以分为redo(重做)和undo(回退)两个步骤:

  1. MySQL检查Redo日志,与数据库数据文件进行比对,从而知道宕机时有哪些已提交的事务是还没有被刷写到到磁盘上的数据文件中,找到Redo日志的某个点,把这个点之后的日志重新运行一遍。
  2. Redo过程会产生一个问题,就是会把所有事务包括未提交的事务也执行一遍,但其实未提交的事务是不需要执行的。所以会基于undo日志确定哪些事务未提交,对这些事务进行回滚。通过Redo+Undo两个阶段,完美实现了灾难恢复。

猜你喜欢

转载自blog.csdn.net/oddrock/article/details/130173987