Redo 是数据库事务的生命线,Oracle 通过先写日志再改数据,保证了任何时候的事务安全。那么,Redo 究竟是什么?它又是如何保障数据库的稳定运行的呢?
什么是 Oracle Redo
1在线日志:保障事务安全
联机重做日志(Online Redo Log Files)是 Oracle 数据库中最关键的物理文件之一。它采用预写式日志(Write-Ahead Logging, WAL)机制,其核心原则是:日志先写入,再修改数据
这一机制确保了:
即便数据库意外中断,也可以依靠 Redo 日志恢复所有已提交的事务;
数据库始终保持强一致性,避免因崩溃而出现“丢账”情况。
关键组成:
Redo Log Buffer:内存中的循环缓冲区,用于记录数据库变更;
LGWR(Log Writer):负责将缓冲区中的内容安全写入日志文件,确保数据持久性。
2归档日志:恢复与灾备的关键
归档重做日志(Archive Redo Log Files)是已写满的联机日志组的副本,由数据库自动生成并存放到用户指定的目录中。它在数据库的安全性和可用性中扮演着非常重要的角色:
数据库恢复:在数据库意外崩溃或遇到灾难性事件时,归档日志是将数据库恢复到最新状态的关键依据。
主备同步:在 Oracle Data Guard 等主备环境中,归档日志可传输到备库,确保主库和备库的数据一致性。
历史追溯:结合 Log Miner 工具,归档日志可用于解析历史操作记录,甚至实现反向恢复或回滚操作。
可以把归档日志理解为 Oracle 的“黑匣子”:即便系统宕机,也能从中找到完整的变更记录,帮助数据库恢复和审计。
3Redo 内部结构:Change Vector
在了解了联机重做日志的基本作用之后,我们来看 Redo 的内部结构。需要注意的是,Redo 记录的并不是SQL语句本身,而是数据库块的变更信息(Block Changes)。
其中的核心单元是 Change Vector(Redo Vector),它包含:
块的原始镜像(Before Block Image)
操作代码
具体的变更内容
多个 Change Vector 可以组成一个 Redo Record,从而保证数据库变更的一致性与原子性。在内存中,这些记录会根据SCN(System Change Number)进行排序,最终由 LGWR 顺序写入 Redo 文件。Redo 文件采用首尾相接的组织方式,并结合 Sequence Numbe