oracle 還原點

eric0435發表於2015-04-23

正常還原點
建立正常還原點是給一個SCN或指定時間點指定一個還原點名稱。因此,還原點實際上可以看作是SCN的標記或別名。在執行任何操作之前你可能想要撤消該操作,你可以建立一個正常還原點。控制檔案會儲存還原點名稱與SCN,建立還原點可以消除提前記錄SCN或在使用閃回時需要判斷正確的SCN操作。

如果使用閃回或按時間點恢復,那麼你可以使用還原點名稱來代夫時間表示式或SCN。下面的命令支援使用還原點:
1.RMAN中的recover database與flashback database命令
2.SQL中的flashback table語句

正常的還原點是輕量級的。控制檔案可以維護上千個正常還原點而不會影響資料庫效能。正常還原點如果不手動刪除,當執行恢復不再需要它們時會從控制檔案中將其刪除。
下面舉例說明:
1.建立正常還原點

SQL> create restore point insert_point;

Restore point created.


SQL> set long 200
SQL> set linesize 200
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
  3  FROM V$RESTORE_POINT;

NAME                        SCN TIME                                                                        DATABASE_INCARNATION# GUA STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- --- ------------
INSERT_POINT            1187948 23-APR-15 05.18.21.000000000 PM                                                                 3 NO             0

SQL> alter system checkpoint;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1187983 2015-04-23 17:18:59

2.新建立一個表test:

SQL> create table test as select * from dba_objects;

Table created.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1188096 2015-04-23 17:20:20

3.將資料庫閃回到建立正常還原點的時間點

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> flashback database to scn 1187983;

Flashback complete.

SQL> alter database open read only;

Database altered.

4.檢查表test是否存在,因為表test是在建立還原點之後所建立,當將資料庫閃回到還原點後表test也就不存了:

SQL> select count(*) from test;
select count(*) from test
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

受保護還原點
像正常還原點一樣,受保護的還原點也是恢復操作中所指定SCN的一個別名。唯一的區別是受保護的還原點除了顯式刪除之外是不會從控制檔案中刪除的。通常來說,使用正常還原點執行的命令也可以使用受保護還原點來作為SCN的別名,除了另有說明之外,使用正常還原點與受保護還原點的使用方法是一樣的

即使生成閃回日誌被禁用,受保護還原點確保你能使用閃回資料庫將資料檔案恢復到還原點SCN所對應的狀態。如果啟用閃回日誌,那麼受保護的還原點會強制保留將資料庫閃回到在最早建立的受保護還原點後的任意SCN所需要的閃回日誌。因此,如果啟用了閃回日誌,可以將資料庫閃回到受保護還原點後的任意SCN而不只是單個SCN。如果禁用了閃回日誌,那麼在執行flashback database命令時不能直接指定受保護還原點與當前時間之間的SCN。然後可以先閃回到受保護還原點再恢復到受保護還原點與當前時間之前的SCN。

閃回資料庫的命令是flashback database to PIT,PIT可以是SCN、時間或還原點,顧名思義,就是將整個資料庫回退到指定的一個時間點,實際上是資料庫不完全恢復的另一種方式。真正的不完全恢復需要消耗的時間與資料庫的大小有密切聯絡,資料庫越龐大,需要的時間就越多。

閃回資料庫技術改變了這個窘境,其處理問題方式可以著重於如何將相對較短的時間內發生的變更去除,而不是如何還原足夠舊的備份(很花時間了),再利用歸檔日誌前滾至指定時間。.

閃回資料庫需要使用兩種日誌:閃回日誌和重做日誌。其中重做日誌已為大家所知,而閃回日誌就像是重做日誌的反作用力,閃回日誌的記載正好與重做日誌的記載相反。比如,邏輯上重做日誌記錄insert命令的重做記錄,閃回日誌就記錄delete命令的重做記錄(當然實際上沒那麼簡單)。在發起閃回操作時,只要根據寫入閃回日誌的相反順序,即後寫先讀的順序,將閃回記錄從閃回日誌讀出並執行其記錄的變更就能夠將資料庫在時間軸上倒推。

閃回日誌的儲存路徑一定是快速恢復區的子目錄,儲存的期限則由引數db_flashback_ retention_target控制(單位為分鐘),凡是超出儲存期限的閃回日誌將會在快速恢復區空間緊張的時候被自動刪除。比如,指定資料庫保留兩天的閃回日誌和歸檔日誌:

SQL> alter system set db_flashback_retention_target=2880;

System altered.

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

SQL> select flashback_on from v$database;

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

在確保啟用了歸檔模式之後,使用以下命令可以啟用閃回日誌,即閃回資料庫功能:

SQL> alter database flashback on;

Database altered.

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

SQL> select flashback_on from v$database;

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

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

受保護還原點與儲存快照
在實踐中,受保護還原點可以替代儲存快照。儲存快照通常被用來在執行危險操作之前來保護資料庫,比如大範圍的資料庫更新或應用打補丁或升級。相對於建立快照或複製一個資料庫進行測試操作來說,你可以在主庫或物理備庫中建立一個受保護還原點。

