Oracle 的日志分为:ONLINE REDO LOG 和 archived log
online redo log:
一个数据库至少要有2组 redo log,每组 redo log 至少要有一个 member(出于安全考虑,建议每组 redo log 至少有 2 个多元化的 redo log member)
redo log 循环使用,当一组日志写满后,就会切换到下一组日志。在非归档模式下,当所有日志组写满后,就会覆写之前写满且状态为 inactive 的日志组,以达到循环使用的目的。
在归档模式下,当所有日志组写满后,LGWR 要等到所有日志都已归档,且日志中记录的事务数据全部写入磁盘(inactive)后才会覆写之前的日志组,否则会一直等待这些任务完成。
日志内容:
redo log 的 redo entry 由一组变更向量组成。
变更向量(change vector):数据本身的改变、对应的 undo 改变、undo segment 的改变
示例:要修改某张表中的某个字段的值,那么修改之前的字段值就会放在 undo 中,为了申请该事务,还需要修改 undo segment 段头中事务表的信息,这个过程的描述就是
redo log 的变更向量。
变更向量的信息包括:版本号、事务操作代码、发生变更的数据块地址。在建立变更向量时,会从数据块中复制版本号。在恢复期间,Oracle 会读取向量并将修改应用于对应的数据块。
同时对数据块的版本号加 1.
Redo Thread 日志线程
单实例:一个 redo thread
RAC:实例数和redo thread 数量 1:1,每个实例都有自己的 thread
引入 redo thread 就是为了避免多个实例之间共享 redo log file 而导致争用,从而提高数据库性能。
一般而言,thread number=instance number
在 RAC 环境下,添加日志要指定线程:
ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 5
('+DATA1/oradata/redo06.log','+DATA1/oradata/redo06.log') size 10m;
ALTER DATABASE ADD LOGFILE MEMBER
'...........' TO GROUP 5;
每个 REDO THREAD 或者(instance)至少需要两组日志,这些日志循环使用。当一组日志写满后,会发生 log switch 事件而使用下一组日志。如果数据库处于归档模式,
该归档日志还要被归档。在LOG SWITCH 时,会触发增量 checkpoint,启动 DBWR 后台进程将该日志中记录的所有操作所涉及的 dirty block 从 data buffer 写入磁盘文件。
一旦checkpoint 完成,这个日志组便可以被覆写重用。