9.手工備份恢復(fù)--表空間時間點恢復(fù)(練習(xí)12.13.14)
使用表空間時間點恢復(fù)(TSPITR)可以恢復(fù)數(shù)據(jù)庫的一個或多個表空間。TSPITR支持將一個或多個非SYSTEM表空間恢復(fù)到與數(shù)據(jù)庫其他部分不同的某個時間點上,實施TSPITR需要在一個輔助實例中還原源數(shù)據(jù)庫的一部分,然后在輔助實例上將選擇的表空間恢復(fù)到某一個時間點,最后把恢復(fù)的表空間遷移到源數(shù)據(jù)庫。
輔助實例(Auxiliary instance):用于恢復(fù)特定表空間的后臺進(jìn)程和內(nèi)存結(jié)構(gòu),該實例將打開輔助數(shù)據(jù)庫;
輔助數(shù)據(jù)庫(Auxiliary database):主數(shù)據(jù)庫的一個復(fù)本或子集,用于表空間的臨時恢復(fù)。在本節(jié)中,AUXY實例將打開一個名為PRACTICE數(shù)據(jù)庫,該數(shù)據(jù)庫來自PRACTICE主數(shù)據(jù)庫的數(shù)據(jù)文件和控制文件的一個還原備份;
主數(shù)據(jù)庫(Primary database):需要TSPITR的數(shù)據(jù)庫,該數(shù)據(jù)庫中的USERS表空間將恢復(fù)到與數(shù)據(jù)庫中其他表空間不同的某一個時間點;
恢復(fù)集(Recovery set):構(gòu)成恢復(fù)到某一個時間點表空間的數(shù)據(jù)文件,SYSTEM表空間數(shù)據(jù)文件不能作為恢復(fù)集的一部分,在本節(jié)中,恢復(fù)集是USERS表空間內(nèi)的兩個備份數(shù)據(jù)文件;
輔助集(Auxiliary set):表空間恢復(fù)所需要的全部數(shù)據(jù)文件。在本節(jié)中,恢復(fù)集是PRACTICE數(shù)據(jù)庫的備份控制文件,SYSTEM、RBS和TEMP表控件的備份數(shù)據(jù)文件、輔助數(shù)據(jù)庫參數(shù)文件以及PRACTICE主數(shù)據(jù)庫的歸檔日志文件。
練習(xí)12:研究并解決表空間的恢復(fù)
在本練習(xí)中將“不慎”刪除一個表破壞PRACTICE數(shù)據(jù)庫,然后研究TSPITR相關(guān)問題。
步驟一:實施打開數(shù)據(jù)庫備份
為進(jìn)行TSPITR練習(xí),可以按照練習(xí)3進(jìn)行一個關(guān)閉數(shù)據(jù)庫的數(shù)據(jù)庫備份或者按照練習(xí)5進(jìn)行一個打開數(shù)據(jù)庫備份生成用于還原和恢復(fù)的備份。如果使用練習(xí)5打開數(shù)據(jù)庫的備份,將備份路徑修改為“D:\oracle\CODE\chap9” ,使用該腳本備份數(shù)據(jù)庫時將完成如下三個操作:
- 歸檔主數(shù)據(jù)庫的當(dāng)前聯(lián)機(jī)日志;
- 確保組成輔助集和恢復(fù)集表空間的所有數(shù)據(jù)文件都在備份中;
- 在數(shù)據(jù)文件備份之后創(chuàng)建輔助集中使用的控制文件。

步驟二:刪除SCOTT.EMP
本練習(xí)通過刪除SCOTT用戶的雇員表(EMP),并利用TSPITR恢復(fù)該表。首先在刪除之前在TS4DROP表空間創(chuàng)建雇員表的索引,該索引和恢復(fù)集表空間內(nèi)的某個對象相關(guān),但又不存在恢復(fù)表空間中,然后刪除該表并記錄刪除時間,最后將USERS表空間恢復(fù)到該時間點,即恢復(fù)SCOTT.EMP雇員表。
2 SQL>ALTER INDEX pk_emp REBUILD TABLESPACE TS4DROP;
3 SQL>ALTER SESSION SET NLS_DATE_FORMAT='yyyy-MM-dd HH24:mi:ss';
4 SQL>SELECT sysdate FROM dual;
5 SQL>DROP TABLE SCOTT.EMP;
第一行中以scott身份登錄;第二行ALTER INDEX命令將索引一入到TS4DROP表空間中,當(dāng)在USERS表空間實施表空間恢復(fù)時,需要刪除并還原該索引;ALTER SESSION通過會話改變所有日期格式。

