在oracle 9i中引入flashback查询,以便能在需要的时候查到过去某个时刻的一致性数据,依赖于undo表空间存储的信息来闪回查询以前的版本,当然这个受限于undo表空间的大小,以及保留策略。如果undo被覆盖了就不能进行查询。
oracle10g中增强了闪回查询的功能,并且提供了将整个数据库回退到过去某个时刻的能力,这是通过引入一种新的flashback log实现的。flashback log有点类似redo log,只不过redo log将数据库往前滚,flashback log则将数据库往后滚。为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫做闪回恢复区(Flashback recovery area),这个区域默认创建在oracle_base目录下。可以将所有恢复相关的文件,比如flashback log,archive log,backup set等,放到这个区域集中管理。
测试环境
SQL> select * from v$version;
BANNER
-----------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE11.2.0.1.0Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 – Production
1.设置闪回恢复区
闪回恢复区主要通过3个初始化参数来设置和管理
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。当然,实际上可回退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的flash log。所以这个参数要和db_recovery_file_dest_size配合修改。
SQL> ALTER SYSTEM SET db_recovery_file_dest_size=3g SCOPE=BOTH;
System altered.
SQL> ALTER SYSTEM SET db_recovery_file_dest='D:/app/Administrator/flash_recovery_area' SCOPE=BOTH;
System altered.
SQL> show parameter db_recovery_file_dest
NAMETYPEVALUE
-----------------------------------------------------------------------------
db_recovery_file_deststringD:/app/Administrator/flash_recovery_area
db_recovery_file_dest_sizebig integer3852M
SQL> show parameter db_flashback
NAMETYPEVALUE
-----------------------------------------------------------------------------
db_flashback_retention_targetinteger1440
2.启动flashback database
默认情况数据库的flashback database是关闭,可以在mount exclusive状态下打开。在设置了闪回恢复区后,可以启动闪回数据库功能。
SQL> archive log list;--数据库必须已经处于归档模式
数据库日志模式存档模式
自动存档启用
存档终点d:/archivelog
最早的联机日志序列60
下一个存档日志序列62
当前日志序列62
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup mount;
ORACLE例程已经启动。
Total System Global Area849530880 bytes
Fixed Size1377896 bytes
Variable Size637536664 bytes
Database Buffers205520896 bytes
Redo Buffers5095424 bytes
数据库装载完毕。
SQL> alter database flashback on;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
3.取消闪回恢复区
将db_recovery_file_dest参数设置为空,可以停用闪回恢复区。如果已经启用flashback database,则不能取消闪回恢复区。
SQL> alter system set db_recovery_file_dest='';
alter system set db_recovery_file_dest=''
*
第1行出现错误:
ORA-02097:无法修改参数,因为指定的值无效
ORA-38775:无法禁用恢复区-闪回数据库已启用
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup mount;
ORACLE例程已经启动。
Total System Global Area849530880 bytes
Fixed Size1377896 bytes
Variable Size637536664 bytes
Database Buffers205520896 bytes
Redo Buffers5095424 bytes
数据库装载完毕。
SQL> alter database flashback off;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> alter system set db_recovery_file_dest='';
系统已更改。
SQL> show parameter db_recovery_file_dest
NAMETYPEVALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_deststring
db_recovery_file_dest_sizebig integer 3852M
SQL>
注意:
(1)DB_RECOVERY_FILE_DEST_SIZE只有在DB_RECOVERY_FILE_DEST清空之后才可以清空。
(2)初始化参数db_recovery_file_dest_size的设定有一点点需要注意的地方:
文件的第0块和操作系统数据块头的空间大小不包含在内,该参数并不代表实际占用的空间大小。如果空间被压缩、镜像、RAID的话,该参数的值意义是不一样的
4.闪回恢复区的内容
所有和恢复相关的文件都可以存放到闪回恢复区
SQL> select file_type from v$flash_recovery_area_usage;
FILE_TYPE
--------------------
CONTROL FILE
REDO LOG
ARCHIVED LOG
BACKUP PIECE
IMAGE COPY
FLASHBACK LOG
FOREIGN ARCHIVED LOG
已选择7行。
上面视图中查询的结果列出的所有类型的文件,都可以利用闪回恢复区来存放、管理。
在一些10g的动态视图里( V$CONTROLFILE, V$LOGFILE, V$ARCHIVED_LOG, V$DATAFILE_COPY等)的新的列IS_RECOVERY_DEST_FILE ,指明相关的文件是否在恢复区内。
/* Formatted on 2010/8/13 0:04:22 (QP5 v5.115.810.9015) */
SELECTrecid,blocks,is_recovery_dest_file
FROMv$archived_log
WHERErecid<5;
RECIDBLOCKS IS_
---------- ---------- ---
114141 NO
252 NO
37 NO
4138 NO
SQL>
5 .闪回恢复区的一些限制
如果设置了闪回恢复区,则log_archive_dest和log_archive_duplex_dest将不可用。
SQL> alter system set log_archive_dest='e:/' ;
alter system set log_archive_dest='e:/'
*
第1行出现错误:
ORA-02097:无法修改参数,因为指定的值无效
ORA-16018:无法将LOG_ARCHIVE_DEST与LOG_ARCHIVE_DEST_n或
DB_RECOVERY_FILE_DEST一起使用
SQL> alter system set log_archive_duplex_dest='e:/';
alter system set log_archive_duplex_dest='e:/'
*
第1行出现错误:
ORA-02097:无法修改参数,因为指定的值无效
ORA-16018:无法将LOG_ARCHIVE_DUPLEX_DEST与LOG_ARCHIVE_DEST_n或
DB_RECOVERY_FILE_DEST一起使用
说明:
设置闪回恢复区后,如果没有设置过log_archive_dest_n参数,则归档日志默认是保存到该区域的。实际上,oracle是通过隐式的设置log_archive_dest_10='location=USE_DB_RECOVERY_FILE_DEST'来实现的。所以,如果修改过log_archive_dest_n将归档日志保存到其他位置,也可以修改该参数继续使用闪回恢复区。
多个数据库的闪回恢复区可以指定到同一个位置,但是db_name不能一样,或者db_unique_name不一样。RAC的闪回恢复区必须位于共享磁盘上,能被所有实例访问。
6.闪回恢复区的空间管理
闪回恢复区中添加或删除文件等变化都将记录在数据库的alert日志中,Oracle 10g也针对该新特性提供了一个新的视图,DBA_OUTSTANDING_ALERTS,通过该视图可以得到相关的信息。
SQL>DESC dba_outstanding_alerts
名称是否为空?类型
----------------------------------------- -------- ----------------------------
SEQUENCE_IDNUMBER
REASON_IDNOT NULL NUMBER
OWNERVARCHAR2(30)
OBJECT_NAMEVARCHAR2(513)
SUBOBJECT_NAMEVARCHAR2(30)
OBJECT_TYPEVARCHAR2(64)
REASONVARCHAR2(4000)
TIME_SUGGESTEDTIMESTAMP(6) WITH TIME ZONE
CREATION_TIMETIMESTAMP(6) WITH TIME ZONE
SUGGESTED_ACTIONVARCHAR2(4000)
ADVISOR_NAMEVARCHAR2(30)
METRIC_VALUENUMBER
MESSAGE_TYPEVARCHAR2(12)
MESSAGE_GROUPVARCHAR2(64)
MESSAGE_LEVELNUMBER
HOSTING_CLIENT_IDVARCHAR2(64)
MODULE_IDVARCHAR2(64)
PROCESS_IDVARCHAR2(128)
HOST_IDVARCHAR2(256)
HOST_NW_ADDRVARCHAR2(256)
INSTANCE_NAMEVARCHAR2(16)
INSTANCE_NUMBERNUMBER
USER_IDVARCHAR2(30)
EXECUTION_CONTEXT_IDVARCHAR2(128)
ERROR_INSTANCE_IDVARCHAR2(142)
在闪回恢复区中的空间使用超过85%的时候,数据库将会向alert文件中写入告警信息。而当超过97%的时候将会写入严重告警信息。当闪回恢复区空间不够的时候,Oracle将报告如下类似的错误:
ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 52428800 bytes disk space from 1258291200 limit
这个时候查询dba_outstanding_alerts:
SQL> select reason,object_type,suggested_action from dba_outstanding_alerts;
REASONOBJECT_TYPESUGGESTED_ACTION
------------------------------ -------------------- ----------------------------------------
db_recovery_file_dest_size ofRECOVERY AREAAdd disk space and increase db_recovery_
1258291200 bytes is 88.20% usefile_dest_size, backup files to tertiary
d and has 148509184 remainingdevice, delete files from recovery area
bytes available.using RMAN, consider changing RMAN rete
ntion policy or consider changing RMAN a
rchivelog deletion policy.
同时,oracle在alert中还会给出解决该问题的建议
************************************************************************
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 RMANB ACKUP 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.
************************************************************************
V$RECOVERY_FILE_DEST视图包含闪回恢复区的相关信息:
SQL> desc V$RECOVERY_FILE_DEST
名称是否为空?类型
----------------------------------------- -------- ---------------------
NAMEVARCHAR2(513)
SPACE_LIMITNUMBER
SPACE_USEDNUMBER
SPACE_RECLAIMABLENUMBER
NUMBER_OF_FILESNUMBER
SQL> select * from v$recovery_file_dest;
NAMESPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
---------- ----------- ---------- ----------------- ---------------
4039114752000
通过查询视图v$flash_recovery_area_usage,可以获得当前闪回恢复区的空间使用情况,并且可以知道是哪些文件占中了空间,据此可以做出相应的处理,或者加大闪回恢复区,或者移走相应的文件。
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPEPERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
CONTROL FILE00
REDO LOG00
ARCHIVED LOG00
BACKUP PIECE00
IMAGE COPY00
FLASHBACK LOG00
FOREIGN ARCHIVED LOG00
如果闪回恢复区空间耗尽,且归档路径设置到了闪回恢复区中,则由于日志无法归档,数据库会hang住。所以,对于生产库,如果将归档放到闪回恢复区中,需要密切关注闪回恢复区的空间使用情况,否则一旦闪回恢复区的空间用尽,将导致数据库无法提供服务。
Flash Recovery Area空间不足导致数据库不能打开或hang住
http://blog.youkuaiyun.com/xujinyang/article/details/6830475
关于闪回区的备份,参考:
RMAN backup recovery area命令
http://blog.youkuaiyun.com/xujinyang/article/details/6837401
整理自网络
------------------------------------------------------------------------------