Flashback Recovery Area(FRA)相关介绍(一)

时间:2022-10-20 16:22:05

有些时候很多刚入门的朋友把Oracle的闪回特性和闪回恢复区混淆,误以为这俩是同样的东西或者包含关系。其实,他们是完全不同的概念,并不能说他们之间毫无关系,因为10g的FLASHBACK DATABASE开启之后定期将发生变化的数据块前镜像写入到闪回恢复区中的闪回日志中。

那看到下面这张图,大家可能会想到闪回恢复区了吧!
Flashback Recovery Area(FRA)相关介绍(一)

本次重点要说的是闪回恢复区,我会理论结合实验说明,我的环境为Oracle 11g R2 RAC,所以结合ASM做所需实验。至于单实例文件系统环境操作类似,在这里不做操作。

闪回恢复区是什么?闪回恢复区是一个默认放置所有和备份恢复操作相关文件的地方。
Oracle DBA可以使用Automatic Disk-Based Backup and Recovery,让数据库来管理备份存储的区域。

我们在闪回恢复区里能存放什么?可存放的文件很多,比如控制文件和联机重做日志副本、归档日志、闪回日志等等,具体在下面列出。

为启用Automatic Disk-Based Backup and Recovery,必须为闪回恢复区指定足够的容量,此容量大小被作为闪回恢复区的上限,我们还可以指示Oracle保留与备份有关的信息多长时间。有了这些条件,Oracle将会自动管理备份,DBA基本不用操心目录结构和文件命名,而且Oracle会自动删除数据库不需要的文件。因此,DBA所需做的就是为闪回恢复区提供足够的空间并选择保留文件的适当时间,当然还要监控其使用情况。

Oracle的闪回恢复区自动管理,也就是自动删除不想要的文件,是基于Oracle数据库的OMF(Oracle Managed Files)特性,OMF有关键的两个参数DB_CREATE_FILE_DEST  和  DB_CREATE_ONLINE_LOG_DEST_n,它们在闪回恢复区的使用上也起着重要的作用。
关于OMF特性,可能会另写文章。

看一下我的一套RAC的OMF相关几个参数:

SQL> SELECT INSTANCE_NAME, STATUS FROM GV$INSTANCE;

INSTANCE_NAME STATUS
-------------------------------- ------------------------
luocs1 OPEN
luocs2 OPEN

SQL
> SET LINE 150
SQL
> SHOW PARAMETER DB_CREATE

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_create_file_dest
string +SVDATA
db_create_online_log_dest_1
string
db_create_online_log_dest_2
string
db_create_online_log_dest_3
string
db_create_online_log_dest_4
string
db_create_online_log_dest_5
string

-- 从这里可以看出我目前只配置了DB_CREATE_FILE_DEST参数,所以我的数据文件、日志文件、控制文件目前都只在
+SVDATA磁盘组下。


SQL
> SELECT NAME FROM V$DATAFILE
2 UNION ALL
3 SELECT NAME FROM V$CONTROLFILE
4 UNION ALL
5 SELECT MEMBER FROM V$LOGFILE
6 /

NAME
------------------------------------------------------------------------------------
+SVDATA/luocs/datafile/system.259.792420101
+SVDATA/luocs/datafile/sysaux.260.792420153
+SVDATA/luocs/datafile/undotbs1.261.792420195
+SVDATA/luocs/datafile/undotbs2.263.792420225
+SVDATA/luocs/datafile/users.264.792420239
+SVDATA/luocs/controlfile/current.256.792420091
+SVDATA/luocs/onlinelog/group_1.257.792420093
+SVDATA/luocs/onlinelog/group_2.258.792420097
+SVDATA/luocs/onlinelog/group_3.265.792421909
+SVDATA/luocs/onlinelog/group_4.266.792421913

10 rows selected.

闪回恢复区的优点
既然Oracle建议使用闪回恢复区,那它肯定有其优点:

  •  集中存储区的作用;
  • 允许自动管理与恢复有关的磁盘空间;
  • 允许更快地实现备份和恢复操作;
  • 增加了备份的可靠性,因为磁盘是一种比磁带更安全的存储设备。

 
Oracle建议在闪回恢复去至少保留一份最近的备份,而不只保存在磁带中,这样一旦需要恢复,由于可不再恢复磁带备份,恢复操作效率更好。