為更好驗證TSPITR就結(jié)果,在刪除表之后在USERS表空間創(chuàng)建一個對象,同時向USERS 表空間內(nèi)的dept表插入一行,并在另一個表空間(非USERS)的表date_log插入一行數(shù)據(jù)。
2 SQL>CREATE TABLE dept_copy TABLESPACE users AS SELECT * FROM dept;
3 SQL>INSERT INTO dept (deptno, dname, loc) VALUES ('50', 'SUPPORT', 'DENVER');
4 SQL>COMMIT;
5 SQL>CONNECT sys/system@practice as sysdba;
6 SQL>INSERT INTO tina.date_log VALUES (sysdate+9*365);
7 SQL>COMMIT;
8 SQL>ALTER SYSTEM SWITCH LOGFILE;
實施TSPITR后,SCOTT.EMP表將不再PRACTICE主數(shù)據(jù)庫的USERS表空間內(nèi)存在,部門表dept將找不到SUPPORT部門,TINA.DATE_LOG將出現(xiàn)一筆日期為9年后的數(shù)據(jù)。


步驟三:檢查TSPITR
為了考查TSPITR對數(shù)據(jù)庫的影響,我們從下面三個問題確定是否實施TSPITR:
- 如果在一個表空間把TSPITR實施到某一個特定的時間點,那些對象將丟失?(刪除對象)
- 哪個數(shù)據(jù)庫相關(guān)對象可能會妨礙TSPITR的成功完成?(從屬對象)
- 恢復(fù)集中是否有對象不能被遷移?(不可遷移對象)
1.刪除對象(Dropped object):如果將一個表空間恢復(fù)到以前的某個時間點,會丟失恢復(fù)時間點之后在表空間創(chuàng)建的對象??梢酝ㄟ^查詢TS_PITR_OBJECTS_TO_BE_DROPPED視圖了解TSPITR將會丟失的對象。
2 Column name format a10
3 Column tname format a10
4 Column time format a20
5 SELECT owner, name, tablespace_name tname, to_char(creation_time) time
6 FROM sys.ts_pitr_objects_to_be_dropped
7 WHERE tablespace_name in ('USERS')
8 AND creation_time > to_date('2010-02-06 15:38:58',yyyy-MM-dd HH24:mi:ss')
9 ORDER BY tablespace_name, creation_time;
查詢結(jié)果是DEPT_COPY,若恢復(fù)終止在2010-02-06 15:38:58 SCOTT的DEPT表的副本將存在于USERS表空間中。

如果要找出那些數(shù)據(jù)改動應(yīng)用到USERS表空間的數(shù)據(jù)對象上,可以通過Log Mininer查看2010-01-28 08:48到當(dāng)前日志文件之間日志文件。
2.從屬對象(Dependent object):這些對象會妨礙表空間成功地恢復(fù)到USERS表,為了找出這些表及相關(guān)性可以使用名為DBMS_TTSTRANSPORT_SET_CHECK的過程和一個命名為TRANSPORT_SET_VIOLATION的視圖。這個過程檢查USERS表空間是否自包含(self-contained),該過程需要2各參數(shù),第一個參數(shù)給出一個或多個需檢查的表空間的名稱,如果需要檢查表空間集檢查完整性約束,那么第二個參數(shù)為真。調(diào)用該過程,從視圖提取非自包含的內(nèi)容,如果不返回任何行,則說明表空間集是自包含的。

2 SQL>SELECT * FROM transport_set_violations;
在試圖只導(dǎo)出恢復(fù)的USERS表空間時,可以看到在EMP表上創(chuàng)建的唯一性約束和索引會導(dǎo)致非法,如果只導(dǎo)出USERS表空間的元數(shù)據(jù),會得到一個錯誤信息“The transportable set is not self-contained”。因此為導(dǎo)出USERS表空間,必須在恢復(fù)集中包括TS4DROP表空間,同時還要刪除TS4DROP表空間內(nèi)的索引。在Oracle8i中可以使用名為TS_PITR_CHECK的視圖來查看妨礙TSPITR運(yùn)行的相關(guān)性和限制,在Oracle9i/10g該視圖不存在,取而代之是DBMS_TTS.TRANSPORT_SET_CHECK。
2 FROM sys.ts_pitr_check
3 WHERE (ts1_name IN ('USERS') AND ts2_name NOT IN ('USERS'))
4 OR (ts1_name NOT IN ('USERS') AND ts2_name IN ('USERS'));

在導(dǎo)出之前,需要檢查恢復(fù)集之外在存在于主數(shù)據(jù)庫和輔助數(shù)據(jù)庫上都有的對象,如果有太多的對象在主數(shù)據(jù)庫上,可以增加該表空間至恢復(fù)集內(nèi),這樣可以減少消耗在刪除和還原從屬對象上的時間。
3.不可遷移對象(Non-transport object):在TSPITR恢復(fù)集中不可以出現(xiàn)的對象有:
- 復(fù)制的主表(master)
- 物化視圖和物化的視圖日志
- 基于功能的索引
- Scoped REF
- 域索引(用戶定義的索引)
- 屬于SYS的對象,包括回滾段
練習(xí)13:還原并恢復(fù)USERS表空間
在本練習(xí)中,將利用同一機(jī)器上的另一個實例還原和恢復(fù)USERS表空間,該練習(xí)類似練習(xí)9復(fù)制數(shù)據(jù)庫,主要區(qū)別在于只恢復(fù)了恢復(fù)集和輔助集(USERS、SYSTEM、RBS)表空間,并且把把該數(shù)據(jù)庫設(shè)置為一個克隆數(shù)據(jù)庫。
實施TSPITR的首選方法是在一臺與主數(shù)據(jù)庫不同的服務(wù)器上創(chuàng)建并恢復(fù)一個輔助數(shù)據(jù)庫,但由于資源所限我們可以在一臺機(jī)器上進(jìn)行TSPITR。在練習(xí)中,我們在一臺機(jī)器上創(chuàng)建PRATICE主數(shù)據(jù)庫的一個名為AUXY的輔助實例,然后恢復(fù)恢復(fù)集數(shù)據(jù)文件,為PRACTICE數(shù)據(jù)庫的導(dǎo)入/導(dǎo)出準(zhǔn)備數(shù)據(jù)文件。
步驟一:創(chuàng)建輔助實例
參見練習(xí)9步驟一創(chuàng)建一個名為AUXY的實例,包括目錄、WINDOWS服務(wù)、參數(shù)文件以及口令文件。在參數(shù)文件中,只需一個控制文件,名為D:\oracle\AUXY\auxiliary.ctl,同時在參數(shù)文件中設(shè)置DB_FILE_NAME_CONVERT、LOG_FILE_NAME_CONVERT和LOCK_NAME_SPACE等參數(shù)項。
2 LOG_FILE_NAME_CONVERT="PRACTICE","AUXY"
3 LOCK_NAME_SPACE="AUXY"
需要注意DB_NAME參數(shù)不變,仍為PRACTICE,然后創(chuàng)建PRACTICE數(shù)據(jù)庫的輔助實例。

步驟二:將SYSTEM、ROLLBACK和USERS還原到輔助實例中
將練習(xí)12中打開數(shù)據(jù)庫創(chuàng)建的備份控制文件拷貝到D:\oracle\AUXY中,該備份控制文件用于加載數(shù)據(jù)庫。把恢復(fù)集中的數(shù)據(jù)文件從D:\oracle\CODE\chap9拷貝到D:\oracle\AUXY目錄下,這些數(shù)據(jù)文件來自SYSTEM、SYSAUX、UNDOTBS和USERS表空間。當(dāng)創(chuàng)建一個輔助實例用于TSPITR時,不僅要從準(zhǔn)備恢復(fù)的表空間中還原數(shù)據(jù)文件,還要還原SYSTEM和ROLLBACK(UNDO)數(shù)據(jù)文件,這是因為SYSTEM表空間中存儲了數(shù)據(jù)字典,需要利用這些數(shù)據(jù)進(jìn)行打開數(shù)據(jù)庫、登錄數(shù)據(jù)庫、查看對象、從數(shù)據(jù)庫導(dǎo)出等。需要UNDO表空間是因為在數(shù)據(jù)庫上實施不完全恢復(fù)時,對于恢復(fù)取消時間未提交的所有事務(wù)進(jìn)行回退。
2 SQL>CONN sys/system@AUXY AS SYSDBA;
3 SQL>STARTUP NOMOUNT;
4 SQL>ALTER DATABASE MOUNT CLONE DATABASE;

當(dāng)將PRACTICE數(shù)據(jù)庫的輔助實例作為一個克隆數(shù)據(jù)庫加載時,該數(shù)據(jù)庫庫即脫離歸檔日志模式,并且所有的數(shù)據(jù)文件都脫機(jī),由于加載為克隆實例的數(shù)據(jù)庫無法假定所有的數(shù)據(jù)文件都在控制文件定義的位置,這種特性為把數(shù)據(jù)文件還原到其他地方提供了靈活性。在本練習(xí)中恢復(fù)集或輔助集只是數(shù)據(jù)文件中的一部分,其他的數(shù)據(jù)文件不需要被聯(lián)機(jī)處理。
在加載備份控制文件后,可以查看控制文件中有關(guān)數(shù)據(jù)庫數(shù)據(jù)文件的記錄,DB_FILE_NAME_CONVERT也已經(jīng)把所有數(shù)據(jù)文件的PRACTICE目錄修改為AUXY目錄。
2 SQL>col file# form 99;
3 SQL>SELECT file#, name, status FROM v$datafile;

再要查詢視圖v$logfile以確保聯(lián)機(jī)日志文件保存在一個于PRACTICE主數(shù)據(jù)庫不同的位置,在恢復(fù)之前,將SYSTEM、SYSAUX、UNDOTBS和USERS表控件數(shù)據(jù)文件置于聯(lián)機(jī),當(dāng)將文件置于聯(lián)機(jī)用于恢復(fù)時,這些數(shù)據(jù)文件必須保存在控制文件所指定的地方。
2 SQL>SELECT file#, name, status FROM v$datafile;

此時發(fā)現(xiàn)恢復(fù)集和輔助集中的數(shù)據(jù)文件處于了聯(lián)機(jī)狀態(tài),而其他的數(shù)據(jù)文件時脫機(jī)狀態(tài)。當(dāng)恢復(fù)集文件聯(lián)機(jī)時,可以把表空間恢復(fù)到USERS表空間到刪除SCOTT.EMP表之前的某一個時間點。
步驟三:將AUXY恢復(fù)到特定時間
設(shè)置LOGSOURCE SQL*Plus系統(tǒng)變量,將輔助數(shù)據(jù)庫還原的路徑指向D:\oracle\PRACTICE\ARCHIVE文件夾。
2 SQL>RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL TIME '2010-02-06 15:38:58';
利用恢復(fù)命令,在聯(lián)機(jī)表空間應(yīng)用所有全部重做信息,直到2010-02-06 15:38:58,這個時間剛好就是SCOTT.EMP表被刪除之前的時間。

打開輔助實例,重新設(shè)置日志。此時輔助實例已經(jīng)打開了PRACTICE主數(shù)據(jù)庫的一個備份作為輔助數(shù)據(jù)庫,只有SYSTEM的回退段設(shè)置為聯(lián)機(jī)狀態(tài),這可以防止對數(shù)據(jù)庫中的任何用戶對象執(zhí)行數(shù)據(jù)操縱語句(DDL)。
在輔助實例上,可以利用前面提到的DBMS_TTS包,比較結(jié)果解決所有相關(guān)性,如果這個視圖沒有返回任何行,就可以確信TSPITR的導(dǎo)出階段將會成功。此時需要刪除SCOTT.EMP的主鍵,期望的表空間遷移將會成功。

練習(xí)14:遷移USERS表空間
在這里我們使用表空間導(dǎo)入\導(dǎo)出模式把一個表空間從一個實例插入到另一個實例中。為遷移這些表空間,首先將源數(shù)據(jù)庫上的表空間設(shè)置為只讀,利用Oracle導(dǎo)出應(yīng)用程序提取保存在數(shù)據(jù)字段中的數(shù)據(jù)庫信息(元數(shù)據(jù));然后把數(shù)據(jù)文件和導(dǎo)出的元數(shù)據(jù)文件復(fù)制到目標(biāo)數(shù)據(jù)庫的制定位置;最后,使用Oracle導(dǎo)入應(yīng)用程序把表空間元數(shù)據(jù)寫入目標(biāo)數(shù)據(jù)庫的數(shù)據(jù)字典中。
一個可遷移的表空間由兩部分組成:
- 某個表空間的元數(shù)據(jù)以及其中包含的全部對象的一個導(dǎo)出;
- 屬于該表空間的數(shù)據(jù)文件的副本。
遷移表空間是通過把表空間的兩個部分拷貝到一個兼容的Oracle數(shù)據(jù)庫,然后通過如下步驟把表空間“插入”到數(shù)據(jù)庫實例中:
- 將表空間數(shù)據(jù)文件還原到新的位置;
- 導(dǎo)入表空間的元數(shù)據(jù)。
步驟一:改動AUXY上的USERS表空間
在表空間遷移過程中不能出現(xiàn)數(shù)據(jù)庫更改,因此表空間導(dǎo)出之前,把表空間設(shè)置為只讀。當(dāng)將一個表空間設(shè)置為只讀時,數(shù)據(jù)該表空間的數(shù)據(jù)文件成為檢查點,表空間內(nèi)不允許任何更新。由于創(chuàng)建的輔助實例沒有臨時表空間,這里進(jìn)行添加。
2 SQL>connect sys/system@auxy as sysdba;
3 SQL>alter tablespace users read only;
4 SQL>alter tablespace temp add tempfile 'D:\oracle\AUXY\TEMP01.dbf' size 20M;

驟二:從AUXY上導(dǎo)出USERT表空間
使用導(dǎo)出應(yīng)用程序?qū)SERS表空間的元數(shù)據(jù)提取到一個二進(jìn)制文件中。