閃回資料庫與受保護還原點日誌
閃回資料庫日誌與受保護還原點呼叫改變之前的資料檔案塊映象,flashback database命令可以使用這些映象來將資料檔案還原到之前的狀態。正常閃回日誌與受保護還原點日誌最主要的差別是當閃回區出現空間壓力時是否這些日誌會被刪除。這種差異會影響日誌的空間使用和資料庫效能。你的恢復目錄部分決定了是否啟用閃回日誌或者還原點,或都兩者都使用。當單獨或一起使用這些功能時對空間使用和效能的影響是需要考慮的。

受保護還原點與閃回區空間之關的系
當建立,保留,覆蓋與刪除閃回區中的閃回日誌時存在以下規則:
1.如果閃回區有足夠空間,那麼當需要滿足閃回保留目標時生成閃回日誌。
2.如果閃回日誌過舊不再滿足閃回保留目標,那麼可以重用這些閃回日誌。
3.如果資料庫必須建立閃回日誌並且閃回區已經被使用完或者沒有磁碟空間,那麼舊的閃回日誌會被重用。重用舊的閃回日誌會縮短閃回資料庫視窗。如果因為空間壓力問題有過多的閃回日誌被重用,那麼閃回保留目標可能不會被滿足。
4.如果閃回區填滿,那麼概括閃回區規則當閃回區要為其它檔案提供空間時會自動刪除歸檔重做日誌來回收空間。在這種情況下,flashback database命令需要使用的重做日誌的任何閃回日誌也會被刪除。概括閃回區規則,當出現以下情況下檔案使用的空間會被回收。
a.檔案被報告為過期並且閃回資料庫不需要該檔案。例如該檔案保留的時間超過了db_flashback_retention_target引數設定
b.檔案已經備份磁帶
5.如果為了滿足受保護還原點閃回區中沒有檔案滿足刪除條件。因為,閃回日誌和其它為了滿足受保護還原點的其它檔案,額外的為了滿足備份保留策略所需要的檔案都可能會造成閃回區被填滿。

當建立受保護還原點可以考慮不完全啟動閃回日誌,但需要監控閃回區的可用空間。如果為了滿足你的保留策略和受保護還原點,閃回區中沒有滿足刪除條件的檔案,如果遇到磁碟空間被填滿的情況時,資料庫會執行刪除。

禁用閃回日誌與受保護還原點
假設在資料庫禁用閃回日誌的情況下建立了受保護還原點。在這種情況下,在受保護還原點建立時第一次被修改的資料檔案塊,資料庫會將被修改前的資料塊映象儲存在閃回日誌中。因此閃回日誌保留了每一個被修改的資料塊在建立受保護還原點時的內容。後面對相同資料塊的修改將不會被捕獲除非在資料塊最後被之前之前又建立了一個受保護還原點。

這種記錄日誌方法有以下重要的結果:
1.flashback database可以透過使用資料塊映象重新構造在建立受保護還原點時資料檔案中的內容。
2.對於反覆修改相同的資料,相比對正常的閃回日誌受保護還原點所要使用的空間更少,因為每一個被修改的資料塊只會被記錄一次。應用程式有較少插入操作可能從節省磁碟空間中受益。當應用程式有大量插入或批次插入操作時這種優勢就沒有了。受保護還原點的日誌開鎖在禁用閃回日誌時是很小的。

假如你的主要目標是要能將資料庫恢復到受保護還原點所建立的時間點,那麼在這種情況下,禁用閃回日誌而只使用受保護還原點更有效。例如假設要對資料庫執行升級,可以在啟動升級之前建立一個受保護還原點,如果升級失敗,那麼可以執行flashback database來恢復資料庫。

啟用閃回日誌與受保護還原點
如果啟用閃回日誌並定義一個或多個受保護還原點,那麼資料庫會執行正常的閃回日誌操作。在這種情況下,閃回區將會保留將資料庫恢復到受保護還原點與當前時間之間任何時間點所需要的所有閃回日誌。閃回日誌如果滿足受保護還原點的要求在出現空間壓力時是不會被刪除的。啟用閃回日誌會佔用一些效能開銷。依賴於資料庫的工作負載,可能會對閃回區造成極大的空間壓力。因此應該要監控閃回區的空間使用情況。

使用閃回資料庫與受保護還原點的條件
為了能成功執行閃回資料庫和受保護還原點操作,必須首先設定一些關鍵的資料庫選項。在啟用閃回資料庫之前進行以下資料庫設定:
1.你的資料庫必須執行在archivelog模式下,因為閃回資料庫需要使用歸檔重做日誌。
2.必須設定了閃回區,因為閃回日誌只能儲存在閃回區中。
3.對於RAC資料庫,閃回區必須是叢集檔案系統或ASM

為了使用受保護還原點,資料庫必須滿足compatible引數必須設定為10.2.0或更高版本。但在使用正常還原點之前沒有任何特定要求。

