为什么需要redo log

  • 内存中数据修改后,不必立即更新到磁盘---效率
  • 由日志完成数据的保护目的---效率
  • 其他副产品数据恢复(备份集+归档日志)数据同步(DG,streams,goldengate)日志挖掘

什么是Redo log

重做日志包含所有数据产生的历史改变记录。

重做日志文件通常用于

  • 恢复
  • 日志挖掘
  • 数据库产生的每个改动写入数据块缓冲之前,先写入redo log buffer --内存写入数据文件之前先写入日志文件 --数据文件
  • 当提交后,redo log buffer被刷入redo log files

关于v$log视图

v$log从控制文件中显示日志文件的信息。可参考官网资料[v$log]( https://docs.oracle.com/datab...

日志文件的六种状态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 to UNUSED .
  • 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

上图就是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就不再用于实例恢复了。这个过程用下图来解释:

Multiplexed Redo Log Files

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

cnblogs-LogMiner配置使用手册

用途

  • 对Oracle在线redo和归档日志进行分析

目的

  • 修正误操作
  • 审计

dbms_logmnr

  • 可以基于日志文件分析(一个或者多个)
  • 可以基于时间段分析
  • 可以基于SCN分析

自动清理归档日志_Oracle重做日志和日志挖掘相关推荐

  1. PostgreSQL归档配置及自动清理归档日志

    PostgreSQL归档配置及自动清理归档日志 在生产环境中,数据库都需要开启归档模式,那么PG该如何开始归档呢? PG中归档配置涉及几个参数: # - Archiving - #是否开启归档 #ar ...

  2. 自动清理归档日志_从MYSQL 数据库归档 到 归档设计

    到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦. 我见到过的,听到过的数据库归档的方法有以下几种 1  数据通过人工的手段来进行清理,直接将表换 ...

  3. 自动清理归档日志_LGWR 日志写入进程

    为了实现为多用户提供服务且保证系统性能,在一个多进程Oracle 系统(multiprocess Oracle system)中,存在多个被称为后台进程(background process)的Ora ...

  4. linux日志自动清理归档,Linux系统实现log日志自动清理

    背景简介 在实际项目中由于服务器内存有限,人工制定的定时清理时常会忘记.因此启用linux系统定时任务去执行日志清理功能.引用文献 1.创建shell脚本及执行权限 touch clean.sh // ...

  5. Oracle归档日志使用情况及自动清理

    背景 新上的应用最近在做压力测试,测试了一天就发现登录报错了,提示: ORA-00257: Archiver error. Connect AS SYSDBA only until resolved ...

  6. 非归档模式下重做日志覆盖后的rman恢复

    非归档模式下重做日志覆盖后的rman恢复 实验原理:在非归档模式下,数据库的重做日志不会写入归档日志中,对数据库的恢复只能依靠3个联机重做日志.当第一个重做日志满了,就切换第二个重做日志中,以此类推, ...

  7. zookeeper3.4.6配置实现自动清理日志

    在使用zookeeper过程中,我们知道,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默认情况下只有dataDir目录,snapshot和事务日志都保存 ...

  8. python 技术篇-logging模块的日志定期清理设置,自动清理上个月的日志实例演示

    先说一下我设置的清理日志原理: 每天都建立一个新的日志文件来存储日志,每次启用程序时检查日志目录里的所有日志文件,自动清理上个月之前的日志. 如图,我把日期存在当天日志的名字里. 然后遍历目录下所有的 ...

  9. linux生成日志文件,linux实现按天生成日志文件并自动清理

    linux实现按天生成日志文件并自动清理 前篇文章中讲到如何在Linux crontab创建每秒执行的方法,高人可能早意识到日志文件没做处理,假如没人工处理久了日后越来越大肯定会出现问题,当然人工处理 ...

最新文章

  1. 其他算法-Dijkstra
  2. shell脚本编程第一天
  3. macOS下编译PgBouncer
  4. 新东方雅思词汇---6.1、oppose
  5. Angular应用里使用rxjs提供的观察者和发布者实现事件处理
  6. shell脚本判断上一个命令是否执行成功
  7. 编写一个学生类 student,包含的属性有学号、姓名年龄,将所有学生存储在一个数组中
  8. eclipse和mysql创建ssm_Eclipse下SSM项目的搭建
  9. Android安全:Hook技术
  10. Android studio 设置默认打开项目,默认打开项目方式
  11. Android LitePal
  12. 制作Win10PE启动盘
  13. html炫酷动态时钟代码,js动态炫酷数字时钟
  14. Debian修改IP地址
  15. DINO Emerging Properties in Self-Supervised Vision Transformers 论文阅读
  16. PHP网页的工作原理
  17. vue的html自动刷新,vue项目刷新当前页面的方法
  18. Qt数据库应用21-数据分组导出
  19. 最新深信服面试笔试题
  20. layui分页功能在vue写的H5中实现

热门文章

  1. 从SQL Server CloudDBA 看云数据库智能化
  2. qq空间等闪动的文字怎么做?
  3. Java使用Jdbc操作MySql数据库(一)
  4. MySQL INNODB Plugin 测试(二)
  5. IE自动在后台运行,不知道是什么病毒?
  6. Spring事务传播特性实例解析
  7. linux 设备事件管理服务 systemd-udevd.service 简介
  8. Nmap源码分析(主机发现)
  9. Windows10 + Visual Studio 2017 + CMake +OpenCV编译、开发环境配置及测试
  10. phpStudy在linux下的使用说明