天天看點

oracle10g新特性:閃回恢複區(Flash recovery area)

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

設定了閃回恢複區後,可以啟動閃回資料庫功能。

首先,資料庫必須已經處于歸檔模式:

SQL> archive log list

資料庫日志模式 存檔模式

自動存檔 啟用

存檔終點 USE_DB_RECOVERY_FILE_DEST

最早的聯機日志序列 245

下一個存檔日志序列 247

目前日志序列 247

然後,啟動資料庫到mount狀态:

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 on;

資料庫已更改。

SQL> alter database open;

資料庫已更改。SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON

------------------------------------

YES

關于flashback database的功能,這裡就不繼續深入了。

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> alter database flashback off;

資料庫已更改。SQL> alter database open;

系統已更改。

注意;閃回恢複的開啟和關閉都必須在mount狀态下。

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 image copy, flashback log等,都可以利用閃回恢複區來存放、管理。

5.閃回恢複區的一些限制

如果設定了閃回恢複區,則log_archive_dest和log_archive_duplex_dest将不可用:

SQL> alter system set log_archive_dest='e:/'

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:/'

ORA-16018: 無法将 LOG_ARCHIVE_DUPLEX_DEST 與 LOG_ARCHIVE_DEST_n 或

設定閃回恢複區後,如果沒有設定過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中會有警告記錄:

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中還會給出解決該問題的建議:

************************************************************************

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

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

ORA-16038: 日志 1 序列号 250 無法歸檔

ORA-00312: 聯機日志 1 線程 1: 'E:/ORACLE/ORA10/ORADATA/NING/REDO01.LOG'

是以,對于生産庫,如果将歸檔放到閃回恢複區中,需要密切關注閃回恢複區的空間使用情況,否則一旦閃回恢複區的空間用盡,将導緻資料庫無法提供服務。

通過查詢視圖v$flash_recovery_area_usage,可以獲得目前閃回恢複區的空間使用情況,并且可以知道是哪些檔案占中了空間,據此可以做出相應的處理,或者加大閃回恢複區,或者移走相應的檔案。

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

----------------------------------- ----------- ---------- ----------------- ---------------

E:oracleora10flash_recovery_area 104857600 101835264 0 17