下面看闪回恢复区所能存放的文件:

  • 数据文件副本,比如数据文件的映像副本(RMAN BACKUP AS COPY获得)或者RMAN的备份片。
  • 增量备份,在有增量备份策略的需求下。
  • 控制文件副本,Oracle建议在闪回恢复区中保存当前控制文件的多路复用副本。
  • 联机重做日志文件副本,Oracle建议在闪回恢复区中保存联机重做日志文件的多路复用副本。
  • 归档日志文件,归档日志文件按照保留备份文件时间规则被Oracle自动管理,废弃的文件会被自动删除(在空间不足的情况下)。
  • 控制文件自动备份,闪回恢复区为RMAN构造的所有控制文件自动备份的默认区域。
  • 闪回日志,FLASHBACK DATABASE特性会生成闪回日志,Oracle将闪回日志存储在闪回恢复区中。如果FLASHBACK DATABASE特性启用,闪回数据库特性将每个改变了块的映像复制到闪回恢复区中的闪回日志。

 
上面的集中文件在闪回恢复区中以两种类型文件存在:永久文件和过渡文件(也有人称为短期性文件)。其中,永久文件包括控制文件副本和联机重做日志文件副本,而过渡文件包括数据文件副本、控制文件镜像、归档日志文件、闪回日志等。这些过渡文件会根据RMAN保留策略被Oracle视为废弃文件,它们在某些条件下会被Oracle自动删除,另外还有一种就是已经复制到磁带后的文件也会被Oracle自动删除。

设置闪回恢复区的大小
DBA对设置闪回恢复区的大小应该慎重以对,如果你无法细算,那就一个原则,要足够大(当然这些要考虑磁盘容量不紧张的状态)。上面已经列出闪回恢复区所存放的文件类别,那么闪回恢复区的大小至少等于这些文件大小总和。

在设置闪回恢复区大小时,数据库的大小是主要的因素。其他影响闪回恢复区大小的因素为:

  • RMAN备份保留策略;
  • 用于备份的存储设备的类型(磁带和磁盘,或者仅是磁盘设备);
  • 数据库中数据库更改的数目。

创建闪回恢复区的方法
我们就开始创建闪回恢复区,有几种方法可以参考:

  • DBCA(Database Creation Assistant)数据库创建时配置闪回恢复区;
  •  配置两个与闪回恢复区相关的动态初始化参数,可在数据库运行时使用两个参数创建闪回恢复区;
  • 使用OEM。

闪回恢复区也有两个关键参数,它们是:

  • DB_RECOVERY_FILE_DEST_SIZE :此参数设置闪回恢复区的上限;
  • DB_RECOVERY_FILE_DEST:此参数指定闪回恢复区的位置。

注意:DB_CREATE_FILE_DEST 、DB_CREATE_ONLINE_LOG_DEST_n和DB_RECOVERY_FILE_DEST强烈不建议指定相同的位置。

创建闪回恢复区操作我们可以通过初始化参数文件,里面添加
DB_RECOVERY_FILE_DEST_SIZE = 5G
DB_RECOVERY_FILE_DEST = '+SVRECOVERY'
这时候数据库并不会立即分配DB_RECOVERY_FILE_DEST_SIZE给闪回恢复区设置的容量,Oracle仅使用这个容量作为闪回恢复区大小的最大限额,这些空间为操作系统所控制。

初始化参数文件设置方法比较麻烦,DBA应该更多采取动态修改方法。
DB_RECOVERY_FILE_DEST_SIZE 和DB_RECOVERY_FILE_DEST两个参数都是动态参数,我们大可以使用ALTER SYSTEM SET方式进行操作:
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 5G;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '+SVRECOVERY';

设置闪回恢复区参数
使用DB_CREATE_FILE_DEST参数来指定所有数据库文件的位置。
使用DB_CREATE_ONLINE_LOG_DEST_n参数来指定所有联机重做日志和控制文件的位置。如果不指定此参数,Oracle将在DB_CREATE_FILE_DEST参数指定的位置创建所有三种类型文件。

我将会做一个这样的例子:
DB_CREATE_FILE_DEST = '+SVDATA'
LOG_ARCHIVE_DEST_1 = 'LOCATION=+SVARCH'
LOG_ARCHIVE_DEST_2 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST'
DB_RECOVERY_FILE_DEST = '+SVRECOVERY'
DB_RECOVERY_FILE_DEST_SIZE = 5G

