ORACLE 閃回恢復區(Flashback recovery area)與undo tablespace

Flashback 技術是以Undo segment中的內容爲基礎的, 因此受限於UNDO_RETENTON參數。

要使用flashback 的特性,必須啓用自動撤銷管理表空間。
在Oracle 11g裏又出了一個新特性:Oracle Flashback Data Archive.
FDA通過將變化數據另外存儲到創建的閃迴歸檔區(Flashback Archive)中,以和undo區別開來,
這樣就可以爲閃迴歸檔區單獨設置存儲策略,使之可以閃回到指定時間之前的舊數據而不影響undo策略。

在Oracle 10g中, Flash back家族分爲以下成員:
Flashback Database,
Flashback Drop,
Flashback Query(分Flashback Query,Flashback Version Query,
Flashback Transaction Query 三種)
和Flashback Table。

Oracle 11g中閃回新特性 :閃迴歸檔

\

1 閃回恢復區(Flashback 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等,放到這個區域集中管理。

1.1 設置閃回恢復區
閃回恢復區主要通過3個初始化參數來設置和管理:
db_recovery_file_dest:指定閃回恢復區的位置
db_recovery_file_dest_size:指定閃回恢復區的可用空間大小
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

我們看到db_flashback_retention_target 默認是1440分鐘,即24 小時,
需要注意的是該參數雖然未直接指定flash recovery area大小,但卻受其制約,
舉個例子假如數據庫每天有10%左右的數據變動的話,如果該初始化參數值設置爲1440,
則flash recovery area 的大小至少要是當前數據庫實際容量的10%,
如果該初始化參數設置爲2880,則flash recovery area 的大小就至少是數據庫所佔容量的20%。

修改該參數:

SQL>alter system set db_flashback_retention_target=2880 scope=both;

1.2 取消閃回恢復區
將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: 無法禁用恢復區 - 閃回數據庫已啓用
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 的話,該參數的值意義是不一樣的

1.3 閃回恢復區的內容
所有和恢複相關的文件都可以存放到閃回恢復區
TEST@orcl2> select file_type from v$flash_recovery_area_usage;

FILE_TYPE
--------------------
CONTROL FILE
REDO LOG
ARCHIVED LOG
BACKUP PIECE
IMAGE COPY
FLASHBACK LOG
FOREIGN ARCHIVED LOG

7 rows selected.


上面視圖中查詢的結果列出的所有類型的文件,都可以利用閃回恢復區來存放、管理。
在一些 10g 的動態視圖裏( V$CONTROLFILE, V$LOGFILE, V$ARCHIVED_LOG, V$DATAFILE_COPY 等 )
的新的列 IS_RECOVERY_DEST_FILE ,指明相關的文件是否在恢復區內。

TEST@orcl2> col is_recovery_dest_file for a25
TEST@orcl2> SELECT recid, blocks, is_recovery_dest_file
FROM v$archived_log
WHERE recid < 5;

RECID BLOCKS IS_RECOVERY_DEST_FILE
---------- ---------- -------------------------
1 61856 YES
2 1 YES
3 1 YES
4 87577 YES

 

1.4 閃回恢復區的一些限制
如果設置了閃回恢復區,則log_archive_dest和log_archive_duplex_dest將不可用。
SQL> alter system set log_archive_dest='e:/' ;

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的閃回恢復區必須位於共享磁盤上,能被所有實例訪問。
上述說明適用於單節點上有多個數據庫時的情況。

1.5 閃回恢復區的空間管理
閃回恢復區中添加或刪除文件等變化都將記錄在數據庫的 alert 日誌中,
Oracle 10g 也針對該新特性提供了一個新的視圖, DBA_OUTSTANDING_ALERTS,
通過該視圖可以得到相關的信息。
SYS@orcl2> desc dba_outstanding_alerts;
Name Null? Type
----------------------------------------- -------- ----------------------------
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中還會給出解決該問題的建議
************************************************************************
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 RMANB ACKUP 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.
************************************************************************

V$RECOVERY_FILE_DEST視圖 包含閃回恢復區的相關信息:
SYS@orcl2> desc v$recovery_file_dest;
Name Null? Type
----------------------------------------- -------- ----------------------------
NAME VARCHAR2(513)
SPACE_LIMIT NUMBER
SPACE_USED NUMBER
SPACE_RECLAIMABLE NUMBER
NUMBER_OF_FILES NUMBER

SYS@orcl2> col name for a5
SYS@orcl2> select * from v$recovery_file_dest;

NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----- ----------- ---------- ----------------- ---------------
+FRA 4621074432 620756992 0 33

通過查詢視圖v$flash_recovery_area_usage,可以獲得當前閃回恢復區的空間使用情況,
並且可以知道是哪些文件佔中了空間,據此可以做出相應的處理,或者加大閃回恢復區,
或者移走相應的文件。
SYS@orcl2> select * from v$flash_recovery_area_usage;

FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
NUMBER_OF_FILES
---------------
CONTROL FILE .41 0
1

REDO LOG 4.63 0
4

ARCHIVED LOG 3.72 0
24


FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
NUMBER_OF_FILES
---------------
BACKUP PIECE 0 0
0

IMAGE COPY 0 0
0

FLASHBACK LOG 4.63 0
4


FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
NUMBER_OF_FILES
---------------
FOREIGN ARCHIVED LOG 0 0
0


7 rows selected.


如果閃回恢復區空間耗盡,且歸檔路徑設置到了閃回恢復區中,則由於日誌無法歸檔,
數據庫會hang住。所以,對於生產庫,如果將歸檔放到閃回恢復區中,
需要密切關注閃回恢復區的空間使用情況,否則一旦閃回恢復區的空間用盡,
將導致數據庫無法提供服務。
因此,應該將閃回區的使用情況列入dba日常巡檢工作中。

1.6 Flash Recovery Area空間不足導致DB不能打開或hang住處理方法
在上面講到,當歸檔目錄設置在閃回恢復區,並且閃回恢復區又滿了的情況下,
DB 就會無法歸檔而hang住或者無法打開。


這種情況下打開數據庫會遇到如下錯誤信息:
SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> alter database open;

alter database open

*

第 1 行出現錯誤:

ORA-16014: 日誌 2 的序列號 27 未歸檔, 沒有可用的目的地
ORA-00312: 聯機日誌 2 線程 1:
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'


SQL> show parameter db_recovery_file

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:/oracle/product/10.2.0/flash_recovery_area
db_recovery_file_dest_size big integer 2G

SQL> alter system archive log current;

alter system archive log current

*

第 1 行出現錯誤:
ORA-01109: 數據庫未打開

SQL> alter system switch logfile;

alter system switch logfile

*

第 1 行出現錯誤:
ORA-01109: 數據庫未打開

 

SQL> shutdown immediate;

ORA-01109: 數據庫未打開

已經卸載數據庫。
ORACLE 例程已經關閉。

SQL> startup
ORACLE 例程已經啓動。
Total System Global Area 201326592 bytes
Fixed Size 1248092 bytes
Variable Size 88081572 bytes
Database Buffers 109051904 bytes
Redo Buffers 2945024 bytes
數據庫裝載完畢。

ORA-16038: 日誌 2 序列號 27 無法歸檔
ORA-19809: 超出了恢復文件數的限制
ORA-00312: 聯機日誌 2 線程 1:
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'

SQL> alter database open;

alter database open

*

第 1 行出現錯誤:
ORA-16014: 日誌 2 的序列號 27 未歸檔, 沒有可用的目的地
ORA-00312: 聯機日誌 2 線程 1:
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'


通過增加閃回恢復區大小,我們可以正常打開數據庫

SQL> show parameter db_recovery

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:/oracle/product/10.2.0/flash_recovery_area
db_recovery_file_dest_size big integer 2G

SQL> alter system set db_recovery_file_dest_size=3G scope=both;

系統已更改。

SQL> alter database open;

數據庫已更改。

 

檢查一下flash recovery area的使用情況:

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 6.36 0 4
BACKUPPIECE .22 0 1
IMAGECOPY 63.68 0 5
FLASHBACKLOG .51 .25 2

已選擇6行。

SQL>


計算flash recovery area已經佔用的空間:

SQL> select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;

SUM(PERCENT_SPACE_USED)*3/100
-----------------------------
2.1231
--在11.2以後,v$flash_recovery_area_usage已經被v$recovery_area_usage取代。

可以看到,這裏已經有2.1231G使用了,這說明我們剛開始設置的db_recovery_file_dest_size=2G不足,
導致online redo log無法歸檔,在這裏,我們通過設置db_recovery_file_dest_size參數,
增大了flash recovery area來解決這個問題。
增加Flash recovery area 是一種解決方法,也可以將歸檔指定到其他的目錄來解決這個問題。
或者刪除備份中的obsolete備份,都可以解決問題。


1.7 Flash Recovery Area 的備份
備份命令是Flash recovery Area,該命令是Oracle 10g以後纔有的。
10g引進了flash recovery area,同時在rman備份中支持對該區域的備份。

在9i中oracle引入flashback查詢,依賴於undo表空間存儲的信息來閃回查詢以前的版本,
當然這個受限於undo表空間的大小,以及保留策略。

在10g中oracle又引入了新的flashback功能,使用了flash recovery area來存儲flashback 1og等等。
這個區域默認創建在oracle_base目錄下。
在其中可以存放備份集、鏡像拷貝、歸檔日誌、自動備份的控制文件以及spfile和flashback logs。
存放位置和大小由參數db_recovery_file_dest和db_recovery_file_dest_size決定。

默認情況數據庫的flashback database是關閉,可以在mount exclusive狀態下打開。


看一下Oracle 官方文檔上的幾段文字:
To free space in the FRA we could do take a backup of the Flash Recovery Area using the
command BACKUP RECOVERY AREA.This command will take the backup of all the files in the
FRA to tape only. After this the space occupied by the files in the FRA will be
marked as reclaimable。

the larger the fast recovery area, the more useful it is. Ideally, the fast recovery
area should be large enough for copies of the data files, control files, online
redo log files, and archived redo log files needed to recover the database,
and also the copies of these backup files that are kept based on the retention policy.

The Flash Recovery Area is a unified storage location for all recovery-related files
and activities in an Oracle Database. It includes Control File, Archived Log Files,
Flashback Logs, Control File Autobackups, Data Files, and RMAN files.


從上面的幾段話,我們可以得到一下信息:
(1) BACKUP RECOVERY AREA 命令只能備份到磁帶上。
在磁盤上備份會報如下錯誤:
RMAN> BACKUP RECOVERY AREA;

啓動 backup 於 12-8月 -10
使用目標數據庫控制文件替代恢復目錄
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=15 設備類型=DISK
說明與資料檔案庫中的任何歸檔日誌都不匹配
說明與資料檔案庫中的任何數據文件副本都不匹配

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: backup 命令 (在 08/12/2010 13:50:10 上) 失敗
RMAN-06603: 必須在磁盤設備上使用 RECOVERY AREA, RECOVERY FILES 或 DB_RECOVERY_FILE_DEST 指定 TO DESTINATION 選項


(2) Flash recovery area 包含內容:控制文件,歸檔文件,flashback logs, 控制文件,
自動備份的控制文件,數據文件,數據文件拷貝,RMAN 文件(包括備份集,鏡像備份)。

(3) BACKUP RECOVERY AREA 將備份所有Flash recovery area中的內容。

2 Flashback Database
2.1 Flashback Database 說明
Flashback Database 功能非常類似與RMAN的不完全恢復,
它可以把整個數據庫回退到過去的某個時點的狀態,
這個功能依賴於Flashback log 日誌。 比RMAN更快速和高效。
因此Flashback Database 可以看作是不完全恢復的替代技術。
但它也有某些限制:
(1)Flashback Database 不能解決Media Failure, 這種錯誤RMAN恢復仍是唯一選擇。
(2)如果刪除了數據文件或者利用Shrink技術縮小數據文件大小,
這時不能用Flashback Database技術回退到改變之前的狀態,
這時候就必須先利用RMAN把刪除之前或者縮小之前的文件備份restore 出來,
然後利用Flashback Database 執行剩下的Flashback Datbase。
(3)如果控制文件是從備份中恢復出來的,或者是重建的控制文件,
也不能使用Flashback Database。
(4)使用Flashback Database鎖能恢復到的最早的SCN,
取決於Flashback Log中記錄的最早SCN。

2.2 Flashback Database 架構
Flashback Database 整個架構包括一個進程Recover Writer(RVWR)後臺進程,
Flashback Database Log日誌 和Flash Recovery Area。
一旦數據庫啓用了Flashback Database, 則RVWR進程會啓動,
該進程會向Flash Recovery Area中寫入Flashback Database Log,
這些日誌包括的是數據塊的 " 前鏡像(before image)",
這也是Flashback Database 技術不完全恢復塊的原因。

[oracle@rac1 ~]$ ps -ef|grep rvwr
oracle 6326 1 0 10:36 ? 00:00:00 ora_rvwr_orcl1

[oracle@rac2 ~]$ ps -ef|grep rvwr
oracle 6474 1 0 10:36 ? 00:00:00 ora_rvwr_orcl2

2.3 啓用Flashback Database 步驟
數據庫的Flashback Database功能缺省是關閉的,要想啓用這個功能,就需要做如下配置。

2.3.1 配置Flash Recovery Area
這個參考1.1 節的配置。

2.3.2 啓動flashback database
默認情況數據庫的flashback database是關閉,
可以在mount exclusive狀態下打開。在設置了閃回恢復區後,可以啓動閃回數據庫功能。
SYS@orcl2> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 12
Next log sequence to archive 13
Current log sequence 13
SYS@orcl2> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@orcl2> startup mount'
SP2-0714: invalid combination of STARTUP options
SYS@orcl2> startup mount;
ORACLE instance started.

Total System Global Area 835104768 bytes
Fixed Size 2257840 bytes
Variable Size 603982928 bytes
Database Buffers 226492416 bytes
Redo Buffers 2371584 bytes
Database mounted.
SQL> alter database flashback on;

數據庫已更改。

SYS@orcl2> alter database open;

Database altered.

SYS@orcl2> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES


2.4 Flashback Database操作示例

做操作前先備份數據庫:
RMAN> backup database;
2.4.1 檢查是否啓動了flash recovery area
SQL> show parameter db_recovery_file

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest tring D:/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 1G

2.4.2 檢查是否啓用了歸檔
SQL> archive log list;
數據庫日誌模式 存檔模式
自動存檔 啓用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 9
下一個存檔日誌序列 11
當前日誌序列 11


2.4.3 檢查是否啓用了flashback database
SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

2.4.4 查詢當前的scn
SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
-----------
947921

2.4.5 查詢當前的時間
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;

TIME
-----------------
09-10-14 14:37:05

2.4.6 刪除表A
SQL> select * from A;

ID NAME
---------- ----------
1 tianlesoftware
2 dave

SQL> drop table A;

表已刪除。

SQL> commit;


2.4.7 重啓DB 到mount
Flashback Database 實際是對數據庫的一個不完全恢復操作,
因爲需要關閉數據庫重啓到mount狀態
SQL> shutdown immediate
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啓動。
Total System Global Area 209715200 bytes
Fixed Size 1248116 bytes
Variable Size 79692940 bytes
Database Buffers 121634816 bytes
Redo Buffers 7139328 bytes

數據庫裝載完畢。

2.4.8 執行恢復:分timestamp 或者SCN兩種
SQL> Flashback database to timestamp to_timestamp('09-10-14 14:37:05','yy-mm-dd hh24:mi:ss');

閃回完成。

或者:

SQL> Flashback database to scn 947921;

閃回完成。

2.4.9 打開數據庫
在執行完flashback database 命令之後,oracle 提供了兩種方式讓你修復數據庫:
1). 直接alter database open resetlogs 打開數據庫,當然,指定scn 或者timestamp 時間點之後
產生的數據統統丟失。
2). 先執行alter database open read only 命令,以read-only 模式打開數據庫,
然後立刻通過邏輯導出的方式將誤操作涉及表的數據導出,再執行recover database
命令以重新應用數據庫產生的redo,將數據庫修復到flashback database 操作前的狀態,
然後再通過邏輯導入的方式,將之前誤操作的表重新導入,這樣的話對現有數據的影響最小,
不會有數據丟失。

