Oracle Flashback 技術 總結

roominess發表於2012-03-31

寫在前面:

            2009年的時候結合網上的資料整理了下Flashback的用法。 20115月份起,把我這幾年來的整理的資料又重新進行了一個整理,暫定為《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 DropFlashback 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>

 

 

注意:

1DB_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_destlog_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.

 

 

同時,oraclealert中還會給出解決該問題的建議
************************************************************************
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備份中支援對該區域的備份。

 

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

 

10goracle又引入了新的flashback功能,使用了flash recovery area來儲存flashback 1og等等。這個區域預設建立在oracle_base目錄下。在其中可以存放備份集、映象拷貝、歸檔日誌、自動備份的控制檔案以及spfileflashback logs存放位置和大小由引數db_recovery_file_destdb_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 可以看作是不完全恢復的替代技術。 但它也有某些限制:

            1Flashback 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 QueryFlashback 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;

未選定行

 

檢視刪除之前的狀態:假設當前距離刪除資料已經有分鐘左右的話:

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 timestamporacle 也會將其轉換成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

 

            每隔分鐘,系統產生一次系統時間標記與scn 的匹配並存入sys.smon_scn_time ,該表中記錄了最近1440個系統時間標記與scn 的匹配記錄,由於該表只維護了最近的1440 條記錄,因此如果使用as of timestamp 的方式則只能flashback 最近天內的資料(假設系統是在持續不斷執行並無中斷或關機重啟之類操作的話)。

 

            注意理解系統時間標記與scn 的每分鐘匹配一次這句話,舉個例子,比如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:339988undo 表空間中查詢,也就說在這個時間內,不管你指定的時間點是什麼,查詢返回的都將是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 可以閃回與表相關聯的物件, 如果是其他的物件,比如functionproceduretrigger等。 這時候,就需要使用到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

 

 

如果我們誤刪除了某些物件,如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 queryflashback transaction queryflashback databaseflashback tableflashback drop等特性。

            在這些閃回技術當中,除了Flashback Database(依賴於閃回日誌)之外,其他的閃回技術都是依賴於Undo撤銷資料,都與資料庫初始化引數UNDO_RETENTION密切相關。

            它們是從撤銷資料中讀取資訊來構造舊資料的。這樣就有一個限制,就是undo中的資訊不能被覆蓋。而undo段是迴圈使用的,只要事務提交,之前的undo資訊就可能被覆蓋,雖然可以通過 undo_retention等引數來延長undo的存活期,但這個引數會影響所有的事務,設定過大,可能導致undo tablespace快速膨脹。

 

            Oracle 11gflashback增加了: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的後臺程式

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


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

NAME  DESCRIPTION

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

FBDA  Flashback Data Archiver Process

 

 

 

Flashback archive 的限制條件

            1Flashback data archive只能在ASSMtablespace上建立
            
2Flashback data archive要求必須使用自動undo管理,

                         undo_management 引數為auto

 

2.4.6.2  Flashback Data Archive 的相關操作

2.4.6.2.1 Creating a Flashback Data Archive

            Create a Flashback Data Archive with the CREATE FLASHBACK ARCHIVE statement, specifying:

            1Name of the Flashback Data Archive

2Name 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 tablespaceThe default is unlimited. Unless your space quota on the first tablespace is also unlimited, you must specify this value; otherwise, error ORA-55621 occurs.

4Retention 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 年。

 

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 可以修改如下內容:

            1Change the retention time of a Flashback Data Archive

            2Purge some or all of its data

            3Add, 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 操作

            1ALTER TABLE statement that does any of the following:

                                    1Adds, drops, renames, or modifies a column

                                    2Adds, drops, or renames a constraint

                                    3Drops or truncates a partition or subpartition operation

            2TRUNCATE TABLE statement

            3RENAME 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 如下:

            1ALTER TABLE statement that includes an UPGRADE TABLE clause, with or without an INCLUDING DATA clause

            3ALTER TABLE statement that moves or exchanges a partition or subpartition operation

            3DROP 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 一下,說是bug9650074

 

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章