April 2008
M T W T F S S
« Mar   May »
 123456
78910111213
14151617181920
21222324252627
282930  

重做日志管理(SG 9iR2)-1

1.基本日志结构
重做日志记录所有对数据库所作的数据修改。当数据库系统或者介质失败时,给数据库提供一种恢复机制。
.重做日志以日志组的形式管理。
.ORACLE数据库最少要有两个日志组
.每个日志组里面的日志文件称为日志成员。
.重做日志组和其成员的数量由参数MAXLOGFILES和MAXLOGMENGERS控制

2.重做日志的工作机制
ORACLE数据库将对数据库所做的修改(DML)写入redo log buffer,重做日志条目由LGWR再从redo log buffer中被写入
在线重做日志(online redo log)中。LOGWR在以下四种情况下会将redo log buffer中的数据写入online redo log中:
.当一个事务被递交(commit)
.当redo log buffer达到三分之一
.当redo log buffer中的数据达到1Mb
.DBWn写data buffer中的数据到DATAFILE

重做日志以循环方式被使用,每个重组日志组由一个叫重做日志序列号的的数据唯一标识,当重做日志被重用的时候,
这个序列号也同时被更新。
(1)日志切换(log switches)
日志切换就是当一个重组日志组满后,使用下一个重组日志组的一个动作。
(2)检查点(checkpoints)
当检查点发生时,数据库会做以下事情:
.由重做日志保护的数据库缓冲区中的脏数据由DBWn写入datafile中,被写的buffer数量由参数F
FAST_START_MTTR_TARGET决定。
.检查点后台进程CKPT更新素有数据文件和控制文件的文件头信息标志检查点完成。
(3)checkpoit的时间
什么时候会发生checkpoint呢?
.日志切换(log switch)
.数据库以normal,transactional,immediate方式关闭
.由参数FAST_START_MTTR_TARGET的设定引发
.DBA手工检查点
.ALTER TABLESPACE [OFFLINE NORMAL|READ ONLY|BEGIN BACKUP]
当LOG_CHECKPOINTS_TO_ALERT初时候参数被设置为TRUE(默认为FLASE),检查点相关信息会被记录到later_SID.log中。

3.强制日志切换(log switch)和检查点(checkpoint)
日志切换和检查点是有数据库自动完成的,但DBA可以用下面的方法强制数据库进行日志切换和检查点。

用ALTER SYSTEM SWITCH LOGFILE强制日志切换

强制检查点可以用下面两种方法:
(1)ALTER SYSTEM CHECKPOINT
(2)设置FAST_START_MTTR_TARGET
参数FAST_START_MTTR_TARGET从9i开始引入,这个参数是FAST_START_IO_TARGET和LOG_CHECKPOINT_TIMEOUT
的替代参数。如果设置了FAST_START_MTTR_TARGET参数,那么FAST_START_IO_TARGET和LOG_CHECKPOINT_TIMEOUT
就不需要使用了。例如参数FAST_START_MTTR_TARGET=600,则指示数据库实例恢复不能超过600s,ORACLE数据库
会自动调整其他参数来达到这个标准。当然这个调整就涉及到检查点发生频率的调整,为了使得数据库在规定时间
内完成实例恢复,这里的检查点发生就不能太长,因为当进行实例恢复时,数据库是以检查点为单位向前查找恢复的。
如果检查点时间太长那么要恢复的数据就会比较多。

4.添加重组日志组及成员
添加日志组语法:

ALTER DATABASE [database]
ADD LOGFILE [GROUP integer] filespec
[, [GROUP integer] filespec]...]

如:

ALTER DATABASE ADD LOGFILE GROUP 4
('D:\ORACLE\PRODUCT\10.2.0\ORADATA\10GDB\REDO04.LOG')
SIZE 10M;
 
select group#,sequence#,members,status,bytes/1024/1024  from v$log;
 
    GROUP#  SEQUENCE#    MEMBERS STATUS           BYTES/1024/1024
---------- ---------- ---------- ---------------- ---------------
         1         56          1 CURRENT                       50
         2         54          1 INACTIVE                      50
         3         55          1 INACTIVE                      50
         4          0          1 UNUSED                        10
ALTER DATABASE ADD LOGFILE
('D:\ORACLE\PRODUCT\10.2.0\ORADATA\10GDB\REDO05.LOG')
SIZE 10M;
 
select group#,status,member from v$logfile;
 
    GROUP# STATUS  MEMBER
---------- ------- ------------------------------------------------------------
         3         D:\ORACLE\PRODUCT\10.2.0\ORADATA\10GDB\REDO03.LOG
         2 STALE   D:\ORACLE\PRODUCT\10.2.0\ORADATA\10GDB\REDO02.LOG
         1         D:\ORACLE\PRODUCT\10.2.0\ORADATA\10GDB\REDO01.LOG
         4         D:\ORACLE\PRODUCT\10.2.0\ORADATA\10GDB\REDO04.LOG
         5         D:\ORACLE\PRODUCT\10.2.0\ORADATA\10GDB\REDO05.LOG

可以看到这里的GROUP关键字是可选的,如果不加GROUP,默认ORACLE添加一个新日志组。
还有我这里添加的日志大小并没有和其它日志组大小保持一致,ORACLE也是允许的。
当然是不建议这么做的,这里只是测试。

添加日志成员语法:

ALTER DATABASE [database]
ADD LOGFILE MEMBER
[ 'filename' [REUSE]
[, 'filename' [REUSE]]...
TO {GROUP integer
|('filename'[, 'filename']...)
}
]...

如:

ALTER DATABASE ADD LOGFILE MEMBER 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\10GDB\REDO06.LOG' TO GROUP 4;
ALTER DATABASE ADD LOGFILE MEMBER 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\10GDB\REDO07.LOG' REUSE TO GROUP 5;

