是为了效率考虑吗?
我觉得理论上可以不需要 redo 吧,崩溃时把最后一个检查点到奔溃点的所有日志记录全部 undo 不就好了吗?
把系统崩溃点之前已经提交或者回滚的事务进行 redo 而不是 undo 的原因是效率问题吗?
1
3dwelcome 2021-02-18 23:08:32 +08:00 via Android
恢复过几百 G 的数据飘过,只能 redo 。
undo 你也存不下那么大的日志数据量。 |
3
3dwelcome 2021-02-19 00:06:05 +08:00 via Android
redo 逻辑简单啊,快照前后只要存 sql 语句,恢复就是简单 SQL 重放。
undo 不一样,要跟踪所有的数据变动,万一一个 SQL 影响几百万数据,把每个数据变化值都要存下来,那多亏。 |
4
zxCoder OP @3dwelcome 可能是实际数据库和课本说的不太一样,我才看到课本,课本上说的 redo 和 undo 都是保存一个<T,data,oldVal,newVal>的日志记录
|
5
zjbztianya 2021-02-19 13:32:48 +08:00
@zxCoder undo 是保存在页(page)里的,redo 日志是保存在日志文件里的,崩溃恢复的时候,需要先执行 redo 日志,构造 undo page 再 undo 掉回滚的事务。而且 mvcc 也需要通过 undo page 实现
|