2.5 故障恢复

数据库运行过程中可能会发生故障,这个时候某些事务可能执行到一半但没有提交,当系统重启时,需要能够恢复到一致的状态,即要么提交整个事务,要么回滚。数据库系统以及其他的分布式存储系统一般采用操作日志(有时也称为提交日志,即Commit Log)技术来实现故障恢复。操作日志分为回滚日志(UNDO Log)、重做日志(REDO Log)以及UNDO/REDO日志。如果记录事务修改前的状态,则为回滚日志;相应地,如果记录事务修改后的状态,则为重做日志。本节介绍操作日志及故障恢复基础知识。

2.5.1 操作日志

为了保证数据库的一致性,数据库操作需要持久化到磁盘,如果每次操作都随机更新磁盘的某个数据块,系统性能将会很差。因此,通过操作日志顺序记录每个数据库操作并在内存中执行这些操作,内存中的数据定期刷新到磁盘,实现将随机写请求转化为顺序写请求。

操作日志记录了事务的操作。例如,事务T对表格中的X执行加10操作,初始时X=5,更新后X=15,那么,UNDO日志记为<T,X,5>,REDO日志记为<T,X,15>,UNDO/REDO日志记为<T,X,5,15>。

关系数据库系统一般采用UNDO/REDO日志,相关技术可以参考数据库系统实现方面的资料。可以将关系数据库存储模型做一定程度的简化:

1)假设内存足够大,每次事务的修改操作都可以缓存在内存中。

2)数据库的每个事务只包含一个操作,即每个事务都必须立即提交(Auto Commit)。

REDO日志要求我们将所有未提交事务修改的数据块保留在内存中。简化后的存储模型可以采用单一的REDO日志,大大简化了存储系统故障恢复。