使用資料表空間時間點恢複(TSPITR)可以將一個或多個非SYSTEM資料表空間恢複到與資料庫其他部分不同的某個時間點上。這點和Flashback 有點類似。 比如使用者誤刪了3張表,我們就可以用TSPITR恢複。
先看TSPITR 的工作流程,如下圖所示:
(1) 在輔助執行個體上用target的備份組restore 資料檔案
(2) 在輔助庫上用target的歸檔檔案recover 資料檔案
(3) 在輔助庫上匯出相關資料
(4) 修改主庫的控制檔案
(5) 用輔助庫上匯出檔案匯入輔助庫上。
幾個相關相關的定義:
輔助執行個體(Auxiliary instance):我們建立的臨時執行個體,RMAN可以使用這個執行個體執行TSPITR,完成TSPITR操作後,可以刪除輔助執行個體。
次要資料庫(Auxiliary database):主要資料庫的一個複本或子集,用於資料表空間的臨時恢複。
主要資料庫(Primary database):需要TSPITR的資料庫。
恢複集(Recovery set):構成恢複到某一個時間點資料表空間的資料表空間或資料檔案,SYSTEM資料表空間資料檔案不能作為恢複集的一部分。
輔助集(Auxiliary set):需要執行TSPITR的其他目標資料庫檔案集。 輔助集包括備份控制檔案,復原和撤銷段資料表空間資料檔案,system資料表空間資料檔案,次要資料庫的聯機重做日誌,以及一個可選的位於次要資料庫中的臨時的資料表空間。
目標執行個體(target instance):包含將要恢複的資料表空間
一、執行自動的TSPITR
1、為TSPITR 做準備
在開始執行TSPITR之前需要完成一些步驟。
(1) 確定還原的時間點
這是最關鍵的因素。 我們需要認真對待這項操作,因為如果沒有使用恢複目錄,則資料表空間的恢複是一次性的過程。 如果錯誤地標識了恢複的時間點,則不能重新來過。 如果使用恢複目錄,則不存在這種限制。
(2) 確定傳送集中的對象是自包含的
應該使用TS_PITR_CHECK 視圖來確保恢複集是完整的,並且標識所有可能要用到的其他資料表空間。 首先需要檢查TS_PITR_CHECK 視圖來確保沒有其他相關的資料表空間。 比如我們檢查DAVE 資料表空間,範例程式碼如下:
/* Formatted on 2010/7/7 17:10:00 (QP5 v5.115.810.9015) */
SELECT obj1_owner,
obj1_name,
obj1_type,
reason
FROM sys.ts_pitr_check
WHERE (ts1_name IN ('BL') AND ts2_name NOT IN ('BL'))
OR (ts1_name NOT IN ('BL') AND Ts2_Name IN ('BL'))
如果沒有衝突,則不會返回任何行。 如果存在衝突,則會看到描述的每個衝突的行。如果有衝突,我們也需要還原關聯的資料表空間。
(3) 儲存可能丟失的對象或資料
如果我們將Dave資料表空間恢複之前的某個時間,那麼在這個時間以後的任何更改,如建立對象,更新,插入或者刪除,都會丟失。 丟失這些對象可能沒有問題,但假設我們需要儲存這些資料,則需要匯出將要儲存的資料,或者將資料複製到資料庫中的其他位置。 Oracle 提供了視圖 TS_PITR_OBJECTS_TO_BEDROPPED, 該視圖列出了將在恢複操作期間丟失的所有對象。 使用該視圖可以確定資料表空間中的對象在恢複之後的狀態。
SQL> col owner format a10
SQL> col name format a10
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> SELECT * FROM ts_pitr_objects_to_be_dropped WHERE tablespace_name = 'BL' ;
OWNER NAME CREATION_TIME TABLESPACE_NAME
---------- ---------- ------------------- ------------------------------
BL BL 2010-07-07 19:24:18 BL
2、 執行實際的TSPITR
Oracle Database 10g將為我們執行自動的TSPITR,這意味著它將建立輔助執行個體。 在這種情況下,我們只需要串連目標資料庫和可選的恢複目錄(如果有的話),並且執行recover tablespace 命令。 RMAN 將為我們完成剩餘的工作。
下面示範使用recover tablespace 命令恢複BL 資料表空間的樣本。 我們使用可選的auxiliary destination來指示RMAN 和 Oracle 應該在何處建立與次要資料庫關聯的檔案。 使用該參數使得該恢複成為一個具有自動化執行個體的自訂TSPITR。 如果沒有使用該參數,TSPITR 就稱為完全自動的TSPITR 恢複。
需要注意的是,如果使用auxiliary destination參數,則應該已經建立了目標目錄,並且Oracle 必須能夠寫入到該目標目錄。 在目標路徑名中沒有尾碼的斜杠(/或/),如果包含斜杠將會導致TSPITR失敗,並且獲得錯誤訊息無法確切地描述該問題。命令如下:
Recover tablespace BL until time "to_date('2010-7-7 20:38:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl'
在執行這個命令之前有幾點注意的地方,因為TSPITR 會用已經存在的備份組和歸檔檔案來建立次要資料庫,所以在執行該命令之前需要確認target 資料庫有備份和歸檔,並且控制檔案也要有備份。
RMAN> Recover tablespace BL until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl';
啟動 recover 於 07-7月 -10
使用目標資料庫控制檔案替代恢複目錄
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=145 裝置類型=DISK
RMAN-05026: 警告: 假定以下資料表空間集適用於指定的時間點
資料表空間列表要求具有 UNDO 段
資料表空間 SYSTEM
資料表空間 UNDOTBS1
使用 SID='iEfs' 建立自動執行個體 -- 這裡是系統自動建立的次要資料庫名
供自動執行個體使用的初始化參數:
db_name=BL
db_unique_name=iEfs_tspitr_BL
compatible=11.2.0.0.0
db_block_size=8192
db_files=200
sga_target=280M
processes=50
db_create_file_dest=F:/bl
log_archive_dest_1='location=F:/bl'
#No auxiliary parameter file used
啟動自動執行個體 BL
Oracle 執行個體已啟動
系統全域地區總計 292933632 位元組
Fixed Size 1374164 位元組
Variable Size 100665388 位元組
Database Buffers 184549376 位元組
Redo Buffers 6344704 位元組
自動執行個體已建立
對恢複集資料表空間運行 TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK 已成功完成
記憶體指令碼的內容:
{
# set requested point in time
set until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log
sql 'alter system archive log current';
# avoid unnecessary autobackups for structural changes during TSPITR
sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';