利用一下參數(shù)文件創(chuàng)建導(dǎo)出文件:
3 Tablespaces=users
4 File= D:\oracle\CODE\chap9 \transport.dmp
5 Log=transport.log
- Userid 表空間必須由具有SYSDBA身份的用戶完成,為將用戶定義為SYSDBA必須使用引號;
- Transport_tablespace 該參數(shù)支持對可轉(zhuǎn)移表空間元數(shù)據(jù)的導(dǎo)出,當(dāng)設(shè)置為Y時,導(dǎo)出運(yùn)行于表空間模式(tablespace_mode),并連同TABLESPACES參數(shù)一起使用;
- Tablespaces 該參數(shù)規(guī)定,制定表空間內(nèi)用于數(shù)據(jù)字典包含的全部元數(shù)據(jù)都將導(dǎo)出。
步驟三:把PRACTICE數(shù)據(jù)庫USERS表空間脫機(jī)
在PRACTICE主數(shù)據(jù)庫刪除USERS表空間,其中包括內(nèi)容和數(shù)據(jù)文件。
2 SQL>connect sys/system@practice as sysdba;
3 SQL>alter tablespace users offline;

步驟四:拷貝數(shù)據(jù)文件
把AUXY實例恢復(fù)的文件復(fù)制到PRACTICE主數(shù)據(jù)庫上。
2 WIN>copy D:\oracle\AUXY\USERS01.DBF copy D:\oracle\PRACTICE\USERS01.DBF;

