闪回恢复区 (Flash Recovery Area)
在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 CORE????11.2.0.1.0??????Production TNS for 32-bit Windows: Version 11.2.0.1.0 - Production NLSRTL Version 11.2.0.1.0 – Production ?
db_recovery_file_dest:指定闪回恢复区的位置 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 NAME?????????????????????????TYPE????????VALUE ------------------------------------???????????????????????????????-----------????????????????????????????????------------------------------ db_recovery_file_dest?????????????????????????????????????string????????????????????D:/app/Administrator/flash_recovery_area db_recovery_file_dest_size??????big integer?????????3852M SQL> show parameter db_flashback NAME????????????????????????TYPE????????VALUE ------------------------------------???????????????????????????????-----------????????????????????????????????------------------------------ db_flashback_retention_target???integer??????1440 ? ? ? 2.?启动flashback database 默认情况数据库的flashback database是关闭,可以在mount exclusive状态下打开。在设置了闪回恢复区后,可以启动闪回数据库功能。
数据库日志模式????????????存档模式 自动存档?????????????启用 存档终点????????????d:/archivelog 最早的联机日志序列?????60 下一个存档日志序列???62 当前日志序列???????????62 SQL> shutdown immediate; 数据库已经关闭。 已经卸载数据库。 ORACLE?例程已经关闭。 SQL> startup mount; ORACLE?例程已经启动。 Total System Global Area??849530880 bytes Fixed Size??????????????????1377896 bytes Variable Size?????????????637536664 bytes Database Buffers??????????205520896 bytes Redo Buffers????????????????5095424 bytes 数据库装载完毕。 SQL> alter database flashback on; 数据库已更改。 SQL> alter database open; 数据库已更改。 SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ YES ? ? 3.?取消闪回恢复区 ? 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 Area??849530880 bytes Fixed Size??????????????????1377896 bytes Variable Size?????????????637536664 bytes Database Buffers??????????205520896 bytes Redo Buffers????????????????5095424 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 NAME?????????????????????????????????TYPE????????VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest????????????????string db_recovery_file_dest_size???????????big integer 3852M SQL> ? ? 注意: (1)DB_RECOVERY_FILE_DEST_SIZE?只有在?DB_RECOVERY_FILE_DEST?清空之后才可以清空。 (2)初始化参数?db_recovery_file_dest_size?的设定有一点点需要注意的地方: 文件的第0块和操作系统数据块头的空间大小不包含在内,该参数并不代表实际占用的空间大小。如果空间被压缩、镜像、RAID?的话,该参数的值意义是不一样的 ? ? 4.?闪回恢复区的内容 ? 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) */ SELECT???recid,?blocks,?is_recovery_dest_file ??FROM???v$archived_log ?WHERE???recid?<?5; ?????RECID?????BLOCKS IS_ ---------- ---------- --- ?????????1??????14141 NO ?????????2?????????52 NO ?????????3??????????7 NO ?????????4????????138 NO SQL> ?
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_ID????????????????????????????????????????NUMBER ?REASON_ID?????????????????????????????????NOT NULL NUMBER ?OWNER??????????????????????????????????????????????VARCHAR2(30) ?OBJECT_NAME????????????????????????????????????????VARCHAR2(513) ?SUBOBJECT_NAME?????????????????????????????????????VARCHAR2(30) ?OBJECT_TYPE????????????????????????????????????????VARCHAR2(64) ?REASON?????????????????????????????????????????????VARCHAR2(4000) ?TIME_SUGGESTED?????????????????????????????????????TIMESTAMP(6) WITH TIME ZONE ?CREATION_TIME??????????????????????????????????????TIMESTAMP(6) WITH TIME ZONE ?SUGGESTED_ACTION???????????????????????????????????VARCHAR2(4000) ?ADVISOR_NAME???????????????????????????????????????VARCHAR2(30) ?METRIC_VALUE???????????????????????????????????????NUMBER ?MESSAGE_TYPE???????????????????????????????????????VARCHAR2(12) ?MESSAGE_GROUP??????????????????????????????????????VARCHAR2(64) ?MESSAGE_LEVEL??????????????????????????????????????NUMBER ?HOSTING_CLIENT_ID??????????????????????????????????VARCHAR2(64) ?MODULE_ID??????????????????????????????????????????VARCHAR2(64) ?PROCESS_ID?????????????????????????????????????????VARCHAR2(128) ?HOST_ID????????????????????????????????????????????VARCHAR2(256) ?HOST_NW_ADDR???????????????????????????????????????VARCHAR2(256) ?INSTANCE_NAME??????????????????????????????????????VARCHAR2(16) ?INSTANCE_NUMBER????????????????????????????????????NUMBER ?USER_ID????????????????????????????????????????????VARCHAR2(30) ?EXECUTION_CONTEXT_ID???????????????????????????????VARCHAR2(128) ?ERROR_INSTANCE_ID??????????????????????????????????VARCHAR2(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; ? REASON?????????????????????????OBJECT_TYPE??????????SUGGESTED_ACTION ------------------------------ -------------------- ---------------------------------------- db_recovery_file_dest_size of??RECOVERY AREA????????Add disk space and increase db_recovery_ 1258291200 bytes is 88.20% use??????????????????????file_dest_size,backup files to tertiary d and has 148509184 remaining????????????????????????device,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中还会给出解决该问题的建议 ? ? V$RECOVERY_FILE_DEST视图?包含闪回恢复区的相关信息: SQL> desc V$RECOVERY_FILE_DEST ?名称??????????????????????????????????????是否为空??类型 ?----------------------------------------- -------- --------------------- ? ?NAME???????????????????????????????????????????????VARCHAR2(513) ?SPACE_LIMIT????????????????????????????????????????NUMBER ?SPACE_USED?????????????????????????????????????????NUMBER ?SPACE_RECLAIMABLE??????????????????????????????????NUMBER ?NUMBER_OF_FILES????????????????????????????????????NUMBER ? SQL> select * from v$recovery_file_dest; ---------- ----------- ---------- ----------------- --------------- ????4039114752??????????0?????????????????0???????????????0 ? ? ? 通过查询视图v$flash_recovery_area_usage,可以获得当前闪回恢复区的空间使用情况,并且可以知道是哪些文件占中了空间,据此可以做出相应的处理,或者加大闪回恢复区,或者移走相应的文件。
-------------------- ------------------ ------------------------- CONTROL FILE??????????????????????????0?????????????????????????0 REDO LOG??????????????????????????????0?????????????????????????0 ARCHIVED LOG??????????????????????????0?????????????????????????0 BACKUP PIECE??????????????????????????0?????????????????????????0 IMAGE COPY????????????????????????????0?????????????????????????0 FLASHBACK LOG?????????????????????????0?????????????????????????0 FOREIGN ARCHIVED LOG??????????????????0?????????????????????????0 ? 如果闪回恢复区空间耗尽,且归档路径设置到了闪回恢复区中,则由于日志无法归档,数据库会hang住。所以,对于生产库,如果将归档放到闪回恢复区中,需要密切关注闪回恢复区的空间使用情况,否则一旦闪回恢复区的空间用尽,将导致数据库无法提供服务。 ? Flash Recovery Area空间不足导致数据库不能打开或hang住 http://www.voidcn.com/article/p-yeukzavq-rb.html ? 关于闪回区的备份,参考: RMAN backup recovery area?命令 http://www.voidcn.com/article/p-grcilxof-rb.html ? ? ? ? ? 整理自网络 ------------------------------------------------------------------------------ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |