闪回恢复区 (Flash Recovery Area)
闪回恢复区 (Flash Recovery Area)
分类:
Oracle Advanced Knowledge 2010-08-13 00:24
1420人阅读
评论(0)
收藏
举报
在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://blog.csdn.net/tianlesoftware/archive/2009/10/15/4668991.aspx ? 关于闪回区的备份,参考: ??????????????? RMAN backup recovery area 命令 http://blog.csdn.net/tianlesoftware/archive/2010/08/12/5806756.aspx (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |