根据redo log或undo log进行数据恢复时,是不是要扫描整个数据文件? 那未免太重了。
如果我们可以确信在log的某一点之前,数据都是完整的,那么我们就只需要处理这一点之后的log.
这个点就叫做"checkpoint". 在log中定期地生成checkpoint, 进行数据恢复时再找到最后一个checkpoint, 即可像上面所说的那样节省工作量。
以undo logging为例。生成checkpoint的简单办法是:
引用
1. 禁止启动新的transaction
2. 待所有transaction已经commit或abort
3. 将log flush至disk
4. 在log中生成一个<checkpoint>标识并flush至disk
5. 允许新的transaction
当然这种办法过于粗暴,由于禁止新transaction, 它会导致DB一段时间不可用; 有其他的机制如nonquiscent checkpointing, 可以不影响可用性。 具体就不说了。