步驟五:向PRACTICE導(dǎo)入USERS表空間
使用導(dǎo)入工具將元數(shù)據(jù)導(dǎo)入到PRACTICE實例中:

該參數(shù)內(nèi)容如下:
2 Transport_tablespace=y
3 Tablespaces=users
4 Datafiles=” D:\oracle\PRACTICE\USERS01.DBF”, ” D:\oracle\PRACTICE| USERS02.DBF”
5 File=transport.dmp
6 Log=imp_transport.log
- Userid 表空間必須由具有SYSDBA身份的用戶完成,為將用戶定義為SYSDBA必須使用引號;
- Transport_tablespace 該參數(shù)支持對可轉(zhuǎn)移表空間元數(shù)據(jù)的導(dǎo)出,當(dāng)設(shè)置為Y時,導(dǎo)出運(yùn)行于表空間模式(tablespace_mode),并連同TABLESPACES參數(shù)一起使用;
- Tablespaces 該參數(shù)為Y時,列出將遷移到數(shù)據(jù)庫中的表空間;
- Datafile 當(dāng)transport_tablespace設(shè)置為Y時,該參數(shù)列出需遷移的數(shù)據(jù)文件
步驟六:驗證PRACTICE上的TSPITR
把PRACTICE數(shù)據(jù)庫導(dǎo)入的表空間設(shè)置為讀-寫模式:
2 SQL>CONNECT sys/system@practice as sysdba
3 SQL>ALTER TABLESPACE users READ WRITE;
查看SCOTT.EMP是否存在,而SCOTT.DEPT_COPY表是否不存在,查看SCOTT.DEPT是否能夠找到SUPPORT部門,查看SCOTT.EMP表是否存在主鍵。
可以用如下命令查看TINA.DATE_LOG表是否有一個未來9年后的時間插入值:
2 SQL>describe scott.dept_copy;
3 SQL>SELECT * FROM scott.dept;
4 SQL>SELECT MAX(create_date) FROM tina.date_log;

浙公網(wǎng)安備 33010602011771號