Oracle9i开始提供闪回查询,以便能在须要的时候查到过去某个时刻的一致性数据,这是经过Undo实现的。这个功能有很大的限制,就是相关事务的undo不能被覆盖,不然就无力回天了。oracle10g大大的加强了闪回查询的功能,而且提供了将整个数据库回退到过去某个时刻的能力,这是经过引入一种新的flashback log实现的。flashback log有点相似redo log,只不过redo log将数据库往前滚,flashback log则将数据库日后滚。为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫作闪回恢复区(Flashback recovery area)的新特性,能够将全部恢复相关的文件,好比flashback log,archive log,backup set等,放到这个区域集中管理。
1.设置闪回恢复区
闪回恢复区主要经过3个初始化参数来设置和管理
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库能够回退的时间,单位为分钟,默认1440分钟,也就是一天。固然,实际上可回退的时间还决定于闪回恢复区的大小,由于里面保存了回退所须要的 flash log。因此这个参数要和db_recovery_file_dest_size配合修改。
2.启动flashback database
设置了闪回恢复区后,能够启动闪回数据库功能。
首先,数据库必须已经处于归档模式
那么如何设置归档呢?很简单的步骤
1.关闭数据库
SQL> shutdown immediate;
2.启动数据库为mount模式
SQL> startup mount
3.显示和修改归档模式
SQL> archive log list
SQL> alter database archivelog;
SQL> alter database open
4.设置归档日志的格式
SQL>alter system set log_archive_format='ARC%s%t%r.log' scope=spfile;
5.设置归档日志的存放路径
SQL>alter system set log_archive_dest='+data/arcl' scope=spfile;
SQL>shutdown immediate
SQL>startup
6.强制切换归档日至
SQL>alter system switch logfile;
7.取消归档
SQL>alter database noarchivelog;
参数
1.格式参数
%s 日志序列号
%S 日志序列号(带前导的0)
%t 重作线程编号
%a 活动的ID号
%d 数据库ID号
%r RESELOGS的iD值
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 156
Next log sequence to archive 158
Current log sequence 158
而后,启动数据库到mount状态
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 75499088 bytes
Database Buffers 205520896 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL>alter database flashback on;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL>selectFLASHBACK_ONfrom 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: 没法禁用快速恢复区 - 闪回数据库已启用
因此,必须先禁用flashback database,才能取消闪回恢复区
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 142606336 bytes
Fixed Size 1247732 bytes
Variable Size 83887628 bytes
Database Buffers 50331648 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL>alter database flashback off;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> alter system set db_recovery_file_dest='';
系统已更改。
4.闪回恢复区的内容
全部和恢复相关的文件均可以存放到闪回恢复区
SQL>select file_type from v$flash_recovery_area_usage;
FILE_TYPE
------------------------
CONTROLFILE
ONLINELOG
ARCHIVELOG
BACKUPPIECE
IMAGECOPY
FLASHBACKLOG
已选择6行。
上面的视图中能够看出,包括controfile,online redo logfile,archive logfile,rman backup
piece,rman p_w_picpath copy, flashback log等,均可以利用闪回恢复区来存放、管理。
5.闪回恢复区的一些限制
若是设置了闪回恢复区,则log_archive_dest和log_archive_duplex_dest将不可用
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参数,则归档日志默认是保存到该区域的
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最先的联机日志序列 245
下一个存档日志序列 247
当前日志序列 247
实际上,oracle是经过隐式的设置log_archive_dest_10='location= USE_DB_RECOVERY_FILE_DEST'来实现的。因此,若是以后你修改过log_archive_dest_n将归档日志保存到其余位置,也能够修改该参数继续使用闪回恢复区。
多个数据库的闪回恢复区能够指定到同一个位置,可是db_name不能同样,或者db_unique_name不同。
RAC的闪回恢复区必须位于共享磁盘上,能被全部实例访问。
6.闪回恢复区的空间管理
当闪回恢复区空间不足(使用超过85%)时,alert中会有警告记录
Tue Dec 19 10:45:41 2006
Errors in file e:/oracle/ora10/admin/ning/bdump/ning_rvwr_31968.trc:
ORA-19815: 警告: db_recovery_file_dest_size 字节 (共 52428800 字节) 已使用 87.29%, 尚有6665216 字节可用。
同时,oracle在alert中还会给出解决该问题的建议
Tue Dec 19 10:45:41 2006
************************************************************************
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.
************************************************************************
若是闪回恢复区空间耗尽,且归档路径设置到了闪回恢复区中,则因为日志没法归档,数据库会hang住。
Tue Dec 19 10:45:57 2006
Errors in file e:/oracle/ora10/admin/ning/bdump/ning_arc0_32372.trc:
ORA-19815: 警告: db_recovery_file_dest_size 字节 (共 52428800 字节) 已使用 100.00%, 尚有 0 字节可用。
Tue Dec 19 10:45:57 2006
Errors in file e:/oracle/ora10/admin/ning/bdump/ning_arc0_32372.trc:
ORA-19809: 超出了恢复文件数的限制
ORA-19804: 没法回收 6836224 字节磁盘空间 (从 52428800 限制中)
ARC0: Error 19809 Creating archive log file to
'E:/ORACLE/ORA10/FLASH_RECOVERY_AREA/NING/ARCHIVELOG/2006_12_19/O1_MF_1_250_U_.ARC'
ARC0: Failed to archive thread 1 sequence 250 (19809)
ARCH: Archival stopped, error occurred. Will continue retrying
Tue Dec 19 10:45:58 2006
Errors in file e:/oracle/ora10/admin/ning/bdump/ning_arc0_32372.trc:
ORA-16038: 日志 1 序列号 250 没法归档
ORA-19809: 超出了恢复文件数的限制
ORA-00312: 联机日志 1 线程 1: 'E:/ORACLE/ORA10/ORADATA/NING/REDO01.LOG'
因此,对于生产库,若是将归档放到闪回恢复区中,须要密切关注闪回恢复区的空间使用状况,不然一旦闪回恢复区的空间用尽,将致使数据库没法提供服务。
经过查询视图v$flash_recovery_area_usage,能够得到当前闪回恢复区的空间使用状况,而且能够知道
是哪些文件占中了空间,据此能够作出相应的处理,或者加大闪回恢复区,或者移走相应的文件。
PHP code:--------------------------------------------------------------------------------
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------------------ ------------------ ------------------------- ---------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 91 0 16
BACKUPPIECE 0 0 0
IMAGECOPY 0 0 0
FLASHBACKLOG 8 4 2
已选择6行。
----------------------------------------------------------------------------------
另外,v$recovery_file_dest视图也提供了闪回恢复区的概要信息。
SQL> select * from v$recovery_file_dest; NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES ----------------------------------- ----------- ---------- ----------------- --------------- Eracleora10flash_recovery_area 104857600 101835264 0 17