这些参数说明如下:

  • 在DB_CREATE_FILE_DEST参数指定的位置中创建基于OMF的数据文件、控制文件和联机重做日志文件;
  • 在闪回恢复区中创建当前的控制文件的一个副本;
  • 在闪回恢复区中创建当前联机重做日志文件的一个副本;
  • 在+SVARCH这个位置创建归档日志;
  • 在+SVRECOVERY这个位置创建归档日志。

下面是我创建闪回恢复区的示例:

[root@rac1 ~]# su - oracle
[oracle@rac1 ~]$ sqlplus / as sysdba
SQL
> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/product/11.2.0/dbhome_1/dbs/arch
Oldest online log sequence 43
Current log sequence 44

-- 从上面的信息可以发现,我的这套RAC目前并没有开启归档,也没有创建闪回恢复区。

节点1
[root@rac1 ~]# su - grid
[grid@rac1 ~]$ sqlplus / as sysasm
SQL
> set pagesize 9999
SQL
> set line 150
SQL
> col NAME for a15
SQL
> col FAILGROUP for a30
SQL
> col PATH for a40
SQL
> select name, failgroup, path, disk_number from v$asm_disk;

NAME FAILGROUP PATH DISK_NUMBER
--------------- ------------------------------ ---------------------------------------- -----------
ORCL
:SVARCH 0
ORCL
:SVRECOVERY 1
SVCRS1 SVCRS1 ORCL
:SVCRS1 0
SVCRS2 SVCRS2 ORCL
:SVCRS2 1
SVCRS3 SVCRS3 ORCL
:SVCRS3 2
SVDATA SVDATA ORCL
:SVDATA 0

6 rows selected.

SQL
> select name,type,state,total_mb,free_mb from v$asm_diskgroup;

NAME TYPE STATE TOTAL_MB FREE_MB
--------------- ------------ ---------------------- ---------- ----------
SVCRS NORMAL MOUNTED
3042 2116
SVARCH DISMOUNTED
0 0
SVDATA EXTERN MOUNTED
5962 3691
-- 从上面的信息可以看出,我已经创建好了归档日志存放ASM磁盘组,但却没有创建用于闪回恢复区的ASM磁盘组,
却已经创建了RECOVERY ASM磁盘。

下面我创建用于闪回恢复区的ASM磁盘组
SQL
> create diskgroup SVRECOVERY external redundancy disk 'ORCL:SVRECOVERY';

Diskgroup created.

SQL
> select name,type,state,total_mb,free_mb from v$asm_diskgroup;

NAME TYPE STATE TOTAL_MB FREE_MB
--------------- ------------ ---------------------- ---------- ----------
SVCRS NORMAL MOUNTED
3042 2116
SVARCH DISMOUNTED
0 0
SVDATA EXTERN MOUNTED
5962 3691
SVRECOVERY EXTERN MOUNTED
5581 5531

节点2
SQL
> set pagesize 150
SQL
> set line 150
SQL
> col NAME for a15
SQL
> select name,type,state,total_mb,free_mb from v$asm_diskgroup;

NAME TYPE STATE TOTAL_MB FREE_MB
--------------- ------------ ---------------------- ---------- ----------
SVCRS NORMAL MOUNTED
3042 2116
SVDATA EXTERN MOUNTED
5962 3691
SVARCH DISMOUNTED
0 0
SVRECOVERY DISMOUNTED
0 0

SQL
> ALTER DISKGROUP SVRECOVERY MOUNT;

Diskgroup altered.

SQL
> select name,type,state,total_mb,free_mb from v$asm_diskgroup;

NAME TYPE STATE TOTAL_MB FREE_MB
--------------- ------------ ---------------------- ---------- ----------
SVCRS NORMAL MOUNTED
3042 2116
SVDATA EXTERN MOUNTED
5962 3691
SVARCH DISMOUNTED
0 0
SVRECOVERY EXTERN MOUNTED
5581 5468

DB_CREATE_FILE_DEST
参数在DBCA建库的时候已经设置,不做改动。
SQL
> SHOW PARAMETER DB_CREATE_FILE_DEST

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_create_file_dest
string +SVDATA

设置闪回恢复区相关两个参数:
SQL
> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 5G;

System altered.

SQL
> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '+SVRECOVERY';

System altered.


SQL
> col NAME for a20
SQL
> SELECT * FROM V$RECOVERY_FILE_DEST;

NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ----------- ---------- ----------------- ---------------
+SVRECOVERY 5368709120 0 0 0
-- 查看闪回恢复区的当前位置、磁盘限额、在用空间、可删除文件回收的空间和总的文件数目