這裏演示,就以resetlogs方式打開:

SQL> alter database open resetlogs;

數據庫已更改。

驗證數據:

SQL> select * from A;

ID NAME

---------- ----------
1 tianlesoftware
2 dave

 

2.5 和Flashback Database 相關的3個視圖
2.5.1 V$database
這個視圖可以查看是否啓用了Flashback database功能

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

 

2.5.2 V$flashback_database_log
Flashback Database 所能回退到的最早時間,取決與保留的Flashback Database Log 的多少,
該視圖就可以查看許多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 這兩列用來記錄可以恢復到最早的時點
Flashback_size: 記錄了當前使用的Flash Recovery Area 空間的大小
Retention_target: 系統定義的策略
Estimated_flashback_size: 根據策略對需要的空間大小的估計值

SQL> select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es
from v$flashback_database_log;

OS OT RT FS ES
---------- ----------------- ---------- ---------- ----------
1150657 14-07-01 10:18:39 1440 209715200 0


2.5.3 V$flashback_database_stat
這個視圖用來對Flashback log 空間情況進行更細粒度的記錄和估計。
這個視圖以小時爲單位記錄單位時間內數據庫的活動量:
Flashback_Data 代表Flashback log產生數量,
DB_Date 代表數據改變數量,
Redo_Date代表日誌數量,
通過這3個數量可以反映出數據的活動特點,更準確的預計Flash Recovery Area的空間需求

