重做日志-Redo log
首先给出参考资料:
1、Oracle官网-Managing the Redo Log
为什么需要redo log
- 内存中数据修改后,不必立即更新到磁盘---效率
- 由日志完成数据的保护目的---效率
- 其他副产品
- 数据恢复(备份集+归档日志)
- 数据同步(DG,streams,goldengate)
- 日志挖掘
什么是Redo log
重做日志包含所有数据产生的历史改变记录。
重做日志文件通常用于
- 恢复
- 日志挖掘
- 流
- 数据库产生的每个改动
- 写入数据块缓冲之前,先写入redo log buffer --内存
- 写入数据文件之前先写入日志文件 --数据文件
- 当提交后,redo log buffer被刷入redo log files
关于v$log视图
vlog](https://docs.oracle.com/database/121/REFRN/GUID-FCD3B70B-7B98-40D8-98AB-9F6A85E69F57.htm#REFRN30127)
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代表的意思分别如下所述:
- UNUSED - Online redo log has never been written to. This is the state of a redo log that was just added, or just after a RESETLOGS, when it is not the current redo log.
- CURRENT - Current redo log. This implies that the redo log is active. The redo log could be open or closed.
- ACTIVE - Log is active but is not the current log. It is needed for crash recovery. It may be in use for block recovery. It may or may not be archived.
-
CLEARING - Log is being re-created as an empty log after an
ALTER DATABASE CLEAR LOGFILE
statement. After the log is cleared, the status changes toUNUSED
. - CLEARING_CURRENT - Current log is being cleared of a closed thread. The log can stay in this status if there is some failure in the switch such as an I/O error writing the new log header.
- INACTIVE - Log is no longer needed for instance recovery. It may be in use for media recovery. It may or may not be archived.
LGWR如何重复使用redo log files
![](https://img.haomeiwen.com/i6900270/f7f508fbce9d4edc.png)
上图就是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。
查询使用的日志文件的组数及每组的状态
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就不再用于实例恢复了。这个过程用下图来解释:
![](https://img.haomeiwen.com/i6900270/691cbc1ec337eb3d.png)
Multiplexed Redo Log Files
![](https://img.haomeiwen.com/i6900270/cc3e37b328164665.png)
Oracle数据库允许多路复用重做日志,也就是说,重做日志的两个或多个相同的拷贝可以自动保持在不同的地点。为了最大效益,存储的位置应在分开的磁盘。即使重做日志的所有副本都在同一磁盘上,这种冗余措施也是可以防止I / O错误,文件损坏,等等。当使用复用重做日志时,LGWR会将相同的redo log信息同时写入多个相同的重做日志文件,从而解决重做日志的单点故障问题。
图中A_LOG1和B_LOG1是第1组的成员,A_LOG2和B_LOG2是第2组的两个成员,等等。一组中的每个成员都必须是相同的大小,并且是状态也是同步的(active or inactive)。
SCN--system change number
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
日志文件
日志文件使用操作系统块大小
- 通常是512bytes
- 格式依赖于
- 操作系统
- Oracle版本
Redo日志组成
- 数据头
- redo record
Redo record
一个redo record记录包括
- Redo记录台
- 一个或多个改变向量
每个redo record包含每个原子改变的undo和redo
某些改动不需要undo(临时表,直接加载...)
redo log总结
- redo log是Oracle中极其重要的组件,它的目的在于保证数据的安全性
- redo log的丢失可能导致数据库中数据的丢失
- 应该讲Oracle至于归档模式下
日志挖掘-logminer
参考:
Oracle官网-Using LogMiner to Analyze Redo Log Files
用途
- 对Oracle在线redo和归档日志进行分析
目的
- 修正误操作
- 审计
dbms_logmnr
- 可以基于日志文件分析(一个或者多个)
- 可以基于时间段分析
- 可以基于SCN分析
记得帮我点赞哦!
精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,按照目录合理分类,总能找到你需要的学习资料,还在等什么?快去关注下载吧!!!
![](https://img.haomeiwen.com/i6900270/e46a42f40fb15ec9.png)
念念不忘,必有回响,小伙伴们帮我点个赞吧,非常感谢。
我是职场亮哥,YY高级软件工程师、四年工作经验,拒绝咸鱼争当龙头的斜杠程序员。
听我说,进步多,程序人生一把梭
如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个鼓励,将不胜感激。
职场亮哥文章列表:更多文章
本人所有文章、回答都与版权保护平台有合作,著作权归职场亮哥所有,未经授权,转载必究!
网友评论