SQL
> SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
---------------------------------------- ------------------ ------------------------- ---------------
CONTROL FILE
0 0 0
REDO LOG
0 0 0
ARCHIVED LOG
0 0 0
BACKUP PIECE
0 0 0
IMAGE COPY
0 0 0
FLASHBACK LOG
0 0 0
FOREIGN ARCHIVED LOG
0 0 0

7 rows selected.

-- 查看不同类型文件的使用空间,以及对于某种文类型的文件

SQL
> col NAME for a50
SQL
> SELECT NAME, IS_RECOVERY_DEST_FILE FROM V$CONTROLFILE;

NAME IS_REC
-------------------------------------------------- ------
+SVDATA/bbk/controlfile/current.256.792420091 NO

SQL
> COL MEMBER FOR A50
SQL
> SELECT MEMBER, IS_RECOVERY_DEST_FILE FROM V$LOGFILE;

MEMBER IS_REC
-------------------------------------------------- ------
+SVDATA/bbk/onlinelog/group_1.257.792420093 NO
+SVDATA/bbk/onlinelog/group_2.258.792420097 NO
+SVDATA/bbk/onlinelog/group_3.265.792421909 NO
+SVDATA/bbk/onlinelog/group_4.266.792421913 NO

SQL
> SELECT NAME, IS_RECOVERY_DEST_FILE FROM V$ARCHIVED_LOG;

no rows selected

SQL
> SELECT NAME, IS_RECOVERY_DEST_FILE FROM V$DATAFILE_COPY;

no rows selected

SQL
> SELECT PIECE#, IS_RECOVERY_DEST_FILE FROM V$BACKUP_PIECE;

no rows selected

-- 从上面几个视图中可以看出目前闪回恢复区中没有任何文件。


RMAN
配置中我们开启自动备份控制文件:
RMAN
> CONFIGURE CONTROLFILE AUTOBACKUP ON;

new RMAN configuration parameters:
CONFIGURE CONTROLFILE AUTOBACKUP ON
;
new RMAN configuration parameters are successfully stored

备份一个参数文件:
RMAN
> BACKUP SPFILE TAG='BackupSpfile';

Starting backup at 30-OCT-2012 10:24:42
allocated channel
: ORA_DISK_1
channel ORA_DISK_1
: SID=45 instance=bbk1 device type=DISK
channel ORA_DISK_1
: starting full datafile backup set
channel ORA_DISK_1
: specifying datafile(s) in backup set
including current SPFILE
in backup set
channel ORA_DISK_1
: starting piece 1 at 30-OCT-2012 10:24:43
channel ORA_DISK_1
: finished piece 1 at 30-OCT-2012 10:24:44
piece handle
=+SVRECOVERY/bbk/backupset/2012_10_30/nnsnf0_backupspfile_0.256.798027883 tag=BACKUPSPFILE comment=NONE
channel ORA_DISK_1
: backup set complete, elapsed time: 00:00:01
Finished backup at 30-OCT-2012 10:24:44

Starting Control File and SPFILE Autobackup at 30-OCT-2012 10:24:44
piece handle
=+SVRECOVERY/luocs/autobackup/2012_10_30/s_798027884.257.798027887 comment=NONE
Finished Control File and SPFILE Autobackup at 30-OCT-2012 10:24:47


SQL
> SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
---------------------------------------- ------------------ ------------------------- ---------------
CONTROL FILE
0 0 0
REDO LOG
0 0 0
ARCHIVED LOG
0 0 0
BACKUP PIECE
.37 .02 2
IMAGE COPY
0 0 0
FLASHBACK LOG
0 0 0
FOREIGN ARCHIVED LOG
0 0 0

7 rows selected.
-- 这时候发现备份片已经有所变化。

好,下面我们让数据库运行于归档模式:
首先,我不指定单独的归档目录+SVARCH,数据库重启到mount模式
[grid@rac1 ~]$ srvctl stop database -d luocs
[grid@rac1 ~]$ srvctl start database -d luocs -o mount

节点1
[oracle@rac1 ~]$ sqlplus / as sysdba
SQL
> alter database archivelog;

Database altered.

SQL
> alter database open;

Database altered.

节点2
[root@rac2 ~]# su - oracle
[oracle@rac2 ~]$ sqlplus / as sysdba
SQL
> alter database open;

Database altered.

SQL
> ARCHIVE LOG LIST
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 9
Next log sequence to archive 10
Current log sequence 10

-- 可以看出开启归档之后归档日志默认存放目标位置为闪回恢复区了。