SQL> alter session set nls_date_format='hh24:mi:ss';

會話已更改。

SQL> select *from v$flashback_database_stat;

BEGIN_TI END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
-------- -------- -------------- ---------- ---------- ------------------------
14:43:10 15:15:28 6455296 29310976 3898368 0


3 Flashback Drop
Flashback Drop 是從Oracle 10g 開始出現的,用於恢復用戶誤刪除的對象(包括表,索引等),
這個技術依賴於Tablespace Recycle Bin(表空間回收站),這個功能和windows的回收站非常類似。
Flashback 不支持sys用戶. system表空間下的對象,也不能從回收站裏拿到。
故使用SYS 或者SYSTEM用戶登陸時, show recyclebin 爲空。
Flashback Drop 是基於Tablespace RecycleBin 來實現恢復的。
它只支持閃回與table 相關連的對象,比如表,索引,約束,觸發器等。
如果是函數或者存儲過程等,就需要使用Flashback Query來實現。

3.1 Tablespace Recycle Bin
從Oracle 10g 開始, 每個表空間都會有一個叫作回收站的邏輯區域,當用戶執行drop命令時,
被刪除的表和表的關聯對象( 包括索引, 約束,觸發器,LOB段,LOB index 段) 不會被物理刪除,
這些對象先轉移到回收站中,這就給用戶提供了一個恢復的可能。
When you drop a table, the database does not immediately remove the space associated
with the table. The database renames the table and places it and any associated
objects in a recycle bin, where, in case the table was dropped in error,
it can be recovered at a later time. This feature is called Flashback Drop,
and the FLASHBACK TABLE statement is used to restore the table. Before discussing
the use of the FLASHBACK TABLE statement for this purpose, it is important to
understand how the recycle bin works, and how you manage its contents.
The recycle bin is actually a data dictionary table containing information about
dropped objects. Dropped tables and any associated objects such as indexes,
constraints, nested tables, and the likes are not removed and still occupy space.
They continue to count against user space quotas, until specifically purged from
the recycle bin or the unlikely situation where they must be purged by the
database because of tablespace space constraints.


初始化參數recyclebin 用於控制是否啓用recyclebin功能,缺省是ON, 可以使用OFF關閉。
TEST@orcl2> show parameter recycle;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle string
db_recycle_cache_size big integer 0
recyclebin string on


禁用該功能:

SQL> alter system set recyclebin=off;
SQL> alter system set recyclebin=on;

SQL> alter session set recyclebin=off;
SQL> alter session set recyclebin=on;

禁用後刪除的對象將直接刪除,不會寫到Recycle中,當然在刪除時,指定purge 參數,
表也將直接刪除,不會寫到recyclebin中。

SQL> drop table name purge;
查看recyclebin中的對象列表:

SQL> select * from A;

ID

----------

1

2

3

SQL> drop table A;

表已刪除。

SQL> show recyclebin

ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ----------------------------- ------------
A BIN$RWXQQcTPRde0ws4h9ewJcg==$0 TABLE 2009-10-15:12:44:33

 

查看recyclebin中對象:

SQL> select original_name,object_name from recyclebin;

ORIGINAL_NAME OBJECT_NAME
-------------------------------- ------------------------------
A BIN$RWXQQcTPRde0ws4h9ewJcg==$0

查看recyblebin對象裏的內容:

SQL> select * from "BIN$RWXQQcTPRde0ws4h9ewJcg==$0";

ID
----------
1
2
3


表空間的Recycle Bin 區域只是一個邏輯區域,而不是從表空間上物理的劃出一塊區域固定用於回收站,
因此Recycle Bin是和普通對象共用表空間的存儲區域,
或者說是Recycle Bin的對象要和普通對象搶奪存儲空間。
當發生空間不夠時,Oracle會按照先入先出的順序覆蓋Recycle Bin中的對象。
如果表空間的數據文件打開了自動擴展,則在數據文件擴展之前,不會清除recyclebin中的內容。
每次擴展的時候,Oracle實際上是執行了alter database datafile resize命令。

也可以手動的刪除Recycle Bin佔用的空間:
1). Purge tablespace tablespace_name:
用於清空表空間的Recycle Bin
2). Purge tablespace tablespace_name user user_name:
清空指定表空間的Recycle Bin中指定用戶的對象
3). Purge recyclebin:
刪除當前用戶的Recycle Bin中的對象
4). Purge dba_recyclebin:
刪除所有用戶的Recycle Bin中的對象,該命令要sysdba權限
5). Drop table table_name purge:
刪除對象並且不放在Recycle Bin中,
即永久的刪除,不能用Flashback恢復。
6). Purge index recycle_bin_object_name:
當想釋放Recycle bin的空間,
又想能恢復表時,可以通過釋放該對象的index所佔用的空間來緩解空間壓力。
因爲索引是可以重建的。

3.2 Flashback Drop 實例操作
SQL> select original_name,object_name from recyclebin;

ORIGINAL_NAME OBJECT_NAME
-------------------------------- ------------------------------
A BIN$RWXQQcTPRde0ws4h9ewJcg==$0

 

SQL> flashback table a to before drop;

閃回完成。

SQL> select * from a;

ID
----------
1
2
3

當我們刪除表A後,在新建表A,這時在恢復的時候就會報錯,此時我們在閃回時,
對錶重命名就可以了:

SQL> drop table a;

表已刪除。

SQL> create table a

2 (id number(1));

表已創建。

SQL> flashback table a to before drop ;

flashback table a to before drop

*

第 1 行出現錯誤:

ORA-38312: 原始名稱已被現有對象使用

SQL> flashback table a to before drop rename to B;

閃回完成。

SQL> select * from B;

ID
----------
1
2
3

當我們刪除表A,在新建表A,在刪除它,這是在Recycle Bin中就會有2個相同的表名,
此時恢復我們就要指定object_name才行.

SQL> select * from B;

ID
----------
1
2
3

SQL> drop table B;

表已刪除。

SQL> create table B(name varchar(20));

表已創建。

SQL> drop table B;

表已刪除。

SQL> select original_name,object_name from recyclebin;

ORIGINAL_NAME OBJECT_NAME
-------------------------------- ------------------------------
B BIN$vYuv+g9fTi2exYP9X2048Q==$0
B BIN$geQ9+NekSjuRvzG+TqDVWw==$0

SQL> flashback table "BIN$vYuv+g9fTi2exYP9X2048Q==$0" to before drop;

閃回完成。

SQL> select * from B;

ID
----------
1
2
3


一旦完成閃回恢復,Recycle Bin中的對象就消失了.
如果表上索引或者約束等信息,這些信息也會被恢復,但是這些對象會使用Oracle 自動的命名。
我們需要查看這些對象,然後對這些對象重新命名:如:
SQL>select index_name from user_indexes where table_name = 'job_history';

INDEX_NAME
------------------------------
BIN$DBo9UChwZSbgQFeMiAdCcQ==$0
BIN$DBo9UChtZSbgQFeMiAdCcQ==$0
BIN$DBo9UChuZSbgQFeMiAdCcQ==$0
BIN$DBo9UChvZSbgQFeMiAdCcQ==$0

重命名:

SQL>alter index "bin$dbo9uchtzsbgqfemiadccq==$0" rename to jhist_job_ix;


Flashback Drop 需要注意的地方:
1). 只能用於非系統表空間和本地管理的表空間
2). 對象的參考約束不會被恢復,指向該對象的外鍵約束需要重建。
3). 對象能否恢復成功,取決與對象空間是否被覆蓋重用。
4). 當刪除表時,信賴於該表的物化視圖也會同時刪除,但是由於物化視圖並不會被放入recycle bin,
因此當你執行flashback table to before drop 時,也不能恢復依賴其的物化視圖,
需要dba 手工介入重新創建。
5). 對於Recycle Bin中的對象,只支持查詢.

