【基础】ORACLE flashback 闪回恢复区 详解实战

2023-12-18 4:25:45网络知识悟空

从Oracle 10g开始,Oracle数据库中引入了一个闪回恢复区(Flash
Recovery Area)的概念,所谓闪回区是指用于存储和恢复相关的一系列备份文件的磁盘空间。通过这个闪回区,Oracle可以简化用户的备份行为和备份管理,进一步地,Oracle可以对备份的文件执行大量的自动维护工作。

闪回恢复区可以指定为文件系统上的一个目录,也可以是一个ASM磁盘组,闪回区的大小由

db_recovery_file_dest_size 参数指定,路径由 db_recovery_file_dest 参数指定:

 

 show
parameter db_recover

这两个参数都是动态参数,可以动态进行修改。

 

以下几类主要文件可以在闪回区中存放:

★ 控制文件;

★ 归档的日志文件;

★ 闪回日志;

★ 控制文件和SPFILE自动备份;

★ RMAN备份集;

★ 数据文件拷贝。

 

设置归档日志存放在闪回区,可以使用如下命令:

 alter system set log_archive_dest_1 =
‘LOCATION=USE_DB_RECOVERY_FILE_DEST’;

 archive log list;

 

注意log_archive_dest_1与log_archive_dest和 log_archive_duplex_dest 参数不兼容,如果设置了log_archive_dest参数,需要先将其清空:

 

 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

 

 show
parameter log_archive_dest

 

 alter system set log_archive_dest=”;

 alter system set log_archive_dest_1 =
‘LOCATION=USE_DB_RECOVERY_FILE_DEST’;

 

 

闪回区的一个优势是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.

*************************************************************

 

很多朋友习惯通过手工清除文件的方式释放空间,但是数据库无法得知这个空间释放。所以即使删除了文件,连接数据库查询相关视图(v$recovery_file_dest 视图),空间仍然得不到释放(可以参考v$recovery_file_dest.used
字段数据):

 

SELECT substr(name, 1, 30) name,

      
space_limit AS quota,

      
space_used AS used,

      
space_reclaimable AS reclaimable,

      
number_of_files AS files_no

 
FROM v$recovery_file_dest;

删除归档日志文件,正确的做法应该是使用RMAN登录数据库进行crosscheck,再删除过期的备份,空间才能得到释放。常用的命令如下:

crosscheck archivelog all;

delete expired archivelog all;

另外,如果闪回区存储的空间仍然可以扩展,则可以动态修改初始化参数
db_recovery_file_dest_size,增加闪回区空间,在设置这个参数时,Oracle并不会实时检查存储的剩余空间,所以在解决紧急故障时,可以先修改这个参数恢复数据库服务再来研究空间释放的问题:

 alter system set
db_recovery_file_dest_size=65G scope=both;

有了闪回恢复区之后,在执行RMAN备份操作时,如果不指定路径,缺省的备份将存储在闪回区中;

发表评论: