還原點和閃回資料庫

leixue0906發表於2015-01-31

閃回資料庫和還原點是兩種與資料恢復相關的功能,它們用來替代按時間點恢復來撤消對資料庫的改變。閃回資料庫能讓你將整個資料庫進行回滾,使用指定時間視窗來撤消對資料庫的改變。這類似於資料庫的按時間點恢復。

還原點提供了與閃回資料庫相關的能力它是另一種恢復操作。受保護的還原點,在特定的情況下,提供了閃回資料庫完整的功能,允許你選擇一個SCN並強制要求閃回資料庫對這個SCN是可用的。

還原點和閃回資料庫可以單獨使用也可以一起使用。在這兩種情況下,RMAN的flashback database命令或者flashback database語句實際上將資料庫還原到一個指定的SCN所對應的狀態,例如:

flashback database to restore point 'before_upgrade';
flashback databasae to scn 202381;

閃回資料庫
閃回資料庫,可以透過RMAN的flashback database命令和SQL*Plus的flashback database語句來完成。能夠將資料庫快速的從邏輯資料錯誤或使用者錯誤中進行恢復。

它類似於傳統的按時間點恢復一樣,能夠將資料庫還原到過去某個時間點的狀態。閃回資料庫比按時間點恢復來快很多,因為閃回資料庫不需要從備份中還原資料檔案和從歸檔重做日誌檔案中應用相應的改變。

閃回資料庫能被用來撤消對資料庫不需要的改變。而資料檔案完好無損。這包括將資料庫還原到之前資料庫化身對應的狀態。這將撤消open resetlogs操作。

閃回資料庫使用它自己的日誌機制,它會在閃回區中建立閃回日誌。只有在閃回日誌是可用時才能使用閃回資料庫。因此如果要使用這個功能就必須對資料庫進行設定讓其建立相關的閃回日誌。

為了啟用閃回資料庫,需要設定閃回區和設定閃回保留策略目標來指定能夠將資料庫還原到過去某個時間點。

從啟用閃回資料庫開始,在定期的時間間隔內,資料庫將會把每個資料檔案中發生改變的資料塊複製到閃回日誌中。這些資料塊映象以後可用來重構資料檔案的內容。

當資料庫使用閃回資料庫將資料庫還原到過去的某些目標時間點時,自從還原時間點開始發生改變的每個資料塊將從閃回日誌中複製目標時間點對應的資料塊。然後應用自資料塊被複制到閃回日誌時間點開始的重做日誌。

注意:在整個時間跨度對於閃回日誌相應的重做日誌必須都是可用的。

閃回資料庫視窗
在一定範圍SCN之間有足夠的閃回日誌資料來支援flashback database命令這就叫閃回資料庫視窗。如果閃回區的空間太小,透過設定保留策略當為了給新生成的閃回日誌檔案分配空間可能會刪除過期的閃回日誌。根據閃回區的大小,必須被保留的其它備份和需要的閃回日誌資料,這可能造成閃回資料庫視窗比閃回保留目標的時間要短。

注意:閃回保留目標是一個目標,不是一個絕對受保護能執行閃回資料庫的目標。

如果閃回區的大小不能儲存為了滿足保留策略所需要的閃回日誌和其它檔案,比如歸檔重做日誌和其它備份。那麼為了儲存其它檔案從最早的SCN開始的閃回日誌可能因為空間問題而被刪除。

閃回資料庫視窗不能對可用閃回日誌中的最早SCN進行向前的擴充套件。閃回日誌不能備份到閃回區之外的目錄。因此為了增加可用的閃回日誌來滿足閃回資料視窗,所以要給閃回區可用的最大儲存空間。

這裡也有一些操作比如刪除表空間或收縮資料檔案,這些是不能透過閃回資料進行撤消的。在這些操作執行之後,閃回視窗就會立即從這些操作之後重新計算。

如果因為閃回資料庫視窗不滿足flashback database的要求,按時間點恢復可以最大程度的完成相似的任務。

使用受保護的還原點是唯一能保證你使用閃回資料庫能將資料庫還原點指定時間點或閃回視窗的方法。

正常還原點
透過指定時間點或SCN來作為還原點的名稱來建立還原點,在執行有restore point子句的命令時使用這種標籤或別名來指定SCN。

如果可能對你執行的任何操作執行撤消,那麼可以建立一個正常的還原點。還原點名稱和SCN會被記錄到控制檔案中。如果後面需要使用閃回資料庫,閃回表或按時間點恢復,可以使用還原點名稱來指示這個目標時間來代替一個時間表示式或SCN。在可能被撤消的操作執行前定義一個正常的還原點來消除需要手工記錄SCN的需要,或在執行閃回查詢時查詢正確的SCN的需要。

正常還原點是非常輕量級的。控制檔案可以包含上千個正常還原點而不會影響資料庫的效能。正常還原點最終從控制檔案中移除,而不是手工刪除,那麼它們將不再需要進行維護。

支援還原點的命令
在下面的上下文中還原點用來指定目標SCN:
1.RMAN的recover database和flashback database命令

2.SQL*Plus中的flashback database語句

注意:通常來說,受保護的還原點可以在任何使用正常還原點的操作中作為SCN的別名來使用。除非另有說明,否則正常還原點的使用方法也適用於受保護的還原點。

受保護的還原點
與正常還原點一樣,受保護的還原點在恢復操作中也能作為SCN的別名。然而,它們也對閃回資料庫提供了特定的功能。

在一個特定的SCN建立一個受保護的還原點可以強制透過執行閃回資料庫能將資料庫還原到這個SCN所處的狀態,即使資料庫沒有啟用閃回日誌也能保證。如果閃回日誌被啟用,建立受保護的還原點強制閃回日誌保留策略能滿足將資料庫閃回到建立受保護還原點後的任意時間點。

受保護還原點能用於將整個資料庫還原到一個已知的狀態良好的時間點,前提條件是閃回區有足夠的空間來儲存閃回日誌。使用閃回資料庫,受nologging操作影響的直接路徑插入也能使用受保護的還原點來進行還原操作。

受保護的還原點替代儲存快照
在實踐中,受保護的還原點能夠有效地替代儲存快照,它通常用來在一些危險操作之前來保護資料庫,比如大範圍的更新,應用程式打補丁,或者升級。與建立快照或複製資料庫再進行這些操作的相比,可以建立一個受保護的還原點然後執行這些危險操作,只要確只保留必要的閃回日誌就行。

閃回資料庫和受保護還原點的日誌
閃回資料庫和受保護還原點的日誌是基於在改變應用前被捕獲的資料塊映象,因此這些映象能用來在執行flashback database命令時將資料檔案還原到之前時間點所對應的狀態。

正常閃回日誌和受保護還原點的日誌的主要差別就是日誌是否會因為閃回區可用空間的壓力而被刪除。這些差別影響日誌可用空間的使用和資料庫的效能。

是否對閃回資料庫,受保護的還原點啟用日誌都依賴於你的恢復目標,以及對效能的影響和這些功能對空間的使用。

受保護還原點和閃回區的空間使用
當建立一個受保護的還原點,不管有沒有啟用完全閃回資料庫日誌,你都必須監控閃回區可用空間的狀態。如果為了滿足受保護的還原點而需要的檔案是不會滿足從閃回區刪除的條件。因此,閃回日誌的保留策略和為了滿足受保護的還的所需要的其它檔案,就是滿足備份保留策略一樣,可能會讓閃回區完全被使用掉。

注意:當因為保留策略不能刪除任何檔案而又遇到空間被使用完的情況時,在許多情況下資料庫會被hang住。

閃回日誌禁用時受保護還原點日誌
如果當閃回資料庫日誌禁用時建立了受保護的還原點,那麼,在受保護還原點建立之後第一次資料檔案的資料塊更改,在更改之前資料塊的映象會被儲存到閃回日誌中。閃回日誌因此能還原被修改的資料塊回到受保護還原點建立時的狀態。然而後續對相同資料塊的修改不會被記錄在日誌中,除非在這些修改之前建立另外的受保護還原點。

這種方式的日誌有以下重要的影響:
1.可用的塊映象可以在使用flashback database時將資料檔案的內容還原到受保護還原點所對應的狀態但不能使用flashback database將資料庫還原到受保護還原點與當前時間之間的某個時間點。只有當對閃回資料庫啟用日誌才行。如果你需要將資料庫還原到一箇中間時間點,你只能使用資料庫按時間點恢復。

2.因為每個資料塊的改變只會被記錄一次,當閃回日誌被禁用時受保護還原點的日誌所使用的空間要比正常閃回日誌所使用的空間小。可以按天或周來維護受保護的還原點而不必關注當閃回資料庫啟用後閃回日誌的增長。記錄受保護的還原點的日誌所產生的效能在禁用閃回資料庫日誌的情況下影響是很小的。

