欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle online redo log 基础知识

程序员文章站 2022-06-04 13:45:27
...

Oracle 的日志分为:ONLINE REDO LOG 和 archived log

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 完成,这个日志组便可以被覆写重用。