4 Flashback Query
Flashback 是ORACLE 自9i 就開始提供的一項特性,在9i 中利用oracle 查詢多版本一致的特點,
實現從回滾段中讀取表一定時間內操作過的數據,可用來進行數據比對,
或者修正意外提交造成的錯誤數據,該項特性也被稱爲Flashback Query。
Flashback Query分
Flashback Query,
Flashback Version Query,
Flashback Transaction Query 三種。

4.1 Flashback Query
Flashback Query 是利用多版本讀一致性的特性從UNDO 表空間讀取操作前的記錄數據。
flashback query 對v$tables,x$tables 等動態性能視圖無效,
不過對於dba_*,all_*,user_*等數據字典是有效的。
該特性也完全支持訪問遠端數據庫,比如select * from tbl@dblink as of scn 3600;的形式。

4.1.1 多版本讀一致性
不同的事務在寫數據時,會將數據的前映像寫入undo 表空間,這樣如果同時有其它事務查詢該表數據,
則可以通過undo 表空間中數據的前映像來構造所需的完整記錄集,
而不需要等待寫入的事務提交或回滾。
Flashback query 有多種方式構建查詢記錄集,記錄集的選擇範圍可以基於時間或基於scn,
甚至可以同時查詢出記錄在undo 表空間中不同事務時的前映象。
用法與標準查詢非常類似,要通過flashback query 查詢undo 中的撤銷數據,
最簡單的方式只需要在標準查詢語句的表名後面跟上as of timestamp(基於時間)或as of scn
(基於scn)即可。
as of timestamp|scn 的語法是自9iR2 後纔開始提供支持。

4.1.2 As of timestamp 的示例:
SQL> alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';

會話已更改。

SQL> select sysdate from dual;

SYSDATE
-------------------
2009-10-15 19:04:16

SQL> select * from A;

ID
----------
2
1
3
4

模擬用戶誤操作,刪除數據

SQL> delete from A;

已刪除4行。

SQL> commit;

提交完成。

SQL> select * from A;

未選定行

查看刪除之前的狀態:假設當前距離刪除數據已經有5 分鐘左右的話:

SQL> select * from A as of timestamp sysdate-5/1440;

ID
----------
2
1
3
4

或者:

SQL>select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');

ID
----------
2
1
3
4

用Flashback Query恢復之前的數據:

SQL>Insert into A select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');

已創建4行。

SQL> COMMIT;

提交完成。

SQL> select * from A;

ID
----------
2
1
3
4

如上述示例中所表示的,as of timestamp 的確非常易用,但是在某些情況下,
我們建議使用as of scn 的方式執行flashback query,
比如需要對多個相互有主外鍵約束的表進行恢復時,如果使用as of timestamp 的方式,
可能會由於時間點不統一的緣故造成數據選擇或插入失敗,通過scn 方式則能夠確保記錄的約束一致性。

4.1.3 As of scn 示例
查看SCN:
SQL>SELECT dbms_flashback.get_system_change_number FROM dual;

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
-----------
1095782

刪除數據:

SQL> delete from A;

已刪除4行。

SQL> commit;

提交完成。

查看刪除之前的狀態:

SQL> select * from A as of scn 1095782;

ID
----------
2
1
3
4

用Flashback Query恢復之前的數據:

SQL> insert into A select * from A as of scn 1095782;

已創建4行。

SQL> commit;

提交完成。

SQL> select * from A;

ID
----------
2
1
3
4

4.1.4 SCN 與 timestamp 關係
Oracle 在內部都是使用scn,即使你指定的是as of timestamp,oracle 也會將其轉換成scn,
系統時間標記與scn 之間存在一張表,即SYS 下的SMON_SCN_TIME
TEST@orcl2> desc sys.smon_scn_time;
Name Null? Type
----------------------------------------- -------- ----------------------------
THREAD NUMBER
TIME_MP NUMBER
TIME_DP DATE
SCN_WRP NUMBER
SCN_BAS NUMBER
NUM_MAPPINGS NUMBER
TIM_SCN_MAP RAW(1200)
SCN NUMBER
ORIG_THREAD NUMBER


每隔5 分鐘,系統產生一次系統時間標記與scn 的匹配並存入sys.smon_scn_time 表,
該表中記錄了最近1440個系統時間標記與scn 的匹配記錄,由於該表只維護了最近的1440 條記錄,
因此如果使用as of timestamp 的方式則只能flashback 最近5 天內的數據(假設系統是在持續不斷
運行並無中斷或關機重啓之類操作的話)。
注意理解系統時間標記與scn 的每5 分鐘匹配一次這句話,舉個例子,
比如scn:339988,339989 分別匹配08-05-3013:52:00 和2008-13:57:00,
則當你通過as of timestamp 查詢08-05-30 13:52:00 或08-05-30 13:56:59 這段時間點內的時間時,
oracle 都會將其匹配爲scn:339988 到undo 表空間中查找,
也就說在這個時間內,不管你指定的時間點是什麼,
查詢返回的都將是08-05-30 13:52:00 這個時刻的數據。

查看SCN 和 timestamp 之間的對應關係:
TEST@orcl2> select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;