下面是舉例來說明:
在啟用閃回日誌的情況下,建立受保護還原點
1.建立受保護還原點

SQL> select flashback_on from v$database;

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

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1187919 2015-04-23 17:17:26

SQL> create restore point  create_point guarantee flashback database;

Restore point created.

SQL> set long 200
SQL> set linesize 200
SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE
  3  FROM V$RESTORE_POINT;

NAME                        SCN TIME                                                                        DATABASE_INCARNATION# GUA STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- --- ------------
CREATE_POINT            1187948 23-APR-15 05.18.21.000000000 PM                                                                 3 YES     52428800

SQL> alter system checkpoint;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1187983 2015-04-23 17:18:59

2.新建表test

SQL> create table test as select * from dba_objects;

Table created.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1188096 2015-04-23 17:20:20

因為我們啟用了閃回日誌,所以可以將資料庫閃回到受保護還原點(create_point)SCN:1187948與當前時間2015-04-23 17:20:20 SCN:1188096之間的任意SCN所對應的狀態。那麼我們將資料庫閃回到SCN為1187983,這時表test是還沒有建立的。

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> flashback database to scn 1187983;

Flashback complete.

SQL> alter database open read only;

Database altered.

SQL> select count(*) from test;
select count(*) from test
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

在確認之前不要以resetlogs選項open資料庫,這樣可以多次執行閃回資料庫操作,也可以撤消閃回資料庫操作,下面是撤消閃回資料庫操作是透過執行完全恢復來實現的:

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> recover database;
Media recovery complete.
SQL> alter database open;

Database altered.

SQL> select count(*) from test;

  COUNT(*)
----------
     86741

下面我們在禁用閃回日誌的情況下執行閃回資料庫操作:
1.禁用閃回日誌並建立受保護還原點

SQL> select flashback_on from v$database;

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

SQL> alter database flashback off;

Database altered.

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.

SQL> create restore point delete_point guarantee flashback database;


Restore point created.

SQL> alter database open;

Database altered.


SQL> select flashback_on from v$database;

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



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

NAME                        SCN TIME                                                                        DATABASE_INCARNATION# GUA STORAGE_SIZE
-------------------- ---------- --------------------------------------------------------------------------- --------------------- --- ------------
DELETE_POINT            1192464 23-APR-15 07.36.16.000000000 PM                                                                 3 YES     52428800

SQL> alter system switch logfile;

System altered.

SQL> alter system checkpoint;

System altered.

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1192860 2015-04-23 19:37:51

2.刪除表test

SQL> delete from test;

86743 rows deleted.

SQL> commit;

Commit complete.

SQL> select count(*) from test;

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

SQL> select current_scn,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;

CURRENT_SCN TO_CHAR(SCN_TO_TIME
----------- -------------------
    1193268 2015-04-23 19:38:57

現在我們來測試看在禁用閃回日誌的情況下能不能將資料庫閃回到受保護還原點(delete_point)scn:1192464與當前時間SCN:1193268之間的任意SCN,這裡我們閃回到SCN:1192860,這裡表test的記錄還沒有被刪除

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> flashback database to scn 1192860;
flashback database to scn 1192860
*
ERROR at line 1:
ORA-38726: Flashback database logging is not on.

錯誤提示已經說明了沒有閃回日誌,所以不能將資料庫閃回到受保護還原點與當前時間之間的任意SCN。

下面將表test閃回到受保護還原點SCN:1192464

SQL> flashback database to restore point delete_point;

Flashback complete.

SQL> alter database open read only;

Database altered.

SQL> select count(*) from test;

  COUNT(*)
----------
     86743

從執行結果可知,已經恢復到受保護還原點所對應的狀態,表test的資料恢復回來了。

從上面的執行結果可以看到在沒有啟用閃回日誌的情況可以將資料庫閃回到受保護還原點。如果要想在沒有啟用閃回日誌的情況下將資料庫閃回到受保護還原點與當前時間點之間的SCN:1192860,可以先將資料庫閃加到受保護還原點,再執行恢復將資料庫恢復到SCN:1192860。

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

Total System Global Area  188313600 bytes
Fixed Size                  1363496 bytes
Variable Size             150995416 bytes
Database Buffers           33554432 bytes
Redo Buffers                2400256 bytes
Database mounted.
SQL> flashback database to restore point delete_point;

Flashback complete.

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

Session altered.

因為SCN:1192860,對應的時間就是2015-04-23 19:37:51,這裡如果直接用SCN:1192860執行恢復會報以下錯誤 :

SQL> recover database until scn 1192860;
ORA-00277: illegal option to the UNTIL recovery flag SCN



SQL> recover database until time '2015-04-23 19:37:51';
Media recovery complete.
SQL> alter database open read only;

Database altered.

SQL> select count(*) from test;

  COUNT(*)
----------
     86743

從執行結果可知,已經恢復到受保護還原點所對應的狀態,表test的資料恢復回來了。

 

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

相關文章