NOTE:这里的REUSE的意思是当你用ALTER DATABASE DROP LOGFILE GROUP…语句删除日志组后,ORACLE没有从物理上删除这些LOGFILE。
如果你要再添加日志组或向日志组添加成员的时候可以重用这些物理文件。如果不加REUSE,ORACLE会文件已存在错误。
如:

ALTER DATABASE ADD LOGFILE GROUP 4 ('D:\ORACLE\ORADATA\ORA9IDB\REDO04.LOG',
                                    'D:\ORACLE\ORADATA\ORA9IDB\REDO05.LOG' )
                                    size 10M reuse;

5.删除在线重做日志组
语法:

ALTER DATABASE [database]
DROP LOGFILE {GROUP integer|('filename'[, 'filename']...)}
[,{GROUP integer|('filename'[,
'filename']...)}]...

如,删除日志组4:

ALTER DATABASE DROP LOGFILE GROUP 4;

使用存在的日志文件添加日志组:

alter database add logfile group 4 ('D:\ORACLE\ORADATA\ORA9IDB\REDO04.LOG',
                                    'D:\ORACLE\ORADATA\ORA9IDB\REDO05.LOG' )
                                    size 10M reuse;

NOTE:
(1).删除日志组存在以下限制:
*一个实例至少要有两个日志组,也就是说你不能删除仅存的两个日志组。
*状态为current和active的日志组不能被删除
*ORACLE不从物理上删除日志文件
(2).如何修改日志文件的大小
*创建符合大小的新日志组
*删除旧日志组

6.删除在线重做日志组成员
当重做日志状态为invalid时,你可能需要删除日志成员
语法:

ALTER DATABASE [database]
DROP LOGFILE MEMBER 'filename'[, 'filename']...

如:

ALTER DATABASE DROP LOGFILE MEMBER 'D:\ORACLE\ORADATA\ORA9IDB\REDO04.LOG';

NOTE:
删除日志组成员存在以下限制:
*如果你要删除的日志成员是组中最后一个日志文件,这个日志成员将不能删除,ORACLE 会报000361错误。
*如果日志成员所处的组状态为current,你需要做一个logfile swich。
*如果数据库运行在归档模式下,且日志组没有被归档,你不能删除日志组成员
*删除日志成员并不从物理上删除日志文件。

7.清除(Clearing), 重部署(Relocating),和重命名(Renaming)在线重做日志文件

(1)清除clearing
语法:

  ALTER DATABASE [database]
  CLEAR [UNARCHIVED] LOGFILE
  {GROUP integer|('filename'[, 'filename']...)}
  [,{GROUP integer|('filename'[, 'filename']...)}]...

如果某个日志组成员文件损坏了,你可以通过这个命令来解决这个问题,这个命名和通过添加新日志文件再删除日志文件的方法本质上没有什么不同。
但是这个命名在只有两个日志文件组,每个日志文件组只有一个日志成员的情况下也可以使用。也就是说当你不能通过添加新成员再删除就成员的
方法来修复算坏的日志文件的时候你可以使用这个方法你可以使用这个命令清除日志成员不管它是否已经归档,当时如果没有被归档你需要制定UNARCHIVED关键词。
在这种情况下,你将不能使用这个归档日志文件做恢复。也就是说你不能恢复这个归档日志文件所记录的事务修改。
处于current状态的日志组和成员是不能被clear的。
如:

 ALTER DATABASE CLEAR LOGFILE 'D:\ORACLE\ORADATA\ORA9IDB\REDO04.LOG';
 
 ALTER DATABASE CLEAR UNARCHIVED LOGFILE 'D:\ORACLE\ORADATA\ORA9IDB\REDO04.LOG';
 
 ALTER DATABASE CLEAR LOGFILE GROUP 4; 
 
 ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 4;

(2)重部署(Relocating),和重命名(Renaming)
你可以通过添加新成员再删除就成员的方法了进行relocating和renaming。
命令ALTER DATABASE RENAME FILE也可以用来完成这个任务,但数据库必须处于MOUNT状态。

8.配置在线重做日志
如何配置重组日志组及日志成员的数量?如何在磁盘布置日志文件?这些都没有现成的公式可以套用。
*重组日志组数量配置
我们需要根据系统的事务量,硬件设备的性能,I/O等来进行实际测试给系统进行一个合理的配置。
例如,当我们发现LGWR trace文件或者alret文件中有LGWR有很多因为检查点没有完成和日志组没有完成
而形成的等待事件的话就需要添加更多的日志组。
*重做日志组存放位置
(1).同一个重做日志组的成员放在不同的磁盘上
一般情况下我们需要将同组中的不同成员分布到不同的磁盘上,这样当某个磁盘损坏的时候,也就是有一个日志组
成员不可用,数据库仍可以利用另外一个日志成员运行。
(2)重组日志文件和归档日志文件放在不同磁盘上
这样可以降低ARCn和LGWR后台进程对资源的争用。
(3)数据文件和在线崇左日志文件存放到不同磁盘
这样同样可以减少LGWR和DBWn后台进程对资源的争用,也降低了因为介质失败导致数据文件额和在线重做日志文件
同时丢失的风险。
*重做日志文件的大小
在线重做日志文件的最小为50K,最大取决于操作系统。ORACLE允许不同组日志文件大小不同。但这样并没有什么
好处。一般情况下,当你要修改日志文件大小的时候才会出现不同大小的日志组。

NOTE:
以下这些因素可能会影响online relog logfile的配置
*日志切换和检查点的数量
*重做日志条目的数量和大小
*存储介质的容量大小,如用于存放归档日志的带库

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>