SCN TO_CHAR(TIME_DP,'YY
---------- -------------------
999115 2014-06-28 07:22:51
1020280 2014-06-28 07:29:04
1133573 2014-07-01 00:42:16
1135161 2014-07-01 00:47:14
1137299 2014-07-01 00:51:50
1137910 2014-07-01 00:52:28
1138324 2014-07-01 00:57:29
1138782 2014-07-01 01:00:59

以下省略。

4.1.5 Flashback Query 函數,存儲過程,包,觸發器等對象
Flashback Drop 可以閃回與表相關聯的對象, 如果是其他的對象,
比如function,procedure,trigger等。 這時候,
就需要使用到ALL_SOURCE 表來進行Flashback Query。

先看聯機文檔對該表的說明:
ALL_SOURCE describes the text source of the stored objects accessible to the current user.

Related Views
DBA_SOURCE describes the text source of all stored objects in the database.
USER_SOURCE describes the text source of the stored objects owned by the current user.
This view does not display the OWNER column.

Column Datatype NULL Description
OWNER VARCHAR2(30) NOT NULL Owner of the object
NAME VARCHAR2(30) NOT NULL Name of the object
TYPE VARCHAR2(12) Type of object: FUNCTION, JAVA SOURCE, PACKAGE,
PACKAGE BODY, PROCEDURE, TRIGGER, TYPE, TYPE BODY
LINE NUMBER NOT NULL Line number of this line of source
TEXT VARCHAR2(4000) Text source of the stored object
--可參見Oracle Database Reference 11g Release 2 (11.2)中ALL_SOURCE。

如果我們誤刪除了某些對象,如procedure,就可以使用all_source 表進行恢復。
TEST@orcl2> desc dba_source;
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
NAME VARCHAR2(30)
TYPE VARCHAR2(12)
LINE NUMBER
TEXT VARCHAR2(4000)

查看dba_source 的所有type
TEST@orcl2> select type from dba_source group by type;

TYPE
------------
PROCEDURE
PACKAGE
PACKAGE BODY
LIBRARY
TYPE BODY
TRIGGER
FUNCTION
JAVA SOURCE
TYPE

9 rows selected.


基於timestamp恢復的語句
SQL>SELECT text
FROM dba_source
AS OF TIMESTAMP TO_TIMESTAMP ('XXXXX', 'YYYY-MM-DD HH24:MI:SS')
WHERE owner = 'XXXX' AND name = '你刪除的對象名'
ORDER BY line;

示例:
創建函數:

SQL>
CREATE OR REPLACE function getdate return date
as
v_date date;
begin
select sysdate into v_date from dual;
return v_date;
end;
/

Function created.

查詢函數:
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

SQL> select getdate() from dual;

GETDATE()
-------------------
2011-04-07 21:02:09

 

查詢dba_source 表:

SQL> select text from dba_source where name='GETDATE' order by line;

TEXT
--------------------------------------------------------------------------------
function getdate return date
as
v_date date;
begin
select sysdate into v_date from dual;
return v_date;
end;

7 rows selected.


drop 函數,再查詢,記錄不存在

SQL> drop function getdate;

Function dropped.

SQL> select text from dba_source where name='GETDATE' order by line;

no rows selected

 

使用我們的Flashback Query 查詢:

SQL> select text from dba_source as of timestamp to_timestamp('2011-04-07 21:02:09','yyyy-mm-dd hh24:mi:ss') where name='GETDATE' order by line;

TEXT
--------------------------------------------------------------------------------
function getdate return date
as
v_date date;
begin
select sysdate into v_date from dual;
return v_date;
end;

7 rows selected.

這時候,又查看到了函數的代碼,只需要把這些代碼重新執行一下就ok了。 其他對象和這個類似。
這裏就不演示了。

4.2 Flashback version Query
相對於Flashback Query 只能看到某一點的對象狀態,
Oracle 10g引入的Flashback Version Query可以看到過去某個時間段內,
記錄是如何發生變化的。 根據這個歷史,DBA就可以快速的判斷數據是在什麼時點發生了錯誤,
進而恢復到之前的狀態。
先看一個僞列 ORA_ROWSCN. 所謂的僞列,就是假的,不存在的數據列,用戶創建表時雖然沒有指定,
但是Oracle爲了維護而添加的一些內部字段,這些字段可以像普通文件那樣的使用。
最熟悉的僞列就是 ROWID, 它相當於一個指針,指向記錄在磁盤上的位置。
ORA_ROWSCN 是Oracle 10g 新增的,暫且把它看作是記錄最後一次被修改時的SCN。
Flashback Version Query 就是通過這個僞列來跟蹤出記錄的變化歷史。

舉個例子:
SQL> select * from A;

ID
----------
2
1
3
4

SQL> insert into A values(5);

已創建 1 行。

SQL> select * from A;

ID
----------
2
1
3
4
5

SQL> commit;

提交完成。

SQL> select ora_rowscn, id from A;

ORA_ROWSCN ID
---------- ----------
1098443 2
1098443 1
1098443 3
1098443 4
1098443 5

 

獲取更多的歷史信息
SQL>Select versions_xid,versions_startscn,versions_endscn,
DECODE(versions_operation,
'I','Insert',
'U','Update',
'D','Delete', 'Original') "Operation",
id
from A versions between scn minvalue and maxvalue;

或者
SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql
from flashback_transaction_query q
where q.xid in(select versions_xid
from B versions between scn 413946 and 413959);

VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN Operatio ID
---------------- ----------------- --------------- -------- ----------
05001A0054020000 1099482 Update 3
05001A0054020000 1099482 Delete 3
05001A0054020000 1099482 Delete 2
05001A0054020000 1099482 Delete 1
0400150005020000 1098443 Insert 5

下面我們來講下僞列, Flashback Version Query 技術其實有很多僞列,
但是ORA_ROWSCN是最重要。它記錄的是最後一次被修改時的SCN, 注意是被提交的修改。
如果沒有提交,這個僞列不會發生變化。
ORA_ROWSCN 缺省是數據塊級別的,也就是一個數據塊內的所有記錄都是一個ORA_ROWSCN,
數據塊內任意一條記錄被修改,這個數據庫塊內的所有記錄的ORA_ROWSCN都會同時改變。
上例的查詢結果以證明。
不過我們可以在建表時使用關鍵字 rowdependencies, 可以改變這種缺省行爲,
使用這個關鍵字後,每條記錄都有自己的ORA_ROWSCN。

舉例:

SQL> create table B (id number(2)) rowdependencies;

表已創建。

SQL> insert into B values(1);

已創建 1 行。

SQL> insert into B values(2);

已創建 1 行

SQL> insert into B values(3);

已創建 1 行。

SQL> commit;

提交完成。

SQL> select ora_rowscn, id from B;

ORA_ROWSCN ID
---------- ----------
1100560 1
1100560 2
1100560 3
此處SCN一樣,一定很奇怪,這正好說明是最後一次被修改時的SCN,如果沒有提交,
是不會變的,我們重做一下就清楚了。

SQL> analyze table B compute statistics;

表已分析。

SQL> select ora_rowscn, id from B;

ORA_ROWSCN ID
---------- ----------
1100560 1
1100560 2
1100560 3

 

SQL> delete from B;

已刪除4行。

SQL> select ora_rowscn, id from B;

未選定行

SQL> insert into B values(1);

已創建 1 行。

SQL> commit;

提交完成。

SQL> insert into B values(2);

已創建 1 行。

SQL> commit;

提交完成。

SQL> select ora_rowscn, id from B;

ORA_ROWSCN ID
---------- ----------
1100723 1
1100729 2

 

4.3 Flashback Transaction Query
Flashback Transaction Query也是使用UNDO信息來實現。
利用這個功能可以查看某個事務執行的所有變化,它需要訪問flashback_transaction_query 視圖,
這個視圖的XID列代表事務ID,利用這個ID可以區分特定事務發生的所有數據變化。

示例:

SQL> insert into B values(3);

已創建 1 行。

SQL> commit;

提交完成。

SQL> select * from B;

ID
----------
1
2
3

 

查看視圖,每個事務都對應相同的XID

SQL>Select xid,operation,commit_scn,undo_sql
from flashback_transaction_query
where xid in (Select versions_xid
from B versions between scn minvalue and maxvalue);

或者
SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql
from flashback_transaction_query q
where q.xid in(select versions_xid
from B versions between scn 413946 and 413959);

XID OPERATION COMMIT_SCN UNDO_SQL

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

03001C006A020000 DELETE 1100723

insert into "SYS"."B"("ID") values ('4');

03001C006A020000 DELETE 1100723
insert into "SYS"."B"("ID") values ('3');

03001C006A020000 DELETE 1100723
insert into "SYS"."B"("ID") values ('2');


5 Flashback Table
注意SYS用戶不支持閃回,這點前面已經說明過。
Flashback Table也是使用UNDO tablespace的內容來實現對數據的回退。該命令相對簡單,
輸入:flashback table table_name to scn(to timestamp) 即可。

注意:如果想要對錶進行flashback,必須允許表的row movement.
SQL>Alter table table_name row movement;

要查看某表是否啓用row movement,可以到user_tables 中查詢(或all_tables,dba_tables).

例如:
SQL> select row_movement from user_tables where table_name='C';

ROW_MOVE
-------
ENABLED

要啓用或禁止某表row movement,可以通過下列語句:
--啓用
SQL> ALTER TABLE table_name ENABLE ROW MOVEMENT;

表已更改。

--禁止
SQL> ALTER TABLE table_name DISABLE ROW MOVEMENT;

表已更改。

舉例:

SQL> create table C (id number(2));

表已創建。

SQL> insert into C values(1);

已創建 1 行。

SQL> insert into C values(2);

已創建 1 行。

SQL> commit;

提交完成。

SQL> select * from c;

ID
----------
1
2

 

SQL> alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";

會話已更改。

SQL> select sysdate from dual;

SYSDATE

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

2009-10-15 21:17:47

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

1103864

 

刪除數據並恢復

SQL> delete from C;

已刪除2行。

SQL> commit;

提交完成。

SQL> alter table c enable row movement;

表已更改。

SQL> flashback table c to scn 1103864;

閃回完成。

 

或者

SQL> flashback table c to timestamp to_timestamp('2009-10-15 21:17:47','yyyy-mm-dd hh24:mi:ss');

 

SQL> select * from c;

ID
----------
1
2

Flashback table 命令支持同時操作多個表,表名中間以逗號分隔即可,
如果你執行一條flashback table命令時同時指定了多個表,
要記住單個flashback table 是在同一個事務中,因此這些表的恢復操作要麼都成功,要麼都失敗。

如:

flashback table a,b ,c to scn 1103864;

一些注意事項:
(1)基於undo 的表恢復,需要注意DDL 操作的影響。修改並提交過數據之後,對錶做過DDL 操作,
包括:drop/modify 列, move 表, drop 分區(如果有的話), truncate table/partition,
這些操作會令undo 表空間中的撤銷數據失效,對於執行過這些操作的表應用flashback query
會觸發ORA-01466 錯誤。

ORA-01466: unable to read data - table definition has changed
Cause: Query parsed after tbl (or index) change, and executed w/old snapshot
Action: commit (or rollback) transaction, and re-execute

另外一些表結構修改語句雖然並不會影響到undo 表空間中的撤銷記錄,
但有可能因表結構修改導致undo 中重做記錄無法應用的情況,比如對於增加了約束,
而flashback query 查詢出的undo 記錄已經不符合新建的約束條件,
這個時候直接恢復顯然不可能成功,你要麼暫時disable 約束,要麼通過適當邏輯,
對要恢復的數據進行處理之後,再執行恢復。
(2)基於undo 的表恢復,flashback table 實際上做的也是dml 操作(會在被操作的表上加dml 鎖),
因此還需要注意triggers 對其的影響,默認情況下,flashback table to scn/timestamp
在執行時會自動disable 掉與其操作表相關的triggers,如果你希望在此期間trigger
能夠繼續發揮做用,可以在flashback table 後附加 ENABLE TRIGGERS 子句。

6 Oracle Flashback Data Archive
在Oracle 11g裏又出了一個新特性:Oracle Flashback Data Archive.
在11g的官方文檔裏搜到了相關內容說明,參考:
Using Oracle Flashback Technology
--Using Flashback Data Archive (Oracle Total Recall)
http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17125/adfns_flashback.htm#BJFIEJGG

6.1 Flashback Data Archive 說明

官網的定義如下:
A Flashback Data Archive provides the ability to track and store transactional changes
to a table over its lifetime. A Flashback Data Archive is useful for compliance with
record stage policies and audit reports.
--Flashback Data Archive 在它的有效期內將保存事務改變的信息。
A Flashback Data Archive consists of one or more tablespaces or parts thereof.
You can have multiple Flashback Data Archives. If you are logged on as SYSDBA,
you can specify a default Flashback Data Archive for the system.
A Flashback Data Archive is configured with retention time. Data archived in the
Flashback Data Archive is retained for the retention time.
-- FDA 包含一個或者多個表空間,我們可以創建多個FDA。 當以sysdba 登陸時,
可以指定default FDA。

By default, flashback archiving is off for any table. You can enable flashback archiving
for a table if all of these conditions are true:
-- 默認情況下,FDA 是關閉的,當具備一下條件時,我們可以啓用FDA。
(1). You have the FLASHBACK ARCHIVE object privilege on the Flashback Data Archive
to use for that table.
(2). The table is neither nested, clustered, temporary, remote, or external.
(3). The table contains neither LONG nor nested columns.

After flashback archiving is enabled for a table, you can disable it only if you either
have the FLASHBACK ARCHIVE ADMINISTER system privilege or you are logged on as SYSDBA.
--當FDA 啓動以後,只有具有FLASHBACK ARCHIVE ADMINISTER 權限的用戶或者
用SYSDBA登陸的用戶纔可以禁用FDA。
When choosing a Flashback Data Archive for a specific table, consider the data
retention requirements for the table and the retention times of the Flashback
Data Archives on which you have the FLASHBACK ARCHIVE object privilege.

給用戶賦:
SQL> create user dvd identified by dvd default tablespace users temporary tablespace temp;

User created.

SQL> grant resource,connect to dvd;

Grant succeeded.


SQL> grant flashback archive administer to dvd;

Grant succeeded.

SQL> select * from dba_sys_privs where grantee='DVD';

GRANTEE PRIVILEGE ADM
----------------------- ---------------------------------------- ---
DVD FLASHBACK ARCHIVE ADMINISTER NO
DVD UNLIMITED TABLESPACE NO


在Oracle 10g中的flashback 包括: flashback version query、flashback transaction query、
flashback database、flashback table和flashback drop等特性。
在這些閃回技術當中,除了Flashback Database(依賴於閃回日誌)、
flashback drop(依賴recyclebin)之外,其他的閃回技術都是依賴於Undo撤銷數據,
都與數據庫初始化參數UNDO_RETENTION密切相關。
它們是從撤銷數據中讀取信息來構造舊數據的。這樣就有一個限制,就是undo中的信息不能被覆蓋。
而undo段是循環使用的,只要事務提交,之前的undo信息就可能被覆蓋,
雖然可以通過 undo_retention等參數來延長undo的存活期,但這個參數會影響所有的事務,
設置過大,可能導致undo tablespace快速膨脹。

Oracle 11g中flashback增加了:Flashback Data Archive 特性。
該技術與之前的Flashback的實現機制不同,
通過將變化數據另外存儲到創建的閃迴歸檔區(Flashback Archive)中,以和undo區別開來,
這樣就可以爲閃迴歸檔區單獨設置存儲策略,使之可以閃回到指定時間之前的舊數據而不影響undo策略。
並且可以根據需要指定哪些數據庫對象需要保存歷史變化數據,
而不是將數據庫中所有對象的變化數據都保存下來,這樣可以極大地減少空間需求。
Flashback Data Archive並不是記錄數據庫的所有變化,而只是記錄了指定表的數據變化。
所以,Flashback Data Archive是針對對象的保護,是Flashback Database的有力補充。
通過Flashback Data Archive,可以查詢指定對象的任何時間點(只要滿足保護策略)的數據,
而且不需要用到undo,這在有審計需要的環境,或者是安全性特別重要的高可用數據庫中,
是一個非常好的特性。缺點就是如果該表變化很頻繁,對空間的要求可能很高。

閃回數據歸檔區
閃回數據歸檔區是閃回數據歸檔的歷史數據存儲區域,在一個系統中,
可以有一個默認的閃回數據歸檔區,也可以創建其他許多的閃回數據歸檔區域。
每一個閃回數據歸檔區都可以有一個唯一的名稱。同時,
每一個閃回數據歸檔區都對應了一定的數據保留策略。
例如可以配置歸檔區FLASHBACK_DATA_ARCHIVE_1中的數據保留期爲1年,
而歸檔區FLASHBACK_DATA_ARCHIVE_2的數據保留期爲2天或者更短。
以後如果將表放到對應的閃回數據歸檔區,則就按照該歸檔區的保留策略來保存歷史數據。
閃回數據歸檔區是一個邏輯概念,是從一個或者多個表空間中拿出一定的空間,來保存表的修改歷史,
這樣就擺脫了對Undo撤銷數據的依賴,不利用undo就可以閃回到歸檔策略內的任何一個時間點上。

Flashback archive相關數據字典
*_FLASHBACK_ARCHIVE
Displays information about Flashback Data Archive files.

*_FLASHBACK_ARCHIVE_TS
Displays tablespaces of Flashback Data Archive files.

*_FLASHBACK_ARCHIVE_TABLES
Displays information about tables that are enabled for Data Flashback Archive files.

* 代表DBA 或者User。


Flashback archive的後臺進程
Oracle11g爲Flashback data archive特性專門引入了一個新的後臺進程FBDA,
用於將追蹤表(traced table,也就是將指定使用flashback data archive的table)
的歷史變化數據轉存到閃迴歸檔區。

SQL> select name,description from v$bgprocess where name='FBDA';

NAME DESCRIPTION
----- -----------------------------------------------------------
FBDA Flashback Data Archiver Process

Flashback archive 的限制條件
(1)Flashback data archive只能在ASSM的tablespace上創建
(2)Flashback data archive要求必須使用自動undo管理,
即 undo_management 參數爲auto

6.2 Flashback Data Archive 的相關操作
Create a Flashback Data Archive with the CREATE FLASHBACK ARCHIVE statement, specifying:
(1)Name of the Flashback Data Archive
(2)Name of the first tablespace of the Flashback Data Archive
(3)(Optional) Maximum amount of space that the Flashback Data Archive can use
in the first tablespace。The default is unlimited. Unless your space quota
on the first tablespace is also unlimited, you must specify this value;
otherwise, error ORA-55621 occurs.

ORA-55621: User quota on tablespace "string" is not enough for Flashback Archive
Cause: An attempt was made to create or alter a Flashback Archive quota
which is larger than the user's quota.
Action: No action required.
(4)Retention time (number of days that Flashback Data Archive data for the
table is guaranteed to be stored)

-- 創建FDA 時,可以指定以上4個參數,沒有沒有執行Flashback Archive 的配額,
默認爲 unlimited。 這裏的配額,指的是用戶對錶空間的配額。

If you are logged on as SYSDBA, you can also specify that this is the default Flashback
Data Archive for the system. If you omit this option, you can still make this Flashback
Data Archive the default later .
-- 如果以SYSDBA 登陸,還可以指定default Flashback Data Archive。
如果沒有指定,也可以通過alter flashback archive 命令來指定。

示例:

(1). 先創建幾個測試的表空間
SQL> create tablespace FDA1 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA01.dbf' size 100M;
Tablespace created.
SQL> create tablespace FDA2 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA02.dbf' size 100M;
Tablespace created.
SQL> create tablespace FDA3 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA03.dbf' size 100M;
Tablespace created.
SQL> create tablespace FDA4 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA04.dbf' size 100M;
Tablespace created.

(2). 創建一個默認的Flashback Archive, 配額爲10M,數據保留期爲1年
SQL> create flashback archive default fla1 tablespace fda1 quota 10M retention 1 year;
默認的Flashback Archive 只能有一個:
SQL> create flashback archive default fla3 tablespace fda1 quota 10M retention 1 year;
create flashback archive default fla3 tablespace fda1 quota 10M retention 1 year

*
ERROR at line 1:

ORA-55609: Attempt to create duplicate default Flashback Archive

這裏報錯了,我們可以使用alter flashback 來修改默認的Flashback Archive.

(3) 創建一個Flashback Archive fla2,使用默認配額unlimited。 retention 爲2 年。
SQL> create flashback archive fla2 tablespace fda2 retention 2 year;
Flashback archive created.

根據官網的說法,這種情況下,用戶對該表空間的配額也必須爲ulimited。
否則就會報錯ORA-55621。

測試一下:

SQL> conn / as sysdba;
Connected.
SQL> revoke unlimited tablespace from dvd;
Revoke succeeded.
SQL> alter user dvd quota 10m on fda4;
User altered.
SQL> conn dvd/dvd;
Connected.
SQL> create flashback archive fla5 tablespace fda4 retention 1 day;
create flashback archive fla5 tablespace fda4 retention 1 day
*
ERROR at line 1:
ORA-55621: User quota on tablespace "FDA4" is not enough for Flashback Archive

報錯。

修改用戶的配額,再創建,成功:

SQL> conn / as sysdba;
Connected.

SQL> grant unlimited tablespace to dvd;
Grant succeeded.

SQL> conn dvd/dvd;
Connected.

SQL> create flashback archive fla5 tablespace fda4 retention 1 day;
Flashback archive created.

 

6.2.2 Altering a Flashback Data Archive
With the ALTER FLASHBACK ARCHIVE statement, you can:
-- 使用alter flashback archive 可以修改如下內容:
(1)Change the retention time of a Flashback Data Archive
(2)Purge some or all of its data
(3)Add, modify, and remove tablespaces

Note:
Removing all tablespaces of a Flashback Data Archive causes an error.
If you are logged on as SYSDBA, you can also use the ALTER FLASHBACK ARCHIVE statement
to make a specific file the default Flashback Data Archive for the system.
-- 不能移除Flashback Data Archive裏的所有表空間。 否則報錯。
如果用sysdba 登陸,可以修改默認的Flashback archive。

示例:
6.2.2.1 將Flashback Data Archive 修改爲default FA
先用我們具有flashback archive administer 權限的用戶試試:

SQL> conn dvd/dvd;
Connected.
SQL> alter flashback archive fla1 set default;
alter flashback archive fla1 set default

*

ERROR at line 1:
ORA-55611: No privilege to manage default Flashback Archive
報錯,沒有權限,用sysdba 測試成功:

SQL> conn / as sysdba;
Connected.
SQL> alter flashback archive fla1 set default;
Flashback archive altered.

注意一點,只能有一個默認的Flashback archive.

SQL> select flashback_archive_name name, status from dba_flashback_archive;

NAME STATUS
---------- -------
FLA1 DEFAULT

FLA2

當前默認的Flashback Archive 是FLA1,我們將默認改成FLA2,在查看:

SQL> alter flashback archive fla2 set default;
Flashback archive altered.

 

SQL> select flashback_archive_name name, status from dba_flashback_archive;

NAME STATUS
---------- -------
FLA1
FLA2 DEFAULT

 

6.2.2.2 爲已經存在的Flashback Archive 添加表空間,並指定配額

SQL> alter flashback archive fla1 add tablespace fda3 quota 20M;
Flashback archive altered.

6.2.2.3 爲已經存在的Flashback Archive 添加表空間,不指定配額,即需要多少用多少空間

SQL> alter flashback archive fla1 add tablespace fda4;
Flashback archive altered.


6.2.2.4 修改已經存在的Flashback Archive的配額

SQL> alter flashback archive fla1 modify tablespace fda1 quota 20m;
Flashback archive altered.

6.2.2.5 修改配額不受限制

SQL> alter flashback archive fla1 modify tablespace fda1;
Flashback archive altered.

6.2.2.6 修改Flashback Archive 的retention time

SQL> alter flashback archive fla1 modify retention 2 year;
Flashback archive altered.

SQL> alter flashback archive fla1 modify retention 1 month;
Flashback archive altered.

SQL> alter flashback archive fla1 modify retention 2 month;
Flashback archive altered.

SQL> alter flashback archive fla1 modify retention 2 day;
Flashback archive altered.

SQL> alter flashback archive fla1 modify retention 1 day;
Flashback archive altered.

6.2.2.7 將表空間從Flashback Archive中移除
SQL> alter flashback archive fla1 remove tablespace fda4;

Flashback archive altered.
-- 注意,這裏移除的僅僅是Flashback Archive中的信息,表空間不會被刪除。

 

6.2.2.8 清空Flashback Archive中的所有歷史記錄
SQL> alter flashback archive fla1 purge all;
Flashback archive altered.


6.2.2.9 清空Flashback Archive 中超過1天的歷史數據

SQL> alter flashback archive fla1 purge before timestamp (systimestamp - interval '1' day);
Flashback archive altered.

6.2.2.10 清空Flashback Archive 中指定SCN 之前的所有歷史數據

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
1315755078

 

SQL> alter flashback archive fla1 purge before scn 1315755078;
Flashback archive altered.


我這裏只是演示一個SCN。 具體要結合自己的情況。


6.2.3 Dropping a Flashback Data Archive
Drop a Flashback Data Archive with the DROP FLASHBACK ARCHIVE statement.
Dropping a Flashback Data Archive deletes its historical data, but does not drop
its tablespaces.
-- 刪除Flashback Archive 不會刪除相應的表空間

示例:

SQL> DROP FLASHBACK ARCHIVE fla2;
Flashback archive dropped.

SQL> select flashback_archive_name name, status from dba_flashback_archive;

NAME STATUS
---------- -------
FLA1


6.2.4 Specifying the Default Flashback Data Archive
By default, the system has no default Flashback Data Archive.
If you are logged on as SYSDBA, you can specify default Flashback Data Archive
in either of these ways:
--默認情況下,沒有default Flashback Data Archive. 當以sysdba 登陸之後,就可以指定它。

6.2.4.1 修改已經存在的Flashback Archive 爲default

SQL> alter flashback archive fla1 set default;
Flashback archive altered.

SQL> alter flashback archive fla10 set default;

alter flashback archive fla10 set default

*
ERROR at line 1:
ORA-55605: Incorrect Flashback Archive is specified


如果指定的Flashback 不存在,就報錯。


6.2.4.2 在創建Flashback Data Archive 時,指定default
SQL>create flashback archive default fla2 tablespace tbs1 quota 10m retention 1 year;

The default Flashback Data Archive for the system is the default Flashback Data Archive
for every user who does not have his or her own default Flashback Data Archive.


6.2.5 Enabling and Disabling Flashback Data Archive
By default, flashback archiving is disabled for any table.
You can enable flashback archiving for a table if you have the FLASHBACK ARCHIVE
object privilege on the Flashback Data Archive to use for that table.
默認情況下,所有表都沒有啓動flashback archive。
To enable flashback archiving for a table, include the FLASHBACK ARCHIVE clause
in either the CREATE TABLE or ALTER TABLE statement.
In the FLASHBACK ARCHIVE clause, you can specify the Flashback Data Archive
where the historical data for the table are stored. The default is the
default Flashback Data Archive for the system. If you specify a nonexistent
Flashback Data Archive, an error occurs.

If you enable flashback archiving for a table, but AUM(automatic undo managed) is disabled,
error ORA-55614 occurs when you try to modify the table.
ORA-55614: AUM needed for transactions on tracked tables
Cause: An attempt was made to execute DML on a tracked table without enabling Auto Undo Management.
Action: Disable tracking on the table or enable Auto Undo Management.

If a table has flashback archiving enabled, and you try to enable it again with a
different Flashback Data Archive, an error occurs

After flashback archiving is enabled for a table, you can disable it only if you
either have the FLASHBACK ARCHIVE ADMINISTER system privilege or you are logged on
as SYSDBA.

To disable flashback archiving for a table, specify NO FLASHBACK ARCHIVE in the
ALTER TABLE statement. (It is unnecessary to specify NO FLASHBACK ARCHIVE
in the CREATE TABLE statement, because that is the default.)

示例:

6.2.5.1 創建table,使用默認的Flashback Data Archive 來存儲歷史數據

SQL> create table test1 (id number) flashback archive;
Table created.

6.2.5.2 創建table,使用指定的Flashback Data Archive 來存儲歷史數據


SQL> create table test2 (id number) flashback archive fla1;
Table created.


6.2.5.3 對錶啓用Flashback archive,並使用默認的Flashback archive。
SQL> alter table test3 flashback archive;
Table altered.

 

6.2.5.4 禁用表的Flashback Archive

SQL> alter table test3 no flashback archive;
Table altered.

 

6.2.5.5 對table 啓用Flashback archive,並指定Flashaback Archive 區。

SQL> alter table test3 flashback archive fla1;
Table altered.

 

6.2.6 DDL Statements on Tables Enabled for Flashback Data Archive
Flashback Data Archive supports many DDL statements, including some that
alter the table definition or move data. For example:
--啓動Flashback Data Archive的表支持以下的DDL 操作
(1)ALTER TABLE statement that does any of the following:
1)Adds, drops, renames, or modifies a column
2)Adds, drops, or renames a constraint
3)Drops or truncates a partition
or subpartition operation
(2)TRUNCATE TABLE statement
(3)RENAME statement that renames a table