如果你主要是將資料庫還原到受保護還原點所建立的時間點,那麼通常關閉閃回資料庫日誌只使用受保護還原點更有效。例如當正計劃在生產資料庫伺服器上對應用進行升級,在升級開始之前建立一個受保護的還原點,如果升級過程最終失敗,可以使用flashback database撤消改變,而不用從備份中進行還原。

使用受保護還原點的閃回資料庫日誌
如果閃回資料庫被啟用並且定義了一個或多個受保護的還原點,那麼資料庫執行正常閃回日誌時,會對效能有些影響。根據資料庫的工作模式閃回區可能會產生較大的空間壓力。然而,不像正常的閃回資料庫日誌,閃回區總是要保留為了使用flashback database將資料庫還原到最早的當前受保護還原點時所需要的閃回日誌。閃回日誌如果要求滿足受保護還原點恢復就不會因為空間壓力而被刪除。

在這種情況下對於flashback database可以將資料庫恢復到閃回視窗中的任意時間點和特定的受保護的還原點所對應的狀態,但你必須監控制閃回區的空間使用。

使用正常和受保護還原點

使用受保護還原點的要求
為了支援使用受保護還原點,資料庫必須滿足下面的要求:
1.compatible引數必須設定為10.2或更高版本

2.資料庫必須執行在歸檔模式下。flashback database操作將資料庫還原到受保護的還原點時要求使用一直到還原點以來的歸檔重做日誌。

3.必須設定閃回區.受保護的還原點使用了一種類似於閃回日誌的機制,Oracle必須在閃回區儲存所要使用的日誌

4.如果沒有啟用閃回資料庫,當建立第一個受保護的還原點心(或者如果所有之前建立的受保護的還原點已經被刪除後)那麼資料庫必須處於mount狀態,不能是open狀態。

注意:在使用正常的還原點沒有特殊的要求。

建立正常和受保護還原點
為了建立正常或受保護還原點,使用create restore point語句,並給還原點提供了一個名稱並指定它是受保護還原點還是正常還原點(預設值)。

在建立還原點時資料庫可以處於open或mount狀態。如果是mount狀態,那麼必須已經完全關閉(物理備庫除外)。

下面的命令用來建立一個正常還原點

SQL> create restore point before_truncate;

Restore point created.

下面的命令用來建立一個受保護還原點

SQL> create restore point before_truncate guarantee flashback database;
create restore point before_truncate guarantee flashback database
*
ERROR at line 1:
ORA-38784: Cannot create restore point 'BEFORE_TRUNCATE'.
ORA-38787: Creating the first guaranteed restore point requires mount mode when flashback database is off.

根據錯誤提示可以看出當資料庫沒有啟用flashback database時想要建立受保護的還原點只能在mount狀態下建立。

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  327155712 bytes
Fixed Size                  1273516 bytes
Variable Size             138412372 bytes
Database Buffers          184549376 bytes
Redo Buffers                2920448 bytes
Database mounted.
SQL> create restore point before_truncate guarantee flashback database;

Restore point created.


SQL> col name for a20
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
  3  FROM V$RESTORE_POINT;

NAME                        SCN TIME                                DATABASE_INCARNATION# GUARANTEE_FLASHBACK_DATABASE STORAGE_SIZE
-------------------- ---------- ----------------------------------- --------------------- ---------------------------- ------------
BEFORE_TRUNCATE         2849315 27-JAN-15 02.40.56.000000000 PM                         2 YES                          8192000

顯示還原點
為了檢視當前定義的還原點,可以使用v$restore_point控制檔案檢視:

SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
FROM V$RESTORE_POINT;

SQL> col name for a20
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
  3  FROM V$RESTORE_POINT;

NAME                        SCN TIME                                DATABASE_INCARNATION# GUARANTEE_FLASHBACK_DATABASE STORAGE_SIZE
-------------------- ---------- ----------------------------------- --------------------- ---------------------------- ------------
BEFORE_TRUNCATE         2849315 27-JAN-15 02.40.56.000000000 PM                         2 YES                          8192000

可以看到每個還原點的名稱,SCN,時間和還原點建立時的資料庫對應化身的序列號,是正常還原點還是受保護還原點,以及為了提供足夠的資訊來支援閃回資料庫操作該還原點在閃回區所使用的空間大小。

可以使用只查詢受保護的還原點資訊:

SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE
FROM V$RESTORE_POINT
WHERE GUARANTEE_FLASHBACK_DATABASE='YES';


SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE
  3  FROM V$RESTORE_POINT
  4  WHERE GUARANTEE_FLASHBACK_DATABASE='YES';

NAME                        SCN TIME                                                                        DATABASE_INCARNATION# GUARANTEE_FLASHBACK_DATABASE   STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- ------------------------------ ------------
BEFORE_TRUNCATE         2849315 27-JAN-15 02.40.56.000000000 PM                                                                 2 YES                                 8192000

對於正常還原點,storage_size為0。對於受保護的還原點storage_size指示了為了保證能對還原點執行flashback database操作所要保留日誌所消耗的閃回區的空間大小。

下面的正常還原點的storage_size確實為0:

SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE
  3  FROM V$RESTORE_POINT
  4  WHERE GUARANTEE_FLASHBACK_DATABASE='YES';

NAME                        SCN TIME                                                                        DATABASE_INCARNATION# GUARANTEE_FLASHBACK_DATABASE   STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- ------------------------------ ------------
BEFORE_TRUNCATE         2849315 27-JAN-15 02.40.56.000000000 PM                                                                 2 YES                                 8192000



SQL> select count(*) from tt;

  COUNT(*)
----------
     51281

SQL> truncate table tt;

Table truncated.

SQL> select count(*) from tt;

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


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  327155712 bytes
Fixed Size                  1273516 bytes
Variable Size             138412372 bytes
Database Buffers          184549376 bytes
Redo Buffers                2920448 bytes
Database mounted.
SQL> select open_mode from v$database;

OPEN_MODE
----------
MOUNTED

SQL>  select  flashback_on from v$database;

FLASHBACK_ON
------------------
RESTORE POINT ONLY

SQL> flashback database to restore point before_truncate;

Flashback complete.



SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL>  alter database open resetlogs;

Database altered.

SQL> select count(*) from tt;

  COUNT(*)
----------
     51281

刪除還原點
當不再需要已經存在的還原點時或者想用已經存在的還原點名稱來建立一個新的還原點時就可以刪除該還原點,下面使用dorp restore point語句還刪除還原點:

SQL> drop restore point before_truncate;

Restore point dropped.

drop restore point用於刪除正常還原點受保護還原點。

注意:正常還原不管有沒有被顯式刪除最終都會從控制檔案中刪除。控制檔案中還原點保留規則如下:
1.在控制檔案中總是會保留最近的2048個還原點
2.只有還原點比比control_file_record_keep_time值所保留的還原點更新,而不管定義還原點的個數

正常還原點只要不滿足上述條件就會從控制檔案中刪除。
受保護還原點從不會因為自動地從控制檔案中刪除,除非顯式刪除它們。

監控受保護還原點的空間使用情況
當在資料庫中定義受保護還原點後,應該監控為了滿足還原點而被儲存的相關檔案在閃回區中的空間使用情況。可以使用下面的查詢語句檢視storage_size列來判斷每個受保護還原點相關檔案的大小。

SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
FROM V$RESTORE_POINT;

為了檢視閃回區的使用大小可以查詢v$recovery_file_dest和v$flash_recovery_area_usage檢視:

SQL> select * from v$recovery_file_dest;

NAME                                                                             SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------------------------------------------------------------------- ----------- ---------- ----------------- ---------------
/u01/app/oracle/flash_recovery_area                                               2147483648    9699328           9699328               1
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                    0                         0               0
BACKUPPIECE                   0                         0               0
IMAGECOPY                  0.45                      0.45               1
FLASHBACKLOG                  0                         0               0

Oracle閃回資料庫的設定與維護

閃回資料庫的限制
因為閥回資料庫是用來撤消某一時刻對資料檔案所做的改變,因此它有以下限制:
1.閃回資料庫只能撤消對資料檔案的改變。它不能用於修復介質故障或者對意外刪除的資料檔案進行恢復。

2.不能使用閃回資料庫來撤消對資料檔案的收縮操作

3.如果資料庫的控制檔案從備份中進行了還原或者重新建立了控制檔案,那麼之前所累積的閃回日誌資訊將會被廢棄。不能使用flashback database將資料庫還原到還原控制檔案或重新建立控制檔案之前的某個時間點。

4.使用閃回資料庫還原到某個時間點時,如果在這個時間點資料庫正在執行nologging操作,那麼在閃回資料庫完成之後,受nologging操作影響的物件和資料檔案可能存在壞塊。例如,如果在2015-01-27的9:00到9:15正在以nologging模式執行直接路徑插入操作,而後來你需要使用閃回資料庫將資料庫還原到2015-01-27的9:07分所對應的狀態,那麼在閃回資料庫操作完成之後,由直接路徑插入操作相關的物件和資料檔案可有壞塊。

