benrych 发表于 2011-12-22 08:54

Oracle 10g的闪回恢复区

<div id="blog_text" class="cnt"><p>闪回恢复区(Flash recovery area)</p>
<p><br>
Oracle9i开始提供闪回查询,以便能在需要的时候查到过去某个时刻的一致性数据,这是通过Undo实现的。这个功能有很大的限制,就是相关事务的
undo不能被覆盖,否则就无力回天了。oracle10g大大的增强了闪回查询的功能,并且提供了将整个数据库回退到过去某个时刻的能力,这是通过引入
一种新的flashback log实现的。flashback log有点类似redo log,只不过redo
log将数据库往前滚,flashback
log则将数据库往后滚。为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫做闪回恢复区(Flashback recovery
area)的新特性,可以将所有恢复相关的文件,比如flashback log,archive log,backup
set等,放到这个区域集中管理。</p>
<p>1.设置闪回恢复区<br>
闪回恢复区主要通过3个初始化参数来设置和管理<br>
db_recovery_file_dest:指定闪回恢复区的位置<br>
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小<br>
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。当然,实际上可回
退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的flash
log。所以这个参数要和db_recovery_file_dest_size配合修改。</p>
<p>2.启动flashback database<br>
设置了闪回恢复区后,可以启动闪回数据库功能。</p>
<p>首先,数据库必须已经处于归档模式<br>
SQL&gt; archive log list;<br>
Database log mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Archive Mode<br>
Automatic archival&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enabled<br>
Archive destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USE_DB_RECOVERY_FILE_DEST<br>
Oldest online log sequence&nbsp;&nbsp;&nbsp;&nbsp;156<br>
Next log sequence to archive&nbsp;&nbsp;158<br>
Current log sequence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;158</p>
<p>然后,启动数据库到mount状态<br>
SQL&gt; shutdown immediate;<br>
Database closed.<br>
Database dismounted.<br>
ORACLE instance shut down.</p>
<p>SQL&gt; startup mount<br>
ORACLE instance started.</p>
<p>Total System Global Area285212672 bytes<br>
Fixed Size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1218992 bytes<br>
Variable Size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;75499088 bytes<br>
Database Buffers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;205520896 bytes<br>
Redo Buffers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2973696 bytes<br>
Database mounted.</p>
<p>SQL&gt; alter database flashback on;<br>
数据库已更改。<br>
SQL&gt; alter database open;<br>
数据库已更改。<br>
SQL&gt; select FLASHBACK_ON from v$database;<br>
FLASHBACK_ON<br>
------------------------------------<br>
YES</p>
<p><br>
关于flashback database的功能,这里就不继续深入了。</p>
<p>3.取消闪回恢复区</p>
<p>将db_recovery_file_dest参数设置为空,可以停用闪回恢复区。<br>
如果已经启用flashback database,则不能取消闪回恢复区。<br>
SQL&gt; alter system set db_recovery_file_dest='';<br>
alter system set db_recovery_file_dest=''<br>
*<br>
第 1 行出现错误:<br>
ORA-02097: 无法修改参数, 因为指定的值无效<br>
ORA-38775: 无法禁用快速恢复区 - 闪回数据库已启用</p>
<p>所以,必须先禁用flashback database,才能取消闪回恢复区</p>
<p>SQL&gt; shutdown immediate;<br>
数据库已经关闭。<br>
已经卸载数据库。<br>
ORACLE 例程已经关闭。</p>
<p>SQL&gt; startup mount;<br>
ORACLE 例程已经启动。<br>
Total System Global Area 142606336 bytes<br>
Fixed Size 1247732 bytes<br>
Variable Size 83887628 bytes<br>
Database Buffers 50331648 bytes<br>
Redo Buffers 7139328 bytes<br>
数据库装载完毕。</p>
<p>SQL&gt; alter database flashback off;<br>
数据库已更改。</p>
<p>SQL&gt; alter database open;<br>
数据库已更改。</p>
<p>SQL&gt; alter system set db_recovery_file_dest='';<br>
系统已更改。</p>
<p>4.闪回恢复区的内容<br>
所有和恢复相关的文件都可以存放到闪回恢复区<br>
SQL&gt; select file_type from v$flash_recovery_area_usage;<br>
FILE_TYPE<br>
------------------------<br>
CONTROLFILE<br>
ONLINELOG<br>
ARCHIVELOG<br>
BACKUPPIECE<br>
IMAGECOPY<br>
FLASHBACKLOG<br>
已选择6行。</p>
<p>上面的视图中可以看出,包括controfile,online redo logfile,archive logfile,rman backup <br>
piece,rman image copy, flashback log等,都可以利用闪回恢复区来存放、管理。</p>
<p>5.闪回恢复区的一些限制<br>
如果设置了闪回恢复区,则log_archive_dest和log_archive_duplex_dest将不可用</p>
<p>alter system set log_archive_dest='e:/'<br>
*<br>
第 1 行出现错误:<br>
ORA-02097: 无法修改参数, 因为指定的值无效<br>
ORA-16018: 无法将 LOG_ARCHIVE_DEST 与 LOG_ARCHIVE_DEST_n 或<br>
DB_RECOVERY_FILE_DEST 一起使用<br>
SQL&gt; alter system set log_archive_duplex_dest='e:/';<br>
alter system set log_archive_duplex_dest='e:/'<br>
*<br>
第 1 行出现错误:<br>
ORA-02097: 无法修改参数, 因为指定的值无效<br>
ORA-16018: 无法将 LOG_ARCHIVE_DUPLEX_DEST 与 LOG_ARCHIVE_DEST_n 或<br>
DB_RECOVERY_FILE_DEST 一起使用</p>
<p>设置闪回恢复区后,如果没有设置过log_archive_dest_n参数,则归档日志默认是保存到该区域的</p>
<p>SQL&gt; archive log list<br>
数据库日志模式 存档模式<br>
自动存档 启用<br>
存档终点 USE_DB_RECOVERY_FILE_DEST<br>
最早的联机日志序列 245<br>
下一个存档日志序列 247<br>
当前日志序列 247</p>
<p>实际上,oracle是通过隐式的设置
log_archive_dest_10='location=USE_DB_RECOVERY_FILE_DEST'来实现的。所以,如果之后你修改过
log_archive_dest_n将归档日志保存到其他位置,也可以修改该参数继续使用闪回恢复区。</p>
<p>多个数据库的闪回恢复区可以指定到同一个位置,但是db_name不能一样,或者db_unique_name不一样。</p>
<p>RAC的闪回恢复区必须位于共享磁盘上,能被所有实例访问。</p>
<p>6.闪回恢复区的空间管理<br>
当闪回恢复区空间不足(使用超过85%)时,alert中会有警告记录<br>
Tue Dec 19 10:45:41 2006<br>
Errors in file e:/oracle/ora10/admin/ning/bdump/ning_rvwr_31968.trc:<br>
ORA-19815: 警告: db_recovery_file_dest_size 字节 (共 52428800 字节) 已使用 87.29%, 尚有6665216 字节可用。</p>
<p>同时,oracle在alert中还会给出解决该问题的建议<br>
Tue Dec 19 10:45:41 2006<br>
************************************************************************<br>
You have following choices to free up space from flash recovery area:<br>
1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,<br>
then consider changing RMAN ARCHIVELOG DELETION POLICY.<br>
2. Back up files to tertiary device such as tape using RMAN<br>
BACKUP RECOVERY AREA command.<br>
3. Add disk space and increase db_recovery_file_dest_size parameter to<br>
reflect the new space.<br>
4. Delete unnecessary files using RMAN DELETE command. If an operating<br>
system command was used to delete files, then use RMAN CROSSCHECK and<br>
DELETE EXPIRED commands.<br>
************************************************************************</p>
<p>如果闪回恢复区空间耗尽,且归档路径设置到了闪回恢复区中,则由于日志无法归档,数据库会hang住。</p>
<p>Tue Dec 19 10:45:57 2006<br>
Errors in file e:/oracle/ora10/admin/ning/bdump/ning_arc0_32372.trc:<br>
ORA-19815: 警告: db_recovery_file_dest_size 字节 (共 52428800 字节) 已使用 100.00%, 尚有 0 字节可用。</p>
<p>Tue Dec 19 10:45:57 2006<br>
Errors in file e:/oracle/ora10/admin/ning/bdump/ning_arc0_32372.trc:<br>
ORA-19809: 超出了恢复文件数的限制<br>
ORA-19804: 无法回收 6836224 字节磁盘空间 (从 52428800 限制中)</p>
<p>ARC0: Error 19809 Creating archive log file to <br>
'E:/ORACLE/ORA10/FLASH_RECOVERY_AREA/NING/ARCHIVELOG/2006_12_19/O1_MF_1_250_U_.ARC'<br>
ARC0: Failed to archive thread 1 sequence 250 (19809)<br>
ARCH: Archival stopped, error occurred. Will continue retrying<br>
Tue Dec 19 10:45:58 2006<br>
Errors in file e:/oracle/ora10/admin/ning/bdump/ning_arc0_32372.trc:<br>
ORA-16038: 日志 1 序列号 250 无法归档<br>
ORA-19809: 超出了恢复文件数的限制<br>
ORA-00312: 联机日志 1 线程 1: 'E:/ORACLE/ORA10/ORADATA/NING/REDO01.LOG'</p>
<p>所以,对于生产库,如果将归档放到闪回恢复区中,需要密切关注闪回恢复区的空间使用情况,否则一旦闪回恢复区的空间用尽,将导致数据库无法提供服务。</p>
<p>通过查询视图v$flash_recovery_area_usage,可以获得当前闪回恢复区的空间使用情况,并且可以知道<br>
是哪些文件占中了空间,据此可以做出相应的处理,或者加大闪回恢复区,或者移走相应的文件。<br>
PHP code:--------------------------------------------------------------------------------<br>
SQL&gt; select * from v$flash_recovery_area_usage;<br>
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES<br>
------------------------ ------------------ ------------------------- ---------------<br>
CONTROLFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>
ONLINELOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>
ARCHIVELOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;91&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16<br>
BACKUPPIECE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>
IMAGECOPY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>
FLASHBACKLOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br>
已选择6行。<br>
----------------------------------------------------------------------------------<br>
另外,v$recovery_file_dest视图也提供了闪回恢复区的概要信息。<br>
SQL&gt; select * from v$recovery_file_dest;<br>
NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES<br>
----------------------------------- ----------- ---------- ----------------- ---------------<br>
Eracleora10flash_recovery_area 104857600 101835264 0 17</p></div>
页: [1]
查看完整版本: Oracle 10g的闪回恢复区