Some DDL statements cause error ORA-55610 when used on a table enabled for
Flashback Data Archive. For example:
-- 啓動Flashback Data Archive的表上的一些DDL 操作可能觸發ORA-55610的錯誤,
這些DDL 如下:
(1)ALTER TABLE statement that includes an UPGRADE TABLE clause,
with or without an INCLUDING DATA clause
(3)ALTER TABLE statement that moves or exchanges a partition
or subpartition operation
(3)DROP TABLE statement

ORA-55610: Invalid DDL statement on history-tracked table
Cause: An attempt was made to perform certain DDL statement that is disallowed on tables
that are enabled for Flashback Archive.
Action: No action required.

If you must use unsupported DDL statements on a table enabled for Flashback Data Archive,
use the DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA procedure to disassociate the base table
from its Flashback Data Archive.
To reassociate the Flashback Data Archive with the base table afterward,
use the DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA procedure.
-- 如果必須在已經啓用Flashback Archive的表上執行這些不支持的DDL 操作,
可以用DBMS_FLASHBACK_ARCHIVE 包將表從Flashback Data Archive 分離出來,
待操作結束後再添加進去。

The DBMS_FLASHBACK_ARCHIVE package contains two simple procedures for disassociation
and reassociation of a Flashback Data Archive (FDA) enabled table from/with
its underlying FDA respectively.
在Flashback Area中,會有一張歷史表記錄着我們啓動FA表的所有操作。
我們可以通過如下SQL 來查看他們之間的映射關係。