USE_DB_RECOVERY_FILE_DEST被哪个参数指定了呢?10g中,LOG_ARCHIVE_DEST_10参数被隐含地设置为闪回恢复区,而11g中有点变化
我从告警日志里发现被指定到LOG_ARCHIVE_DEST_1
Using LOG_ARCHIVE_DEST_1 parameter default value as USE_DB_RECOVERY_FILE_DEST

然后我指定单独的归档目录+SVARCH
SQL
> ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=+SVARCH';

System altered.

SQL
> ARCHIVE LOG LIST
Database log mode Archive Mode
Automatic archival Enabled
Archive destination +SVARCH
Oldest online log sequence 43
Next log sequence to archive 44
Current log sequence 44

SQL
> COL NAME FOR A80
SQL
> SELECT NAME, IS_RECOVERY_DEST_FILE FROM V$ARCHIVED_LOG;

NAME IS_REC
-------------------------------------------------------------------------------- ------
+SVARCH/bbk/archivelog/2012_10_30/thread_1_seq_44.256.798031261 NO
+SVARCH/bbk/archivelog/2012_10_30/thread_1_seq_45.257.798031265 NO
+SVARCH/bbk/archivelog/2012_10_30/thread_2_seq_10.258.798031265 NO
+SVARCH/bbk/archivelog/2012_10_30/thread_2_seq_11.259.798031271 NO

大家看到这里,可能误以为闪回恢复区被禁用了,其实不是(上面只是归档日志文件不放在闪回恢复区了),通过下
面的方式验证:
RMAN
> BACKUP AS COPY DATAFILE 5;

Starting backup at 30-OCT-2012 11:27:27
using target database control file instead of recovery catalog
allocated channel
: ORA_DISK_1
channel ORA_DISK_1
: SID=55 instance=bbk1 device type=DISK
channel ORA_DISK_1
: starting datafile copy
input datafile file number
=00005 name=+SVDATA/bbk/datafile/users.264.792420239
output file name
=+SVRECOVERY/bbk/datafile/users.258.798031649 tag=TAG20121030T112728 RECID=1 STAMP=798031649
channel ORA_DISK_1
: datafile copy complete, elapsed time: 00:00:01
Finished backup at 30-OCT-2012 11:27:30

Starting Control File and SPFILE Autobackup at 30-OCT-2012 11:27:30
piece handle
=+SVRECOVERY/bbk/autobackup/2012_10_30/s_798031650.259.798031651 comment=NONE
Finished Control File and SPFILE Autobackup at 30-OCT-2012 11:27:33

SQL
> SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
---------------------------------------- ------------------ ------------------------- ---------------
CONTROL FILE
0 0 0
REDO LOG
0 0 0
ARCHIVED LOG
0 0 0
BACKUP PIECE
.72 .37 3
IMAGE COPY
.12 0 1
FLASHBACK LOG
0 0 0
FOREIGN ARCHIVED LOG
0 0 0

7 rows selected.

OK
,我们重新让归档日志文件放进闪回恢复区,指定log_archive_dest_2参数:
SQL
> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST';

System altered.

SQL
> ALTER SYSTEM SWITCH LOGFILE;

System altered.

SQL
> SELECT NAME, IS_RECOVERY_DEST_FILE FROM V$ARCHIVED_LOG;

NAME IS_REC
-------------------------------------------------------------------------------- ------
+SVARCH/bbk/archivelog/2012_10_30/thread_1_seq_44.256.798031261 NO
+SVARCH/bbk/archivelog/2012_10_30/thread_1_seq_45.257.798031265 NO
+SVARCH/bbk/archivelog/2012_10_30/thread_2_seq_10.258.798031265 NO
+SVARCH/bbk/archivelog/2012_10_30/thread_2_seq_11.259.798031271 NO
+SVARCH/bbk/archivelog/2012_10_30/thread_1_seq_48.264.798032041 NO
+SVRECOVERY/bbk/archivelog/2012_10_30/thread_1_seq_48.260.798032039 YES

上面用到了几个和闪回恢复区相关的视图,这里介绍下:
v$RECOVERY_FILE_DEST视图
查找闪回恢复区管理信息,可查看闪回恢复区的当前位置、磁盘限额、在用空间、可删除文件回收的空间和总的文件数目:
SELECT * FROM V$RECOVERY_FILE_DEST;

– SPACE_LIMIT列包含分配的闪回恢复区容量。
– SPACE_RECLAIMABLE列包含可通过废弃闪回恢复区中过时和冗余文件回收的容量。

