数据库中有一个特殊的“日志文件”,叫做Redo(重做)Undo(撤消)。传统上,日志文件记录系统的运行状态,主要供系统工程师或程序员使用。故障排除。Reod/Undo文件是数据库的一部分,主要用于数据恢复,保证数据的一致性和完整性。目的数据库在执行Insert、Update、Delete动作时,实际上不会对数据文件进行I/O操作,而是分为两部分:修改内存中的数据(数据库称为Buffer)记录RedoUndologs只有当Buffer满足刷新条件(比如脏数据达到一定比例)时,才会对数据文件进行操作。数据库的设计是基于性能的考虑,因为读写数据文件是随机I/O,会降低系统性能;RedoUndo虽然也可以写文件,但是是顺序写的,性能比较高。这种顺序写一般使用LSM(LogStructuredMergeTrees)算法,比如Kafka、HBase、LevelDB。因为数据并没有真正写入数据文件,所以当数据库系统崩溃时(如断电、系统重启、介质错误),数据库系统会使用Redo和Undo来恢复数据。如何恢复这两个原则ReadRedo从前到后,重做所有已提交的事务Read从后往前Undo,回滚未提交的事务以上面的操作为例,假设故障点发生在第一次Write之后。数据库启动后,读取Redo文件,发现没有committed事务,什么都不做;读取Undo文件,找到未提交的事务,恢复X=0(假设X的历史值为0)。假设故障点发生在第二次Write之后:数据库启动后读取Redo文件,发现没有committed事务,什么都不做;读取Undo文件,找到未提交的事务,恢复X=1,继续回滚X=0。假设故障点发生在Commit之后:数据库启动后,读取Redo文件,出现一个已提交的事务,执行X=1,则X=2;读取撤消文件并找到已提交的事务,什么也不做。多次交易也是如此,读者可以自行尝试列举。【本文为专栏作家“行森”原创文章,转载请联系作者获得授权】点此阅读更多本作者好文