SQL> SELECT table_name,archive_table_name,status from dba_flashback_archive_tables;

TABLE_NAME ARCHIVE_TABLE_NAME STATUS
---------- -------------------- --------
test1 SYS_FBA_HIST_78429 ENABLED
test2 SYS_FBA_HIST_78431 ENABLED
ORA SYS_FBA_HIST_78448 ENABLED
test3 SYS_FBA_HIST_78456 ENABLED
HUAINING SYS_FBA_HIST_78464 ENABLED
QS SYS_FBA_HIST_78472 ENABLED
FA SYS_FBA_HIST_78484 ENABLED

 

7 rows selected.


我們要執行那些不支持的DDL,就需要用dbms_flashback_archive禁用他們之間的映射關係,
在操作,操作完在用該包啓用他們。

關於dbms_flashback_archive包的使用,參考官網:
DBMS_FLASHBACK_ARCHIVE
http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_flashb_archive.htm#ARPLS72464

 

示例:

SQL> drop table test1;

drop table test1

*

ERROR at line 1:

ORA-55610: Invalid DDL statement on history-tracked table

這個表使我們之前創建的,並啓用了Flashback Archive.

 

表的分離和重新結合:

SQL> exec dbms_flashback_archive.disassociate_fba('SYS','test1');
PL/SQL procedure successfully completed.
SQL> exec dbms_flashback_archive.reassociate_fba('SYS','test1');
PL/SQL procedure successfully completed.