如果可能要避免閃回資料庫將資料庫還原有nologging操作的時間點。也可以在任何nologging操作之後為了確保能恢復到該操作之後某個時間點可以執行全備或增量備份。如果你期望使用閃回資料庫將資料庫還原到某個操作執行的時間點,比如直接路徑插入,可以考慮在logging模式下執行這些操作。

啟用閃回資料庫的條件
啟用閃回資料庫需要滿足以下條件:
1.資料庫必須執行在archivelog模式下,因為在執行閃回資料庫操作時需要歸檔重做日誌

2.必須設定閃回區,因為閃回日誌只能儲存在閃回區中

3.對於RAC環境中的資料庫,閃回區必須是可以共享訪問的集簇檔案系統或者ASM

啟用閃回日誌
為了對閃回資料庫啟用閃回日誌,要設定db_flashback_retention_target初始化引數並執行alter database flashback on語句。下面是啟用閃回日誌的過程:
1.確保資料庫處於mount狀態而不是open狀態。例如:

SQL> shutdown immediate

SQL> startup mount

2.可選操作,可以將db_flashback_retention_target引數的值設定為你所期待的閃回視窗以分鐘為單位

SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=4320; # 3 days

db_flashback_retention_target的預設值是一天(1440分鐘)

3.使用v$database.FLASHBACK_ON可以檢視閃回日誌是否已啟用,現在是“NO”,表示尚未啟用:

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
NO
4.對整個資料庫啟用閃回資料庫功能:
SQL> ALTER DATABASE FLASHBACK ON;

從此,在快速恢復區的flashback子目錄下將會出現副檔名為.flb的檔案,它們就是閃回日誌。

SQL> select flashback_on from v$database;

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

閃回資料庫命令的語法很簡單:在進入MOUNT狀態後執行flashback database to scn xxx 或flashback database to timestamp xxx 。

一次閃回資料庫操作可能由兩種方式進行。比如,令當前時間點為T_C,資料庫閃回的目標時間點為T_1(T_C大於T_1),使用的命令為“flashback database to timestamp T_1”,該命令會自動選擇以下兩種方式的其中一個進行閃回操作。

方式一:

(1)第一階段:利用閃回日誌將資料庫從T_C回退至較T_1更舊的某一時刻T_2。
(2)第二階段:利用重做日誌將資料庫從T_2前滾至T_1。

方式二:

(1)第一階段:確定一個比T_1更舊的某一時刻T_2。
(2)第二階段:對於閃回日誌根本無法恢復的物件或資料,把當初此類物件第一次產生的時間為T_3,首先利用T_3到T_2的重做日誌將其重新產生並恢復。
(3)第三階段:利用閃回日誌將資料庫從T_C回退至T_2。
(4)第四階段:利用重做日誌將資料庫從T_2前滾至T_1(途中經過T_2)。

究竟採用哪種方式執行取決於目標時間點T_1與當前時間點T_C之間執行過什麼命令,如果是在閃回日誌中有對應反向操作的命令(如insert、update、delete)就採用方式一;如果在閃回日誌中找不到對應反向操作的命令(比如:truncate命令)則採用方式二。方式二較方式一可能會索要更多的重做日誌才可以完成閃回。

比如,若有任何物件發生過截斷操作(truncate table xxx),那麼方式二中的T3就是當初建立被截斷的表的時刻,這意味著整個閃回操作需要從T3至T1的所有的重做日誌,否則閃回資料庫不可能成功。這樣,可能會發生這樣的問題:即使只是在10秒前錯誤地截斷了一張表,現需要回到10秒之前,但是閃回資料庫時flashback database命令向管理員索要幾年前的歸檔日誌!

如果T_1和T_C之間只是發生過類似update那樣的DML,若是想回到10秒前,那麼會採用方式一,差不多隻是需要10秒的閃回日誌和歸檔日誌,閃回會很快,這也是閃回的真諦。

無論哪種方式,都可能遇到重做日誌不充分的問題,下面來模擬這種情況:

1.檢查資料庫是否啟用了閃回資料庫,從下面的查詢結果可知當前資料庫沒有啟用閃回資料庫

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
NO

2.建立一個測試表,該表共有51282條記錄

SQL> create table jy as select * from dba_objects;

Table created.

SQL> select count(*) from jy;

  COUNT(*)
