在创建数据库的时候,可能大家已经注意过,在如图7-2所示的界面中有一个选项“启用归档”,如果选择该选项,创建的数据库将运行在归档模式下,否则数据库运行在非归档模式下。

图7-2 是否启用归档
归档模式(Archivelog)和非归档模式(NoArchivelog)是Oracle数据库的两种运行方式,所谓归档是指对历史的Redo Log日志文件进行归档保存。Oracle依赖Redo Log File来进行故障恢复,也就是重做,在非归档模式下,Redo Log File以覆盖的方式循环使用,在归档模式下,日志文件被覆盖之前必须已经被复制归档,保留的归档日志将为Oracle提供强大的故障恢复能力。
在命令行,可以通过命令archive log list获取当前数据库的归档状态,例如:
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 +FSHDG
最早的联机日志序列 6302
下一个存档日志序列 6304
当前日志序列 6304
运行在归档模式下,数据库需要额外的空间存放归档日志,而且写出归档日志会为数据库带来性能负担,但是归档模式可以为数据库带来强大的可恢复性,所以生产数据库通常都应该运行在归档模式下,当然归档模式应该和相应的备份策略相结合,只有归档模式没有相应的备份策略只会带来麻烦。我们曾经见过很多用户由于缺乏必要的监控和备份策略,在归档模式下由于归档空间耗尽而导致数据库故障的案例。
有一个问题大家都应该清楚:最危险的数据库是什么样子的?
答案很简单:非归档、无备份。
更改数据库的归档模式需要重新启动数据库,在mount模式下修改,以下是步骤说明。
修改必要的初始化参数。
以immediate方式关闭数据库。
启动实例到mount状态。
更改运行模式并打开数据库。
以下简单介绍如何启用和关闭数据库的归档模式。
(1)修改初始化参数。和归档相关的几个主要参数如下。
log_archive_start:用于定义是否启动自动归档,Oracle10g这个参数废弃。
log_archive_format:用于定义归档文件格式,可以采用缺省值。
log_archive_dest:用于定义归档文件路径,与log_archive_dest_n参数不兼容
log_archive_dest_n:Oracle允许定义多个归档路径,一般可以使用log_archive_dest_1参数即可。
如果数据库使用的是pfile文件,则可以直接修改,如果用的是spfile文件,则可以通过命令行修改:
SQL> show parameter spfile
NAME TYPE VALUE
----------------------------- ----------- ----------------------------
spfile string ?/dbs/spfile@.ora
SQL> alter system set log_archive_dest_1='/opt/oracle/archive';
系统已更改。
注意:在Oracle 10g之前,更改数据库为归档模式,还有一个重要的初始化参数需要修改,这个参数就是log_archive_start,用于限制Oracle可否自动归档,如果该参数设置为False,数据库即使在归档模式下也不会自动归档,当日志写满后,Oracle会等待用户进行手工处理,如果所有日志全部写满,那么数据库的所有DML操作将会全部挂起,数据库将会经历服务中断。不幸的是这个参数的缺省值是False,这曾经一度导致了大量数据库故障的发生。
从Oracle 10g开始,这个参数失去了作用,即使该参数为False,数据库在归档模式下也会自动归档。
(2)关闭数据库。以shutdown normal或shutdown immediate方式关闭数据库:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
(3)启动数据库到mount状态:
SQL> startup mount;
ORACLE instance started.
Database mounted.
(4)启用或停止归档模式。如果要启用归档模式,此处使用alter database archivelog命令:
SQL> alter database archivelog;
SQL> alter database open;
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /opt/oracle/archive
Oldest online log sequence 148
Next log sequence to archive 151
Current log sequence 151
SQL> show parameter log_archive_start
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_start boolean FALSE
如果需要停止归档模式,此处使用alter database noarchivelog命令:
SQL> alter database noarchivelog;
SQL> alter database open;
从Oracle 10g开始,Oracle数据库中引入了一个闪回恢复区(Flash Recovery Area)的概念,所谓闪回区是指用于存储和恢复相关的一系列备份文件的磁盘空间。通过这个闪回区,Oracle可以简化用户的备份行为和备份管理,进一步地,Oracle可以对备份的文件执行大量的自动维护工作。
在创建数据库时可以设置闪回区,设置界面和前面引用的图7-2相同。
闪回恢复区可以指定为文件系统上的一个目录,也可以是一个ASM磁盘组,闪回区的大小由
db_recovery_file_dest_size 参数指定,路径由db_recovery_file_dest参数指定:
SQL> show parameter db_recover
NAME TYPE VALUE
-------------------------------- ----------- ------------------------------
db_recovery_file_dest string +FLSHDG
db_recovery_file_dest_size big integer 90G
这两个参数都是动态参数,可以动态进行修改。
以下几类主要文件可以在闪回区中存放:
控制文件;
归档的日志文件;
闪回日志;
控制文件和SPFILE自动备份;
RMAN备份集;
数据文件拷贝。
设置归档日志存放在闪回区,可以使用如下命令:
SQL> alter system set log_archive_dest_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST';
System altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 208
Current log sequence 210
注意log_archive_dest_1与log_archive_dest和LOG_ARCHIVE_DUPLEX_DEST参数不兼容,如果设置了log_archive_dest参数,需要先将其清空:
SQL> alter system set log_archive_dest_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST';
alter system set log_archive_dest_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST'
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-16019: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_DEST or
LOG_ARCHIVE_DUPLEX_DEST
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string +fshdg
SQL> alter system set log_archive_dest='';
System altered.
SQL> alter system set log_archive_dest_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST';
System altered.
闪回区的一个优势是Oracle会执行自动的空间维护,过期的文件或备份可以自动被删除以释放空间。在闪回恢复区中的空间使用超过85%的时候,数据库将会向alert文件中写入告警信息;当超过97%的时候将会写入严重告警信息;当闪回恢复区空间不够的时候,则数据库将会挂起,日志中会记录如下信息:
ORA-19815: WARNING: db_recovery_file_dest_size of 53687091200 bytes is 100.00% used,
and has 0 remaining bytes available.
再接下来的告警信息将会提示一系列归档错误:
ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 9563136 bytes disk space from 53687091200 limit
*** 2005-12-04 13:59:14.011 52278 kcrr.c
ARC1: Error 19809 Creating archive log file to
'/msflsh/MMSDB/archivelog/2005_12_04/o1_mf_1_17108_%u_.arc'
*** 2005-12-04 13:59:14.011 50725 kcrr.c
kcrrfail: dest:10 err:19809 force:0 blast:1
*** 2005-12-04 13:59:14.012 52278 kcrr.c
ARC1: All standby destinations failed; successful archival assumed
*** 2005-12-04 13:59:14.026 16432 kcrr.c
ORA-16038: log 1 sequence# 17108 cannot be archived
注意这里的一个词reclaim,这个词的主要词义是“回收”。Oracle用了回收在这里,意思就是已经没有空间可以回收以满足归档的空间需求了;这也就意味着如果闪回区中存在过期的备份或者归档,数据库是可以自动删除这些文件以回收空间的。
当Oracle在reclaim空间时,可能看到如下类似信息:
Sat Oct 1 21:20:54 2005
Deleted Oracle managed file
+ORADG/danaly/backupset/2006_09_07/ncsnf0_tag20060907t192619_0.274
Deleted Oracle managed file
+ORADG/danaly/archivelog/2006_09_08/thread_1_seq_35.276.600588049
Sun Oct 2 05:46:40 2005
Thread 1 advanced to log sequence 80
Current log# 2 seq# 80 mem# 0: +ORADG/danaly/onlinelog/group_2.260.600173851
Current log# 2 seq# 80 mem# 1: +ORADG/danaly/onlinelog/group_2.261.600173853
可以看到,Oracle自动地删除了过期的备份和归档日志文件。
使用闪回区,要注意闪回区的利用率,一旦空间耗尽,那么数据库将陷于停顿状态,如果真的遇到ORA-19815错误,那么就可以在警告日志文件中看到Oracle建议的详细解决方案:
ORA-19815: WARNING: db_recovery_file_dest_size of 2147483648 bytes is 100.00% used, and has 0 remaining bytes available.
*************************************************************
You have the following choices to free up space from
flash recovery area:
1. Consider changing your RMAN retention policy.
If you are using dataguard, then consider changing your
RMAN archivelog deletion policy.
2. Backup files to tertiary device such as tape using the
RMAN command BACKUP RECOVERY AREA.
3. Add disk space and increase the db_recovery_file_dest_size
parameter to reflect the new space.
4. Delete unncessary files using the RMAN DELETE command.
If an OS command was used to delete files, then use
RMAN CROSSCHECK and DELETE EXPIRED commands.
*************************************************************
很多朋友习惯通过手工清除文件的方式释放空间,但是数据库无法得知这个空间释放。所以即使删除了文件,连接数据库查询相关视图(vrecovery_file_dest视图),空间仍然得不到释放(可以参考vrecovery_file_dest.used字段数据):
SYS AS SYSDBA >SELECT substr(name, 1, 30) name, space_limit AS quota,
2 space_used AS used,
3 space_reclaimable AS reclaimable,
4 number_of_files AS files
5 FROM v$recovery_file_dest ;
NAME QUOTA USED RECLAIMABLE FILES
-------------------------------- ---------- ---------- ----------- ----------
/data5/flash_recovery_area 2147483648 2144863232 0 227
删除归档日志文件,正确的做法应该是使用RMAN登录数据库进行crosscheck,再删除过期的备份,空间才能得到释放。常用的命令如下:
crosscheck archivelog all;
delete expired archivelog all;
这样删除之后空间才能得以释放:
1 SYS AS SYSDBA >SELECT substr(name, 1, 30) name, space_limit AS quota,
2 space_used AS used,
3 space_reclaimable AS reclaimable,
4 number_of_files AS files
5 FROM v$recovery_file_dest ;
NAME QUOTA USED RECLAIMABLE FILES
--------------------------------------- ---------- ---------- ----------- ------
/data5/flash_recovery_area 2147483648 9959424 0 1
按照Oracle的提示,可以通过执行以下命令,将闪回区的内容备份到第三方介质,也同样可以解决这个问题。
backup recovery area;
另外,如果闪回区存储的空间仍然可以扩展,则可以动态修改初始化参数db_recovery_file_dest_size,增加闪回区空间,在设置这个参数时,Oracle并不会实时检查存储的剩余空间,所以在解决紧急故障时,可以先修改这个参数恢复数据库服务再来研究空间释放的问题:
SQL> show parameter recovery
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /msflsh
db_recovery_file_dest_size big integer 50G
SQL> alter system set db_recovery_file_dest_size=65G scope=both;
System altered.
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /msflsh
db_recovery_file_dest_size big integer 65G
经过空间扩展,数据库即可恢复正常。
有了闪回恢复区之后,在执行RMAN备份操作时,如果不指定路径,缺省的备份将存储在闪回区中:
$ rman target /
Recovery Manager: Release 10.2.0.4.0 - Production on Sun Dec 26 13:58:32 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: RAC (DBID=2310943069)
RMAN> backup archivelog all delete input;
Starting backup at 26-DEC-10
current log archived
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=126 instance=rac1 devtype=DISK
channel ORA_DISK_1: starting archive log backupset
channel ORA_DISK_1: specifying archive log(s) in backup set
input archive log thread=2 sequence=65 recid=179 stamp=737848801
input archive log thread=2 sequence=66 recid=183 stamp=738111822
input archive log thread=2 sequence=67 recid=187 stamp=738396024
input archive log thread=2 sequence=68 recid=192 stamp=738757117
input archive log thread=2 sequence=69 recid=193 stamp=738757087
input archive log thread=2 sequence=70 recid=195 stamp=738757432
input archive log thread=2 sequence=71 recid=197 stamp=738757447
input archive log thread=2 sequence=72 recid=199 stamp=738757468
input archive log thread=2 sequence=73 recid=201 stamp=738757532
input archive log thread=2 sequence=74 recid=202 stamp=738770290
channel ORA_DISK_1: starting piece 1 at 26-DEC-10
achannel ORA_DISK_1: finished piece 1 at 26-DEC-10
piece handle=+FSHDG/rac/backupset/2010_12_26/annnf0_tag20101226t135853_0.316.738770341 tag=TAG20101226T135853 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:02:17
channel ORA_DISK_1: deleting archive log(s)
…………
Finished backup at 26-DEC-10




