ORACLE 重做日志

重做日志(Redo Log)用于记录所有对数据库的改变,也被成为事物日志文件(TRANSACTION LOGFILE)。它对数据库来说至关重要。我们在Oracle中完成的每一个变动数据的操作都会生成一定Redo信息,并写入在重做日志文件中。如向表中插入一行是,插入的最终结果会写入重做日志。

一、重做日志文件概述

重做日志分为在线重做日志和归档重做日志。

online Redo log files–在线重做日志,又称联机重做日志,指Oracle以SQL脚本的形式实时记录数据库的数据更新,换句话说,实时保存已执行的SQL脚本到在线日志文件中(按特定的格式)。
Archive Redo log files–归档重做日志,简称归档日志,指当条件满足时,Oracle将在线重做日志以文件形式保存到硬盘(持久化)。

重做日志文件主要以重做记录的形式记录、保存对数据库所作的修改(或事务)。如果在一段时间内只对数据库进行了查询操作,则不产生重做日志记录信息。如果对一个表的数据进行了修改,并完成了事务的提交,这时数据文件只存储修改后的数据,但重做日志文件中要记录两类数据:一类是修改前的数据;一类是修改后的数据。所以重做日志文件的管理方式与数据文件的管理方式有所不同。

1.1 重做日志文件的作用与目的

重做日志文件在数据库的恢复过程中起着非常重要的作用,可以用来进行例程和介质恢复,以及事务的撤销。

1.数据库运行不正常,如由于断电而出现的例程失败,或者是由于磁盘损坏而出现的介质失败时,都能够实现例程恢复或介质恢复。其中介质恢复需要借助于归档日志文件;
2.数据库运行正常时,由于不正确的删除或修改了某条记录、某个表,甚至表空间时,能够实现事务的撤销。在撤销时要借助于撤销表空间或撤销段。

1.2 重做日志条目(Redo Entry)

一个”重做日志条目”由一系列的改变因子(Change Vectors)组成。一个改变因子用于描述一次对某个数据块的改变。进行实例恢复时,Oracle读取重做日志条目中的改变因子,然后把这些因子应用到相应的块上。

道听途说:
Rama Velpuri写过的书 Oracle Backup and Recovery Handbook,里面有比较详细的阐述,大体说是,一个transaction包含若干redo entries,一个redo entry又包含若干的change vectors,change vector的构成。

完全不懂啥意思???

1.3 重做日志(Redo Log)的构成

Oracle 11g默认对于每个数据库实例,建立3个在线日志组,每组一个日志文件,文件名称为REDO01.LOG,REDO02.LOG和REDO03.LOG。(用户可以通过视图操作添加/修改/删除日志组和日志文件来自定义在线重做日志)。每组内的日志文件的内容完全相同,如图12-1所示

https://img-blog.csdn.net/20160101010312590?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

后台进程LGWR负责把重做日志缓存区(Redo Log Buffer)中的重做日志条目写到重做日志中。当用户提交一个事务时,LGWR把这个事务的重做条目写入重做日志文件,并赋予一个系统改变标识符(System Change Number,SCN),SCN用于标识事务的重做日志条目。只用当事务的”重做日志条目”被成功写到磁盘上的重做日志文件中,事务的提交(Commit)才算完成。当然,在下面的情况下,LGWR也会自动把重做日志缓冲区中的重做日志条目写到重做日志文件中:

  • 每隔3秒钟
  • 一个用户提交一个事物
  • 日志缓存区(Redo Log Buffer)被填满三分之一
  • 日志缓冲区(Redo Log Buffer)有将近1MB的日志数据
  • 发生校验点(Checkpoint)

如果当前的重做日志被填满,Oracle会切换到下一组有效的重做日志组,直到下一组重做日志被填满,Oracle又切换到另外一组有效的重做日志组。当所有的重做日志组都被填满后,Oracle切换到第一组重做日志组继续写,如图12-2所示。

https://img-blog.csdn.net/20160101011613803?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

进行日志组切换时,并不是所有的重做日志组都有效,如果数据库运行在非归档模式(NOARCHIVELOG)并且重做日志文件记录的内容已经写到数据文件中,则该重做日志组被认为有效;如果数据库运行在归档模式(ARCHIVELOG),重做日志文件记录的内容已经写到数据文件中并且已经归档,则该重做日志组也被认为有效。有效的重做日志组可以被重新使用。当一组重做日志组被填满时,Oracle会自动进行日志切换(Log Switches),当然,也可以使用命令强迫Oracle进行日志切换。

默认情况通常只有一组处于活动状态,不断地同步写入已操作的脚本,当日志文件写满时(达到指定的空间配额),如果当前数据库处于归档模式,则将在线日志归档到硬盘,成为归档日志;若当前数据库处于非归档模式,则不进行归档操作,而当前在线日志的内容会被下一次重新写入覆盖而无法保存。因此,通常数据库在运行时,是处于归档模式下的,以保存数据更新的日志。

当前归档日志组写满后,Oracle会切换到下一日志组,继续写入,就这样循环切换;当处于归档模式下,切换至原已写满的日志组,若该日志组归档完毕则覆盖写入,若没有则只能使用日志缓冲区,等待归档完毕之后才能覆盖写入。当然,处于非归档模式下是直接覆盖写入的。(关于数据库归档模式的设置,我会在另外的博文中讲到)。

二、关于在线重做日志(online redo log)

三、关于归档重做日志(Archive redo log)


作者 @zokaper
2015 年 12月 31日

参考文献:

1 http://blog.csdn.net/ppp_10001/article/details/4688596
2 http://www.cnblogs.com/tracy/archive/2011/09/27/2192749.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值