Oracle表空間時間點恢復技術TSPITR

llnnmc發表於2018-02-26

假定Oracle資料庫發生了以下情形:
1、表空間中,某個表的重要資料被破壞或刪除。
2、誤用DDL語言更改了表空間中的一個或多個表的結構,因此無法使用閃回來恢復這些表。
3、表被誤刪,並且已不在回收站中,如使用了帶purge選項的刪表操作。

那麼我們該如何恢復呢?

一種可行的方法就是利用Oracle的表空間時間點恢復技術TSPITR(Tablespace Point In Time Recover),這是一種僅在部分資料庫上執行不完整恢復的技術。該技術依據目標資料庫的表空間的一個子集來建立輔助資料庫,僅在此子集上執行不完整的恢復,然後使用輔助資料庫的表空間來替代目標資料庫中的表空間。最終結果看起來好像僅恢復和還原了該子集,而保持目標資料庫的其餘部分是最新的。

手動完成表空間的時間點恢復非常繁瑣,但利用RMAN可以自動執行TSPITR,在不影響資料庫中其他表空間或物件的前提下,方便的將一個或多個表空間的內容還原到過去的某個時間點。TSPITR是一個有用的恢復工具,但使用前需要明確以下前提:
1、資料庫必須位於歸檔模式,且存在相應的備份集合。
2、要恢復的表空間必須是自包含的,不依賴於其它表空間中的物件。例如,如果一個表在其它表空間中包含索引,則它們或者一起參與恢復,或者先將依賴關係解除才能做恢復。

當然,TSPITR並非是發生所有表空間災難後的萬能救星。例如,不能使用它來恢復已經刪除的表空間。另外,如果重新命名了表空間,則無法將其恢復到重新命名之前的時間點。

使用RMAN執行TSPITR很簡單,在此之前需要執行幾個步驟以確保操作成功,下面我們透過一個例子說明TSPITR技術的使用方法。

1、假定表空間CMES中的一張表被誤刪,且已無法從回收站中找回

sqlplus cmes/cmes@mes
drop table c_material_t purge;

2、確定破壞大致發生的時間點

這裡,首先在作業系統提示符下設定用於控制日期時間格式的環境變數,並使用此會話完成後面的工作,確保日期時間的正確解析:
set nls_date_format=yyyy-mm-dd hh24:mi:ss

檢視當前時間:
select sysdate from dual;

SYSDATE
-------------------
2016-02-15 21:30:48

3、驗證表空間的依賴性

檢視資料字典檢視TS_PITR_CHECK來確定某個表空間是否與其它表空間存在依賴關係:
select obj1_owner, obj1_name, ts1_name, obj2_owner, obj2_name, ts2_name
  from ts_pitr_check
 where (ts1_name = 'CMES' and ts2_name != 'CMES')
    or (ts1_name != 'CMES' and ts2_name = 'CMES');

該檢視填充了一對一關係的行,其中表空間ts1_name中的一個物件依賴於表空間ts2_name中的一個物件。檢查結果是cmes表空間中的物件沒有和其它表空間物件存在依賴關係。

倘若發現表空間物件存在依賴關係,可以臨時將依賴關係解除,或者將包含依賴物件的表空間一併新增到恢復集中。後者效果更好,可以確保維護表之間邏輯上的一致性。

4、確定在執行TSPITR後會丟失的物件

檢視資料字典檢視TS_PITR_OBJECTS_TO_BE_DROPPED來確定表空間在按目標時間進行恢復後將會丟失的物件:
select owner, name, to_char(creation_time, 'yyyy-mm-dd hh24:mi:ss') create_time
  from ts_pitr_objects_to_be_dropped
 where tablespace_name = 'CMES'
   and creation_time > to_date('2016-02-15 21:20:00', 'yyyy-mm-dd hh24:mi:ss');

檢查結果,按選取的時間恢復表空間cmes將是安全的,沒有物件會丟失。倘若存在丟失的物件,可以在執行恢復操作前先匯出這些物件,然後在完成恢復後重新將它們匯入。

5、使用RMAN命令自動執行TSPITR

在D:\下新建一個輔助目錄auxdata,RMAN將使用該目錄建立臨時輔助資料庫。

啟動RMAN命令連線到目標資料庫:
rman target /

執行恢復命令:
recover tablespace cmes until time '2016-02-15 21:20:00' auxiliary destination 'd:\auxdata';

6、恢復後的表空間會處於離線狀態,因此還需要手動執行命令將表空間聯機

sql'alter tablespace cmes online';

7、驗證表空間狀態,確認丟失的表已恢復

select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                         ONLINE
SYSAUX                         ONLINE
UNDOTBS1                       ONLINE
TEMP                           ONLINE
USERS                          ONLINE
CMES                           ONLINE
RMES                           ONLINE
INDX                           ONLINE

select count(*) from cmes.c_material_t;

  COUNT(*)
----------
       345

另外一點需要注意,在TSPITR執行完成後,恢復目標時間之前的表空間備份將不能再使用,因此應當儘快重新備份一次表空間或整個資料庫。


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

相關文章