v$FLASH_RECOVERY_AREA_USAGE,查看不同类型文件的使用空间,以及对于某种文类型的文件
SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;

V$LOGFILE , V$CONTROLFILE, V$ARCHIED_LOG, V$DATAFILE_COPY, V$BACKUP_PIECE等视图都有IS_RECOVERY_DEST_FILE列,如果值为YES表示文件在闪回恢复区中,NO表示不在。

禁用当前闪回恢复区方法也很简单,将DB_RECOVERY_FILE_DEST设置为空格('')即可,这样将清除闪回恢复区文件的目标位置。
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST= '';

使用闪回恢复区
Oracle的闪回恢复区自动文件删除策略汇总:

  • 参数文件、多路复用重做日志文件和控制文件永久不删除;
  • 在配置的保留策略下过时的文件复合删除条件;
  • 已经复制到磁带的过渡文件也符合删除条件。

即使一个文件符合删除条件,Oracle也只在闪回恢复区满时才删除它。

这里提到保留策略,文件在闪回恢复区中保留的时间长度是由RMAN的保留策略决定的,RMAN通过RMAN CONFIGURE RETENTION POLICY命令规定保留备份的天数。超过RMAN保留策略或废弃的文件将从闪回恢复区中删除。

在Data Guard环境中,当已归档的重建日志文件可以从闪回恢复区中删除的时候,可以应用归档的重建日志删除策略来进行自动删除(在恢复管理器中CONFIGURE ARCHIVELOG DELETION POLICY TO...)


如果闪回恢复区满了,而且不能删除任何文件,将会出现一个85%满的警告(warning),或者出现一个97%满的严重警告。
如果出现这种情况,Oracle将在告警日志文件和DBA_OUTSTANDING_ALERTS视图中增加条目。但是Oracle将继续在闪回恢复区中放置与恢复有关的文件,直到100%地满闪回恢复区位置,这时候它发出一个错误,提示闪回恢复区已满。

在闪回恢复区填满时,数据库发布下面的错误:
ORA-19815: WARNING: db_recovery_file_dest_size of xxxxxxxx bytes is 100.00% used, and has 0 remaining bytes available.
************************************************************************
You have following choices to free up space from flash recovery area:
1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
   then consider changing RMAN ARCHIVELOG DELETION POLICY.
2. Back up files to tertiary device such as tape using RMAN
   BACKUP RECOVERY AREA command.
3. Add disk space and increase db_recovery_file_dest_size parameter to
   reflect the new space.
4. Delete unnecessary files using RMAN DELETE command. If an operating
   system command was used to delete files, then use RMAN CROSSCHECK and
   DELETE EXPIRED commands.
************************************************************************

下面两个ORA错误是闪回恢复区容量用完时候常看到的:
ORA-19809: limit exceeded for recovery files 
– 表示DB_RECOVERY_FILE_DEST_SIZE参数设置的限额出超。
ORA-19804: cannot reclaim xxxxxxx bytes disk space from yyyyyyyy limit
– 表示Oracle不能利用DB_RECOVERY_FILE_DEST_SIZE设置的限额回收指定的字节量。

在归档日志存放于闪回恢复区的情况可能会看到下面ORA错误:
ORA-00257: archiver error. Connect internal only, until freed
表示归档日志目录已满,用户不能再连接到数据库。这时候,已连接的用户可以继续查询数据库,但因为Oracle无法归档,也就无法执行DML语句。如果DBA很快把归档日志目录中某些文件移动到其他位置,数据库就可以恢复正常的操作。这个问题在日常管理中DBA所要关注的重点之一。
另外,强烈建议归档日志文件移动到其他地方,而不是rm -rf。

如果以上情况发生,可采取如下措施:

  • 考虑改变备份和归档日志保留的策略;
  • 增加DB_RECOVERY_FILE_DEST_SIZE大小;
  • 用RMAN的BACKUP RECOVERY AREA命令备份闪回恢复区的内容到磁带设备;
  • 用RMAN删除不必要的备份文件,使用CROSSCHECK和DELETE EXPIRED命令。

 
如果想删除闪回恢复区,可使用DB_RECOVERY_FILE_DEST初始化参数:

为闪回恢复区指定新的位置:
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST= '+SVNEWFRA'


--本篇文章转自:http://www.luocs.com/archives/299.html ,并做了一丁点的改动。黄色阴影部分是从另一篇文章转的。