Chinaunix首页 | 论坛 | 博客
  • 博客访问: 401917
  • 博文数量: 127
  • 博客积分: 4025
  • 博客等级: 上校
  • 技术积分: 1980
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 18:09
文章分类

全部博文(127)

文章存档

2009年(127)

我的朋友

分类: Oracle

2009-09-06 21:12:43

4. 归档
当一个联机日志文件写完,发生日志切换,切换到另一个日志文件时,可以选择将前一个写完的联机日志文件进行归档。归档的过程简单理解就是拷贝的过程,将前 一个联机日志文件完整拷贝到指定的地方。这样的话,每次一个联机日志文件写完以后就生成一个拷贝出来,从而可以使得自设置归档以来数据库所发生的所有的数 据块变化都被记录下来。从而为数据恢复提供了完备的基础,你可以将数据库恢复到任意你希望的时间点。不过设置归档需要比不设置归档消耗更多的磁盘空间,同 时会一定程度上降低系统的性能,因为毕竟多了一块写磁盘的工作。但是,这部分性能的损失一方面相对数据安全性来说,完全可以忽略;另一方面,这部分的性能 损失本身不会对系统产生很大的影响,而且可以通过一些方式将归档所带来的性能损失降低到最低。

如果设置了归档模式,那么当一个联机日志文件文件还没有完成归档时,是不能被重用的。也就是说,假设只有两组归档日志(A和B),假设A写完以后,切换到 B以后,B也很快写完,这时又切换回A时,发现A仍然还处于归档过程中,这时LGWR进程必须等待,而触发LGWR的用户进程也必须等待。其等待事件为 log file switch (archiving needed)。这时整个数据库都停住了。
归档主要是通过ARCH进程来完成的,只有将数据库设置为archivelog模式时,oracle才会启动ARCH进程。设置归档模式时,先启动数据库 到mount模式,然后发出alter database archivelog就可设置数据库为归档模式。同时发出命令:archive log start或者设置初始化参数log_archive_start为true时,表示系统自动进行归档,否则需要手工归档。ARCH进程在以下条件下触 发:
1) 如果设置了自动归档模式,则日志切换时,由LGWR进程触发ARCH进程进行归档。这是最常见的方式。
2) 可以手工进行归档。使用命令:alter system archive log current表示启动ARCH进程,从而对当前的日志文件进行归档。
3) 如果ARCH进程在5分钟以后还没有接收到LGWR的通知,则发生超时,于是ARCH被唤醒以检查是否存在需要归档的日志文件。ARCH通过读取控制文件 中的信息来决定是否需要归档以及应该归档哪些日志文件。但是在进行实例恢复或者介质恢复的过程中,ARCH进程不会启动。

通常来说,ARCH进程启动以后的处理过程包括:
1) 从控制文件中读取未归档的日志文件。注意,可能会有多个日志文件。
2) 在内存中分配归档日志块,归档日志块的个数由隐藏参数_log_archive_buffer确定;每个归档日志块的大小则由_log_archive_buffer_size确定。
3) 打开联机归档日志组中的所有的日志文件,并校验它们的文件头。
4) 搜索可用的归档目的地。
5) 在可用的归档目的地创建并打开归档日志文件。
6) 在日志文件中从头到尾进行循环,取出每个日志块,并放入内存中的归档日志块,然后按照SCN的顺序放入归档日志文件中。
7) 关闭所有打开的文件,包括联机日志文件和归档日志文件。

在ARCH进程将联机日志文件里的日志块读取到归档日志块里的时候,如果发现所读取的日志块发
生损坏,则会转到相同日志组中的另外一个日志文件去读取相同的日志块。如果相同日志组中的所有日志文件的该日志块都发生损坏,则ARCH进程报错,无法继续进行归档工作。

当ARCH进程从日志文件中成功读取一个日志块以后,为了平衡物理I/O,ARCH进程会转到相同日志组中的另外一个日志文件读取下一个日志块。如此这般,在日志组中的每个日志文件之间进行循环读取。

如果ARCH进程出现性能问题,最突出的表现就是log file switch(archiving needed)等待事件的等待次数和等待时间很长。我们先来模拟一下该等待事件。这里要说明一下,在设置手动归档时,10g以前都只要archive log stop就可以了。10g以后必须使用
alter database archivelog manual命令。
SQL
> startup mount;
SQL
> alter database archivelog manual; --设置手动归档,不启用自动归档
SQL> alter database open;
SQL
> select distinct sid from v$mystat;
SID
----------
159
SQL
> insert into hanson.t1 select * from dba_objects;
这时,该语句停住了,然后我们再开一个session,看看该session在等待什么事件。
SQL
> select event from v$session_wait where sid=159;
EVENT
----------------------------------------------------------------
log file switch (archiving needed)
可以看到,该进程正是在等待log file switch(archiving needed)事件。
调优ARCH时,可以从以下几个方面入手。
1) 确定是否启用了自动归档,如果没有启用自动归档,则必须定期手工归档。
2) 需要确保归档日志文件不应该与联机归档日志文件放在同一个磁盘阵列里,而应该单独存放。同时避免把归档日志文件放在RAID-5设备上。
3) 把联机日志文件设置大一些,以便给ARCH进程的归档工作留出足够的时间。
4) 应该检查一下归档路径的设置,如果设置了很多的归档路径,则可以考虑减少一些归档路径。
5) 如果ARCH进程的速度还是很慢,则可以考虑增加ARCH进程的数量。可以设置的最大数量随oracle版本的不同而不同,9i下

    可以设置10个,而10g下可以设置30个。初始化参数log_archive_max_processes决定了最多能够启动多少个ARCH进程。当 LGWR进程发现当前的ARCH进程的数量不足以支持当前的负载时会自动启动一个新的ARCH进程。LGWR每次启动一个新的ARCH进程时都会将该信息 记录在日志文件里。但是这里要说明的是,并不是说多个ARCH进程可以同时读取同一组联机日志文件并对其规定,而是说次只能有一个ARCH进程来读取联机 日志文件并将其归档到不同的归档路径下。
   
    因此假设4组联机日志文件,依次为A、B、C、D。同时定义log_archive_max_processes为3,也就是最多能够启动3个ARCH进 程,假设分别为1#、2#、3#。那么当A写完,发生日志切换,切换到B时,LGWR启动1# ARCH进程对A进行归档。假设B也写完了,再次发生日志切换,切换到C时,这时ARCH 1#还没完成归档,这时LGWR发现这个情况,于是启动2# ARCH进程对B进行归档。假设这时C也写完了,再次发生日志切换,切换到D时,如果这时1# ARCH进程已经完成了对A的归档,则LGWR启动1# ARCH来对C进行归档,如果这时1# ARCH仍然没有完成,则LGWR会启动3# ARCH对C进行归档。
   
    从这里我们已经可以看到,通常情况下,log_archive_max_processes的缺省值就够用了。如果将要发生很大量的数据库批量写入以及更 新等操作,则说明可能在很短时间内涌入大量的重做记录,可能日志切换的速度会比ARCH进行归档的速度,这个时候,可以设置 log_archive_max_processes为一个更大的值,等到批量写入完成以后,再将该参数设置回缺省值。 (全文完)
阅读(590) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~