----------
     51282

3.查詢一下當前資料庫的SCN號

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
-----------
    2879920

4.重啟資料庫並啟用閃回資料庫

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  327155712 bytes
Fixed Size                  1273516 bytes
Variable Size             138412372 bytes
Database Buffers          184549376 bytes
Redo Buffers                2920448 bytes
Database mounted.
SQL> alter database flashback on;

Database altered.

SQL> alter database open;

Database altered.

5.向表jy中增加一倍的記錄

SQL> insert into jy select * from jy;

51282 rows created.

SQL> commit;

Commit complete.

SQL> select count(*) from jy;

  COUNT(*)
----------
    102564

6.查詢當前資料庫的SCN號

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
-----------
    2880218

7.執行閃回資料庫,將表jy的記錄恢復到只有51282條記錄

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  327155712 bytes
Fixed Size                  1273516 bytes
Variable Size             138412372 bytes
Database Buffers          184549376 bytes
Redo Buffers                2920448 bytes
Database mounted.


SQL> flashback database to scn 2879920;
flashback database to scn 2879920
*
ERROR at line 1:
ORA-38754: FLASHBACK DATABASE not started; required redo log is not available
ORA-38762: redo logs needed for SCN 2879811 to SCN 2879920
ORA-38761: redo log sequence 19 in thread 1, incarnation 2 could not be accessed

也可能遇到閃回日誌不夠的問題,報錯資訊如下所示:

SQL> flashback database to scn 2879920;
flashback database to scn 2879920
*
ERROR at line 1:
ORA-38729: Not enough flashback database log data to do FLASHBACK.

這裡之所以不能閃回到SCN為2879920的時間點,是因為那時資料庫沒有啟用閃回。

8.檢視一下v$flashback_database_log檢視,檢查最遠可以回到哪裡

SQL> select oldest_flashback_scn,
  2  to_char(oldest_flashback_time,'YYYY-MM-DD HH24:MI:SS')
  3  from v$flashback_database_log;

OLDEST_FLASHBACK_SCN TO_CHAR(OLDEST_FLAS
-------------------- -------------------
             2880101 2015-01-27 23:32:18

從查詢結果可以看到資料庫最遠可以閃回到SCN號為2880101的時間點

9.在MOUNT狀態發起閃回操作後,管理員可以反覆地以任何順序執行這3個命令:flashback database to xxx,recover database和alter database open read only

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  327155712 bytes
Fixed Size                  1273516 bytes
Variable Size             138412372 bytes
Database Buffers          184549376 bytes
Redo Buffers                2920448 bytes
Database mounted.

SQL> flashback database to scn 2880210;

Flashback complete.

SQL> alter database open read only;

Database altered.

SQL> select count(*) from jy;

  COUNT(*)
----------
    102564

從上述結果可以看到現在將資料庫閃回到SCN為2880210的時間點,表jy的記錄數為102564不是我們期待的51282

10.再次將資料庫閃回到SCN號為2880150的時間點

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  327155712 bytes
Fixed Size                  1273516 bytes
Variable Size             138412372 bytes
Database Buffers          184549376 bytes
Redo Buffers                2920448 bytes
Database mounted.
SQL> flashback database to scn 2880150;

Flashback complete.

SQL> alter database open read only;

Database altered.

SQL> select count(*) from jy;

  COUNT(*)
----------
     51282

從上述結果可以看到將資料庫閃回到SCN為2880150的時間點時表jy的記錄為51282達到我們期待的結果。

11.完成閃回資料庫的最後操作。

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  327155712 bytes
Fixed Size                  1273516 bytes
Variable Size             138412372 bytes
Database Buffers          184549376 bytes
Redo Buffers                2920448 bytes
Database mounted.

SQL> alter database open resetlogs;

Database altered.

SQL>  select count(*) from jy;

  COUNT(*)
----------
     51282


預設情況下對於所有永久表空間都會生成閃回日誌。你也可以透過對指定的表空間來禁用閃回日誌來減少開銷:
SQL> ALTER TABLESPACE users FLASHBACK OFF;

可以使用下面的命令對錶空間重新啟用閃回日誌:
SQL>alter tablespace users flashback on;

注意如果對一個表空間禁用了閃回資料庫,那麼在執行flashback database之前要確保該表空間的資料檔案處於離線狀態。

對整個資料庫禁用閃回日誌:
SQL>alter database flashback off;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26845409/viewspace-1421867/,如需轉載,請註明出處,否則將追究法律責任。

相關文章