ITPub博客

首页 > 数据库 > Oracle > 第6章. REDO管理

第6章. REDO管理

原创 Oracle 作者:jackqk 时间:2010-11-25 23:07:29 0 删除 编辑

开始学习REDO,在这里做下小小的笔记。

首先说明什么是REDO,REDO说白了就是几个文件,他的作用是当数据库出现故障的时候,进行恢复。那为什么REDO可以用于数据恢复呢,其实REDO文件里填满了重做记录(redo record 也可以叫redo entry),重做记录由一组变化矢量组成(矢量:在物理学上的矢量就是有大小有方向一条线。这里我的理解是可以找到数据库某个块),重做日志记录包含了数据库块的改变。如:你改变了雇员表的薪水值,就会产生一个重做记录,这个重做记录的矢量指明了改变的表中数据段的块,撤销段的数据块,和撤销段的事务表。当你用重做日志回复数据库时,数据库读重做条目中的变化矢量并用于相关的数据块。还要提及的一个概念就是重做线程,看了官方文档,用线程这么高级的词语挺迷惑我的,我的理解就是重做线程只不过是记录重做日志属于哪个实例的标识符,这个东西在RAC环境下我们才会关注它,因为单实例数据库就只有一个重做日志线程。

oracle数据库规定至少有俩个重做日志文件,这是为什么呢?原因有两,1.数据库是以循环的方式写重做日志的(如1写完写2,2写完写1)那就出现一个问题,重做日志不是用于恢复的吗?都被覆盖了还怎么恢复?原因2就出现了,重做日志可以被归档(也就是我们说的文件保存)。那为什么不是一个重做日志组就够了吗,oracle这样做是为了提高计算机利用效率,一个写一个存,就不用等到非等这个写完存完再写影响效率了。所以oracle公司就做这样的硬性规定。说到这我们介绍一下未归档模式和归档模式,顾名思义不归档就是对重做日志不进行归档,这样做对于一些介质损坏就没办法,但能进行实例恢复。一般我们在测试库上用这种模式。归档模式是数据库数据的保证,生产模式下不用的话是不可想象的。

知道了什么是重做日志,有必要了解一下ORACLE是如何写重做日志的,上面提到ORACLE是以循环的方式来写重做日志的。那么谁来写的?一个叫LGWR的进程会往重做日志里写数据,而且每次只往一个重做日志文件上写,这样重做日志会出现几种状态,current状态表明LGWR正在写重做日志文件,active是被需要用于实例恢复的重做日志文件(我的理解是重做日志文件的内容还没完全写到数据文件里,所以当数据库奔溃的时候还需要实例恢复),inactive说明这个说做日志文件内容已经没用了可以被重新利用。
现在已经知道当一个重做日志被填满的时,LGWR会向下一个重做日志文件写重做记录(redo record),这个过程成为重做日志切换(LOG SWITCH)。但是不是只有重做日志被填满时,你才日志切换呢?答案是否定的,你可以在任何时候手动的进行日志切换。在切换的时候会标给每个重做日志一个重做日志序列号(LOG SEQUENCE NUMBER),这个为以后的实例恢复或介质恢复提供了先后顺序。
以上介绍了重做日志的基本概念,接下来介绍如果合理的分配重做日志。一般情况下,我们设重做日志组有两个组成员,一共两组,并把他分配到不同的磁盘,这样做的好处就是,即使其中一个磁盘坏掉了,对于LGWR而言,也只不过是其中一个组成员变的不可访问,数据库仍然进行工作。 即使把组里的成员放到一个磁盘上,冗余技术也可以很好的防范I/O错误和文件竞争。关于磁盘大小和组的数量设定,往往要根据实际情况而定,如你的磁带有1G空间,你可以设置接近1G的REDO文件,这样做虽然会减少LOG SWITCH的次数,提高数据库的性能,但是会增加实例恢复的时间。减少REDO的大小小于500M可以让两个归档日志存储一个磁带上,提高了存储空间的利用率。关于组数量,就得看日志的跟踪文件和警告日志,如果日志指出LGWR等待REDO的原因是REDO归档未完成,那么增加组数量可以解决这类问题。对于这类问题的原则就是以尽可能小的成本,但又不妨碍LGWR的工作效率。在主/备数据库模型中,使用ARCHIVE_LAG_TARGET指定备用数据库慢于源数据库的时间,ARCHIVE_LAG_TARG使用就是规定时间REDO必须做log switch。在没有备用数据库的情况也可以使用这个参数指定归档的周期时间。
下面是管理REDO的实用操作:
创建一个组(XXX指的是路径,AAA是新建的文件名,大小最好指定,我在测试库上建的时候报ORA-17610,貌似必须指定):
ALTER DATABASE
ADD LOGFILE GROUP N ('XXX/XXX/XXXX/XXX/AAA') SIZE 10M;
创建一个组成员(注意文件名必须被指定,但大小不一定,新的组成员大小取决于当前组成员的大小。):
ALTER DATABASE
ADD LOGFILE MEMBER 'XXX/XXX/XXX/XXX/AAA' to group N;
删除一个组:首先执行select * from v$logfile;确定要删除的组,然后使用下面语句:
alter database drop logfile group N;
如果你没有使用ORACLE-MANAGED,那么还需要手动从物理磁盘上删除文件。
删除一个组成员:
ALTER DATABASE DROP LOGFILE MEMBER '/XXXX/XXXX/AAAA';
手动切换重做日志:
ALTER SYSTEM SWITCH LOGFILE;
另外说一下DB_BLOCK_CHECKSUM,这个参数默认情况下为TRUE,作用是归档的时候使用校验的方法来检验REDO文件中是否有块,如果检测到警告日志会记录这个坏块。一个组里的其中一个成员有坏块不影响归档,但一个组全部成员都有坏块那么归档不会被继续。使用ALTER DATABASE CLEAR LOGFILE GROUP 3和ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3可以初始化重做日志文件。还有一些信息存储在v$log,v$logfile,v$log_history动态视图里,进一步了解可以查询这些动态视图。
好了REDO的笔记写到这了,等以后翻阅adminitrator有新的心得时,会追加的。

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23636923/viewspace-1042087/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: oracle 函数
请登录后发表评论 登录
全部评论

注册时间:2010-11-25

  • 博文量
    3
  • 访问量
    2601

最新文章