首先给出参考资料:
1、Oracle官网-Managing the Redo Log
重做日志包含所有数据产生的历史改变记录。
重做日志文件通常用于
vlog从控制文件中显示日志文件的信息。可参考官网资料vlog
Column | Datatype | Description |
---|---|---|
GROUP# | NUMBER | Log group number |
THREAD# | NUMBER | Log thread number |
SEQUENCE# | NUMBER | Log sequence number |
BYTES | NUMBER | Size of the log (in bytes) |
BLOCKSIZE | NUMBER | Block size of the logfile (512 or 4096) |
MEMBERS | NUMBER | Number of members in the log group |
ARCHIVED | VARCHAR2(3) | Archive status (YES) or (NO) |
STATUS | VARCHAR2(16) | UNUSED,CURRENT,ACTIVE,CLEARING,CLEARING_CURRENT,INACTIVE |
FIRST_CHANGE# | NUMBER | Lowest system change number (SCN) in the log |
FIRST_TIME | DATE | Time of the first SCN in the log |
NEXT_CHANGE# | NUMBER | Highest change number (SCN) in the log. When STATUS=CURRENT, NEXT_CHANGE#is set to the highest possible SCN, 281474976710655. |
NEXT_TIME | DATE | Time of the highest SCN in the log. When STATUS=CURRENT, NEXT_TIME is set toNULL. |
CON_ID | NUMBER | 0,1,n三种情况 |
日志文件的六种状态UNUSED,CURRENT,ACTIVE,CLEARING,CLEARING_CURRENT,INACTIVE代表的意思分别如下所述:
ALTER DATABASE CLEAR LOGFILE
statement. After the log is cleared, the status changes to UNUSED
.上图就是Oracle LGWR进程向redo log files中写入redo记录的过程,可见,Oracle数据库每次只是用一个redo log file来存储redo log buffer中的redo记录。LGWR正在写入的那个redo log file就是current redo log file。
可用于实例恢复的redo log files就是active redo log files。
不再用于实例恢复的redo log files就是inactive redo log files。
如果数据库当前是Archivelog模式,那么直到有一个后台归档进程ARCn已经归档成功,数据库才能重用或者覆盖active online log file。
如果数据库当前是NoArchivelog模式,当最后一个redo log file写满的时候,LGWR会继续按顺序覆盖下一个inactive redo log file。
1 2 3 4 5 6 7 | SQL> select group#,status from v$log; GROUP# STATUS ---------- ---------------- 1 CURRENT 2 INACTIVE 3 INACTIVE |
---|
有代码可知当前所用的日志文件组数为3组,其中第一组是curren状态,第二三组是inactive状态。
我们也可以使用以下命令手动切换当前LGWR操作的redo log file。
SQL> alter system switch logfile;
系统已更改。
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 CURRENT
3 INACTIVE
可见当前LGWR操作的redo log file已经由之前的第一组修改为第二组了,并且第一组的redo log file变成了Active,也就是说可以用于实例恢复。
过了一会之后再次查询redo log file状态出现的结果如下:
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 CURRENT
3 INACTIVE
此时会发现后台进程会自动将第一个处于active的redo log file变成inactive。这是为什么呢?原来是后台归档进程ARCn将active redo log file归档成归档日志文件,相应的状态就由active变成了inactive。此时group1就不再用于实例恢复了。这个过程用下图来解释:
Oracle数据库允许多路复用重做日志,也就是说,重做日志的两个或多个相同的拷贝可以自动保持在不同的地点。为了最大效益,存储的位置应在分开的磁盘。即使重做日志的所有副本都在同一磁盘上,这种冗余措施也是可以防止I / O错误,文件损坏,等等。当使用复用重做日志时,LGWR会将相同的redo log信息同时写入多个相同的重做日志文件,从而解决重做日志的单点故障问题。
图中A_LOG1和B_LOG1是第1组的成员,A_LOG2和B_LOG2是第2组的两个成员,等等。一组中的每个成员都必须是相同的大小,并且是状态也是同步的(active or inactive)。
Oracle中的SCN(system change number)和我们的北京时间的意义是相同的,SCN是Oracle中的时间号。
为什么Oracle不用时间来界定呢?
我在北京时间8:00的时候执行一条DML语句,然后修改机器上的时间为7:00,再执行一条DML语句。如果用机器上的时间区分的话,那Oracle根本区分不出来这两条DML语句的执行顺序——而这一点对于Oracle是很重要的。所以它采用自己产生的SCN来区分所有操作的先后顺序。
关于SCN的具体讲解可以参见:http://blog.chinaunix.net/uid-18974058-id-3068592.html
日志文件使用操作系统块大小
Redo日志组成
Redo record
一个redo record记录包括
每个redo record包含每个原子改变的undo和redo
某些改动不需要undo(临时表,直接加载…)
redo log总结
参考:
Oracle官网-Using LogMiner to Analyze Redo Log Files
用途
目的