最後我們再分離,再drop table:

SQL> exec dbms_flashback_archive.disassociate_fba('SYS','test1');
PL/SQL procedure successfully completed.

 

SQL> drop table test1;

drop table test1

*

ERROR at line 1:

ORA-55610: Invalid DDL statement on history-tracked table

 

drop 失敗。


google 一下,說是bug:9650074
9650074 ORA-55633 in Flashback data archive DDL support area。

ORA-55633: Cannot do DDL on Flashback Data Archive enabled table
Cause: An attempt was made to do DDL on tracked tables while one DDL is runnning.
Action: Retry the DDL at a later time.


6.3 一個用Flashback Data Archive 恢復數據的測試

這個測試使用之前的Flashback Archive: fla1.

創建測試表:

SQL> create table fa(id number) flashback archive;
Table created.


插入數據:

SQL> declare
2 i number;
3 begin
4 for i in 1..100 loop
5 insert into fa values(i);
6 end loop;
7 commit;
8 end;
9 /

PL/SQL procedure successfully completed.

 

SQL> select count(*) from fa;

COUNT(*)
----------
100

 

查詢時間:

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;

TM
-------------------
2011-05-11 15:33:35

 

再update 一次數據:

SQL> update fa set id=200 where id <50;
49 rows updated.
SQL>commit;

 

再查詢一次時間:

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;

TM
-------------------
2011-05-11 15:35:23

 


使用Flashback Archive查詢1分鐘之前的數據:
SQL> select count(*) from fa as of timestamp (systimestamp - interval '1'minute);

COUNT(*)
----------
100

 

使用Flashback Archive查詢10分鐘之前的數據:

SQL> select count(*) from fa as of timestamp (systimestamp - interval '10'minute);

COUNT(*)
----------
0

 

這裏顯示爲0. 因爲我們還沒有做DML 操作。


或者使用時間來查:

SQL> select count(*) from fa as of timestamp to_timestamp('2011-05-11 15:35:23','yyyy-mm-dd hh24:mi:ss');

COUNT(*)
----------
100

 

SQL> delete from fa;
100 rows deleted
SQL> commit;
Commit complete.
SQL> select count(*) from fa as of timestamp (systimestamp - interval '1'minute);

COUNT(*)
----------
100

 

根據時間的不同,查詢的結果也不一樣。 下面我們來確認下這個問題:

 

SQL> SELECT * from dba_flashback_archive_tables;

TABLE_NAME OWNER_NAME FLASHBACK_ARCHI ARCHIVE_TABLE_NAME STATUS
---------- ---------- --------------- -------------------- --------
FA SYS FLA1 SYS_FBA_HIST_78484 ENABLED

 

從這個結果,可以看出,在Flashback archive對應的FA錶的歷史表是SYS_FBA_HIST_78484。

該表保存了FA表的所有的操作記錄:

SQL> select count(*) from SYS_FBA_HIST_78484;

COUNT(*)
----------
149

 

SQL> desc SYS_FBA_HIST_78484

Name Null? Type
----------------------------------------- -------- ---------------
RID VARCHAR2(4000)
STARTSCN NUMBER
ENDSCN NUMBER
XID RAW(8)
OPERATION VARCHAR2(1)
ID NUMBER

 

注意一點:我們不能對這些歷史表做任何修改操作,只能查詢。
如果想對這些歷史表進行相關的修改操作,和之前的操作一樣:
使用dbms_flashback_archive分離2個表之間的關係。

如:
sql> exec dbms_flashback_archive.disassociate_fba('scott','emp_test');
sql> exec dbms_flashback_archive.reassociate_fba('scott','emp_test');

閃迴歸檔:

實驗:閃迴歸檔

1.create tablespace arch_tbs datafile '/u01/app/oracle/oradata/PROD/arch_tbs.dbf' size 100m autoextend on maxsize 1G;

2.create user archive_admin identified by archive_admin default tablespace arch_tbs;

3.grant dba,flashback archive administer to archive_admin;

4.conn archive_admin/archive_admin
create flashback archive fda1 tablespace arch_tbs quota 10m retention 1 year;

5.alter flashback archive fdb1 set default;
--sys用戶下
6.alter table test_user1.emp flashback archive;

7.select * from test_user1.emp as of timestamp(timestamp - interval '20' minute);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章