假定Oracle數(shù)據(jù)庫(kù)發(fā)生了以下情形:
沙河口網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,沙河口網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為沙河口上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的沙河口做網(wǎng)站的公司定做!
1、表空間中,某個(gè)表的重要數(shù)據(jù)被破壞或刪除。
2、誤用DDL語(yǔ)言更改了表空間中的一個(gè)或多個(gè)表的結(jié)構(gòu),因此無(wú)法使用閃回來(lái)恢復(fù)這些表。
3、表被誤刪,并且已不在回收站中,如使用了帶purge選項(xiàng)的刪表操作。
那么我們?cè)撊绾位謴?fù)呢?
一種可行的方法就是利用Oracle的表空間時(shí)間點(diǎn)恢復(fù)技術(shù)TSPITR(Tablespace Point In Time Recover),這是一種僅在部分?jǐn)?shù)據(jù)庫(kù)上執(zhí)行不完整恢復(fù)的技術(shù)。該技術(shù)依據(jù)目標(biāo)數(shù)據(jù)庫(kù)的表空間的一個(gè)子集來(lái)創(chuàng)建輔助數(shù)據(jù)庫(kù),僅在此子集上執(zhí)行不完整的恢復(fù),然后使用輔助數(shù)據(jù)庫(kù)的表空間來(lái)替代目標(biāo)數(shù)據(jù)庫(kù)中的表空間。最終結(jié)果看起來(lái)好像僅恢復(fù)和還原了該子集,而保持目標(biāo)數(shù)據(jù)庫(kù)的其余部分是最新的。
手動(dòng)完成表空間的時(shí)間點(diǎn)恢復(fù)非常繁瑣,但利用RMAN可以自動(dòng)執(zhí)行TSPITR,在不影響數(shù)據(jù)庫(kù)中其他表空間或?qū)ο蟮那疤嵯?,方便的將一個(gè)或多個(gè)表空間的內(nèi)容還原到過(guò)去的某個(gè)時(shí)間點(diǎn)。TSPITR是一個(gè)有用的恢復(fù)工具,但使用前需要明確以下前提:
1、數(shù)據(jù)庫(kù)必須位于歸檔模式,且存在相應(yīng)的備份集合。
2、要恢復(fù)的表空間必須是自包含的,不依賴于其它表空間中的對(duì)象。例如,如果一個(gè)表在其它表空間中包含索引,則它們或者一起參與恢復(fù),或者先將依賴關(guān)系解除才能做恢復(fù)。
當(dāng)然,TSPITR并非是發(fā)生所有表空間災(zāi)難后的萬(wàn)能救星。例如,不能使用它來(lái)恢復(fù)已經(jīng)刪除的表空間。另外,如果重命名了表空間,則無(wú)法將其恢復(fù)到重命名之前的時(shí)間點(diǎn)。
使用RMAN執(zhí)行TSPITR很簡(jiǎn)單,在此之前需要執(zhí)行幾個(gè)步驟以確保操作成功,下面我們通過(guò)一個(gè)例子說(shuō)明TSPITR技術(shù)的使用方法。
1、假定表空間CMES中的一張表被誤刪,且已無(wú)法從回收站中找回
sqlplus cmes/cmes@mes
drop table c_material_t purge;
2、確定破壞大致發(fā)生的時(shí)間點(diǎn)
這里,首先在操作系統(tǒng)提示符下設(shè)置用于控制日期時(shí)間格式的環(huán)境變量,并使用此會(huì)話完成后面的工作,確保日期時(shí)間的正確解析:
set nls_date_format=yyyy-mm-dd hh34:mi:ss
查看當(dāng)前時(shí)間:
select sysdate from dual;
SYSDATE
-------------------
2016-02-15 21:30:48
3、驗(yàn)證表空間的依賴性
查看數(shù)據(jù)字典視圖TS_PITR_CHECK來(lái)確定某個(gè)表空間是否與其它表空間存在依賴關(guān)系:
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');
該視圖填充了一對(duì)一關(guān)系的行,其中表空間ts1_name中的一個(gè)對(duì)象依賴于表空間ts2_name中的一個(gè)對(duì)象。檢查結(jié)果是cmes表空間中的對(duì)象沒(méi)有和其它表空間對(duì)象存在依賴關(guān)系。
倘若發(fā)現(xiàn)表空間對(duì)象存在依賴關(guān)系,可以臨時(shí)將依賴關(guān)系解除,或者將包含依賴對(duì)象的表空間一并添加到恢復(fù)集中。后者效果更好,可以確保維護(hù)表之間邏輯上的一致性。
4、確定在執(zhí)行TSPITR后會(huì)丟失的對(duì)象
查看數(shù)據(jù)字典視圖TS_PITR_OBJECTS_TO_BE_DROPPED來(lái)確定表空間在按目標(biāo)時(shí)間進(jìn)行恢復(fù)后將會(huì)丟失的對(duì)象:
select owner, name, to_char(creation_time, 'yyyy-mm-dd hh34: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 hh34:mi:ss');
檢查結(jié)果,按選取的時(shí)間恢復(fù)表空間cmes將是安全的,沒(méi)有對(duì)象會(huì)丟失。倘若存在丟失的對(duì)象,可以在執(zhí)行恢復(fù)操作前先導(dǎo)出這些對(duì)象,然后在完成恢復(fù)后重新將它們導(dǎo)入。
5、使用RMAN命令自動(dòng)執(zhí)行TSPITR
在D:\下新建一個(gè)輔助目錄auxdata,RMAN將使用該目錄創(chuàng)建臨時(shí)輔助數(shù)據(jù)庫(kù)。
啟動(dòng)RMAN命令連接到目標(biāo)數(shù)據(jù)庫(kù):
rman target /
執(zhí)行恢復(fù)命令:
recover tablespace cmes until time '2016-02-15 21:20:00' auxiliary destination 'd:\auxdata';
6、恢復(fù)后的表空間會(huì)處于脫機(jī)狀態(tài),因此還需要手動(dòng)執(zhí)行命令將表空間聯(lián)機(jī)
sql'alter tablespace cmes online';
7、驗(yàn)證表空間狀態(tài),確認(rèn)丟失的表已恢復(fù)
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
另外一點(diǎn)需要注意,在TSPITR執(zhí)行完成后,恢復(fù)目標(biāo)時(shí)間之前的表空間備份將不能再使用,因此應(yīng)當(dāng)盡快重新備份一次表空間或整個(gè)數(shù)據(jù)庫(kù)。