Oracle Flashback 技術 總結
寫在前面:
2009年的時候結合網上的資料整理了下Flashback的用法。 2011年5月份起,把我這幾年來的整理的資料又重新進行了一個整理,暫定為《David Dai Oracle 學習手冊》, 等第一版整理完會免費上傳到網路。 對Flashback 這塊又重新整理了一下。 這個比之前的版本要完整很多,內容上也要更加嚴謹一些。
所以對這塊先更新到blog上來。 以方便大家對Oracle的學習。
Dave
2011-6-19
2.4 Flashback
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。
2.4.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等,放到這個區域集中管理。
2.4.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;
2.4.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 的話,該引數的值意義是不一樣的
2.4.1.3 閃回恢復區的內容
所有和恢復相關的檔案都可以存放到閃回恢復區
SQL> 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行。
上面檢視中查詢的結果列出的所有型別的檔案,都可以利用閃回恢復區來存放、管理。
在一些 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>
2.4.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的閃回恢復區必須位於共享磁碟上,能被所有例項訪問。
2.4.1.5 閃回恢復區的空間管理
閃回恢復區中新增或刪除檔案等變化都將記錄在資料庫的 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中還會給出解決該問題的建議
************************************************************************
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檢視 包含閃回恢復區的相關資訊:
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;
NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
---------- ----------- ---------- ----------------- ---------------
4039114752 0 0 0
通過查詢檢視v$flash_recovery_area_usage,可以獲得當前閃回恢復區的空間使用情況,並且可以知道是哪些檔案佔中了空間,據此可以做出相應的處理,或者加大閃回恢復區,或者移走相應的檔案。
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
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住。所以,對於生產庫,如果將歸檔放到閃回恢復區中,需要密切關注閃回恢復區的空間使用情況,否則一旦閃回恢復區的空間用盡,將導致資料庫無法提供服務。
2.4.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
可以看到,這裡已經有2.1231G使用了,這說明我們剛開始設定的db_recovery_file_dest_size=2G不足,導致online redo log無法歸檔,在這裡,我們通過設定db_recovery_file_dest_size引數,增大了flash recovery area來解決這個問題。
增加Flash recovery area 是一種解決方法,也可以將歸檔指定到其他的目錄來解決這個問題。 或者備份資料庫,在刪除一些歸檔檔案,來釋放Flash recovery area。 都可以解決問題。
2.4.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.4.2 Flashback Database
2.4.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.4.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@dba ~]$ ps -ef|grep rvw
oracle 12620 12589 0 13:21 pts/1 00:00:00 grep rvw
2.4.2.3 啟用Flashback Database 步驟
資料庫的Flashback Database功能預設是關閉的,要想啟用這個功能,就需要做如下配置。
2.4.2.3.1. 配置Flash Recovery Area
這個參考2.4.1.1 節的配置。
2.4.2.3.2. 啟動flashback database
預設情況資料庫的flashback database是關閉,可以在mount exclusive狀態下開啟。在設定了閃回恢復區後,可以啟動閃回資料庫功能。
SQL> archive log list; --資料庫必須已經處於歸檔模式
資料庫日誌模式 存檔模式
自動存檔 啟用
存檔終點 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
2.4.2.4 Flashback Database操作示例
做操作前先備份資料庫: RMAN> backup database;
2.4.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.4.2. 檢查是否啟用了歸檔
SQL> archive log list;
資料庫日誌模式 存檔模式
自動存檔 啟用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 9
下一個存檔日誌序列 11
當前日誌序列 11
2.4.2.4.3. 檢查是否啟用了flashback database
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
2.4.2.4.4. 查詢當前的scn
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
947921
2.4.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.2.4.6. 刪除表A
SQL> select * from A;
ID NAME
---------- ----------
1 tianlesoftware
2 dave
SQL> drop table A;
表已刪除。
SQL> commit;
2.4.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.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.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.4.2.5 和Flashback Database 相關的3個檢視
2.4.2.5.1. V$database
這個檢視可以檢視是否啟用了Flashback database功能
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
2.4.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 hh2
4:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es
from v$flashback_database_log;
OS OT RT FS ES
---------- ----------------- ---------- ---------- ----------
946088 09-10-14 13:49:59 1440 16384000 350920704
2.4.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
2.4.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來實現。
2.4.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.
From:
http://download.oracle.com/docs/cd/E11882_01/server.112/e17120/tables011.htm#ADMIN11679
初始化引數recyclebin 用於控制是否啟用recyclebin功能,預設是ON, 可以使用OFF關閉。
SQL> 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中的物件。
也可以手動的刪除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所佔用的空間來緩解空間壓力。 因為索引是可以重建的。
2.4.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中的物件,只支援查詢.
2.4.4 Flashback Query
Flashback 是ORACLE 自9i 就開始提供的一項特性,在9i 中利用oracle 查詢多版本一致的特點,實現從回滾段中讀取表一定時間內操作過的資料,可用來進行資料比對,或者修正意外提交造成的錯誤資料,該項特性也被稱為Flashback Query。
Flashback Query分Flashback Query,Flashback Version Query, Flashback Transaction Query 三種。
2.4.4.1 Flashback Query
Flashback Query 是利用多版本讀一致性的特性從UNDO 表空間讀取操作前的記錄資料。
flashback query 對v$tables,x$tables 等動態效能檢視無效,不過對於dba_*,all_*,user_*等資料字典是有效的。
該特性也完全支援訪問遠端資料庫,比如select * from tbl@dblink as of scn 3600;的形式。
2.4.4.1.1 多版本讀一致性
不同的事務在寫資料時,會將資料的前映像寫入undo 表空間,這樣如果同時有其它事務查詢該表資料,則可以通過undo 表空間中資料的前映像來構造所需的完整記錄集,而不需要等待寫入的事務提交或回滾。
Flashback query 有多種方式構建查詢記錄集,記錄集的選擇範圍可以基於時間或基於scn,甚至可以同時查詢出記錄在undo 表空間中不同事務時的前映象。 用法與標準查詢非常類似,要通過flashback query 查詢undo 中的撤銷資料,最簡單的方式只需要在標準查詢語句的表名後面跟上as of timestamp(基於時間)或as of scn(基於scn)即可。
as of timestamp|scn 的語法是自9iR2 後才開始提供支援。
2.4.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 方式則能夠確保記錄的約束一致性。
2.4.4.1.3. As of scn 示例
檢視SCN:
SQL>SELECT dbms_flashback.get_system_change_number FROM dual;
SQL>SELECT CURRENT_SCN FROM V$DATABASE;
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
2.4.4.1.4 SCN 與 timestamp 關係
Oracle 在內部都是使用scn,即使你指定的是as of timestamp,oracle 也會將其轉換成scn,系統時間標記與scn 之間存在一張表,即SYS 下的SMON_SCN_TIME
SQL> desc sys.smon_scn_time
名稱 是否為空? 型別
----------------------------------------- -------- --------------------------
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 之間的對應關係:
SQL>select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
2.4.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.
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 |
如果我們誤刪除了某些物件,如procedure,就可以使用all_source 表進行恢復。
SQL> desc dba_source
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
NAME VARCHAR2(30)
TYPE VARCHAR2(12)
LINE NUMBER
TEXT VARCHAR2(4000)
檢視dba_source 的所有type
SQL> select type from dba_source group by type;
TYPE
------------
PROCEDURE
PACKAGE
PACKAGE BODY
TYPE BODY
TRIGGER
FUNCTION
TYPE
7 rows selected.
基於timestamp恢復的語句
SQL>SELECT text
FROM dba_source
AS OF TIMESTAMP TO_TIMESTAMP ('XXXXX', 'YYYY-MM-DD HH24:MI:SS')
WHERE wner = '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了。 其他物件和這個類似。 這裡就不演示了。
2.4.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
2.4.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');
2.4.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 錯誤。
另外一些表結構修改語句雖然並不會影響到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 子句。
2.4.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
2.4.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中的lashback 包括: flashback version query、flashback transaction query、flashback database、flashback table和flashback drop等特性。
在這些閃回技術當中,除了Flashback Database(依賴於閃回日誌)之外,其他的閃回技術都是依賴於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
2.4.6.2 Flashback Data Archive 的相關操作
2.4.6.2.1 Creating a Flashback Data ArchiveCreate 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.
(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.
2.4.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。
示例:
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
2.2.2 為已經存在的Flashback Archive 新增表空間,並指定配額
SQL> alter flashback archive fla1 add tablespace fda3 quota 20M;
Flashback archive altered.
2.2.3 為已經存在的Flashback Archive 新增表空間,不指定配額,即需要多少用多少空間
SQL> alter flashback archive fla1 add tablespace fda4;
Flashback archive altered.
2.2.4 修改已經存在的Flashback Archive的配額
SQL> alter flashback archive fla1 modify tablespace fda1 quota 20m;
Flashback archive altered.
2.2.5 修改配額不受限制
SQL> alter flashback archive fla1 modify tablespace fda1;
Flashback archive altered.
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.
2.2.7 將表空間從Flashback Archive中移除
SQL> alter flashback archive fla1 remove tablespace fda4;
Flashback archive altered.
-- 注意,這裡移除的僅僅是Flashback Archive中的資訊,表空間不會被刪除。
2.2.8 清空Flashback Archive中的所有歷史記錄
SQL> alter flashback archive fla1 purge all;
Flashback archive altered.
2.2.9 清空Flashback Archive 中超過1天的歷史資料
SQL> alter flashback archive fla1 purge before timestamp (systimestamp - interval '1' day);
Flashback archive altered.
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。 具體要結合自己的情況。
2.4.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
2.4.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 登陸之後,就可以指定它。
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 不存在,就報錯。
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.
2.4.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.
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.)
示例:
2.5.1 建立table,使用預設的Flashback Data Archive 來儲存歷史資料
SQL> create table 安慶 (id number) flashback archive;
Table created.
2.5.2 建立table,使用指定的Flashback Data Archive 來儲存歷史資料
SQL> create table 懷寧 (id number) flashback archive fla1;
Table created.
2.5.3 對錶啟用Flashback archive,並使用預設的Flashback archive。
SQL> alter table dave flashback archive;
Table altered.
2.5.4 禁用表的Flashback Archive
SQL> alter table dave no flashback archive;
Table altered.
2.5.5 對table 啟用Flashback archive,並指定Flashaback Archive 區。
SQL> alter table dave flashback archive fla1;
Table altered.
2.4.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
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
---------- -------------------- --------
ANQING SYS_FBA_HIST_78429 ENABLED
懷寧 SYS_FBA_HIST_78431 ENABLED
ORA SYS_FBA_HIST_78448 ENABLED
DVD 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 懷寧;
drop table 懷寧
*
ERROR at line 1:
ORA-55610: Invalid DDL statement on history-tracked table
這個表使我們之前建立的,並啟用了Flashback Archive.
表的分離和重新結合:
SQL> exec dbms_flashback_archive.disassociate_fba('SYS','懷寧');
PL/SQL procedure successfully completed.
SQL> exec dbms_flashback_archive.reassociate_fba('SYS','懷寧');
PL/SQL procedure successfully completed.
最後我們在分離,在drop table:
SQL> exec dbms_flashback_archive.disassociate_fba('SYS','懷寧');
PL/SQL procedure successfully completed.
SQL> drop table 懷寧;
drop table 懷寧
*
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
結果metalink 又不讀開,這個網路啊。 先不研究了。
2.4.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');
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15880878/viewspace-720061/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Flashback技術總結Oracle
- Oracle 10g Flashback 技術小結(zt)Oracle 10g
- oracle flashback技術詳解Oracle
- oracle11g flashback技術Oracle
- Oracle Flashback 技術大解密Oracle解密
- oracle flashback特性學習總結Oracle
- Oracle閃回技術--Flashback Version QueryOracle
- flashback技術之---flashback query
- flashback技術之---flashback drop
- flashback技術之---flashback table
- flashback技術之---flashback databaseDatabase
- flashback技術之---flashback Transaction Query
- flashback技術之---flashback version query
- flashback總結三之Flashback_DROP
- flashback總結一之Flashback_DatabaseDatabase
- flashback總結四之Flashback_Query
- Oracle Database 11g閃回技術flashbackOracleDatabase
- Flashback閃回技術
- flashback總結六之Flashback_Transaction_Query
- CMake技術總結
- WPF技術總結
- BypassUAC技術總結
- easyui技術總結UI
- 最近技術總結
- docker技術總結Docker
- flashback總結五之Flashback_Query_Version(上)
- 個人技術棧總結
- 池化技術總結
- Jsp技術總結JS
- 智慧控制技術總結
- docker技術總結(二)Docker
- Oracle分割槽技術-- interval parition實驗及總結Oracle
- flashback database的一點總結Database
- oracle RAC術語總結Oracle
- flashback總結五之Flashback_Query_Version(下)_補充
- 特徵選擇技術總結特徵
- #web前端技術使用總結Web前端
- MySQL分頁技術總結MySql