背景
????由于機房意外斷電導致oracle數(shù)據(jù)庫控制文件損壞,數(shù)據(jù)庫實例無法正常啟動瓷马。在網(wǎng)上查閱了很多資料拴还,有很多講如何重建控制文件恢復數(shù)據(jù)的,但是我并沒有成功欧聘。最后打算換個思路片林,利用現(xiàn)有工具幫我實現(xiàn)數(shù)據(jù)恢復。
準備
????1.數(shù)據(jù)恢復工具AUL(如有需要請聯(lián)系本人獲仁鞑t。?br> ????2.待恢復DBF數(shù)據(jù)文件
- system01.dbf:記錄系統(tǒng)運行信息拇厢,包含所有數(shù)據(jù)庫字典,PL/SQL程序代碼及其他系統(tǒng)信息
- undotbs01.dbf:存放回退信息晒喷,即DML操作后的舊數(shù)據(jù)信息
- sysaux01.dbf:system文件的輔助文件孝偎,存放支持oracle系統(tǒng)活動的多種工具如logminer
- users01.dbf:新建用戶未指定存儲空間是,默認數(shù)據(jù)存放在該文件中
- temp01.dbf:臨時表空間數(shù)據(jù)
- user1_data.dbf:這是你即將恢復的數(shù)據(jù)所在的表空間凉敲,名字依實際情況而定
恢復步驟
????1.解壓AUL6.zip衣盾,解壓后的文件包括一個exe和一個dll文件。殺毒軟件會報木馬爷抓,我當時為了恢復數(shù)據(jù)還是冒險打開了势决,但沒有發(fā)現(xiàn)什么異常,所以可以忽略蓝撇。
????2.在aul6.exe同級目錄下建兩個文件果复,system.cfg和userdata.cfg,system.cfg中使用的兩個dbf是oracle系統(tǒng)的dbf渤昌,userdata.cfg中使用的dbf是新建數(shù)據(jù)庫中存放數(shù)據(jù)的dbf虽抄,其不含有表名/結(jié)構(gòu)等信息,僅存放裸數(shù)據(jù)独柑。
???? - 在system.cfg文件中鍵入:
????0 0 E:\AUL\SYSTEM01.DBF
????0 0 E:\AUL\UNDOTBS01.DBF
???? - 在userdata.cfg文件中鍵入:
????0 0 E:\AUL\USER1_DATA.DBF
????3.雙擊aul.exe打開命令窗口迈窟,輸入open system.cfg,正常會出現(xiàn)如下圖所示結(jié)果:
4.依次執(zhí)行下面四條命令:
unload table user$;
unload table obj$;
unload table tab$;
unload table col$;
執(zhí)行完后忌栅,aul6.exe同級目錄下會生產(chǎn)四個大小均不為0的文件:aulusr.txt, aulobj.txt,aultab.txt, aulcol.txt车酣,如果有文件大小為0,則說明存在問題。
5.打開aulusr.txt湖员,可找到你要恢復數(shù)據(jù)所屬用戶的名稱贫悄,比如此處我們要恢復的數(shù)據(jù)用戶是user1。
6.執(zhí)行命令:open userdata.cfg娘摔,回車清女,正常情況,效果應與打開system.cfg時效果相同晰筛,輸出數(shù)據(jù)塊大小嫡丙、數(shù)量等信息。
7.執(zhí)行命令:list table user1 to user1.txt;回車读第,生成所有待導出數(shù)據(jù)表腳本曙博,此處user1即數(shù)據(jù)表的用戶名。在aul6.exe同級目錄下找到user1.txt怜瞒,正常情況該文件大小不為0父泳,打開,找到待恢復的數(shù)據(jù)表吴汪,把其它記錄(大多為系統(tǒng)表)全部刪除惠窄,保存,將文件擴展名改為sql漾橙。如下圖:
8.執(zhí)行命令:@user1.sql杆融;執(zhí)行完后,aul6.exe同級目錄下一個表會生成3個文件霜运,如圖:
9.打開PLSQL連接一個正常的數(shù)據(jù)庫脾歇,執(zhí)行POI_syntax.sql文件,創(chuàng)建數(shù)據(jù)表淘捡。
10.使用oracle自帶的sqlldr命令裝載文本數(shù)據(jù)藕各,新開cmd窗口,將路徑切換到aul6.exe同級目錄下焦除,執(zhí)行命令:sqlldr usr/pwd control=ACCOUNT_MANAGE_sqlldr.ctl;回車激况,usr/pwd為你當前數(shù)據(jù)庫的用戶名/密碼,需與plsql登錄時用戶名/密碼相同膘魄。正常情況命令執(zhí)行結(jié)束時會輸出邏輯記錄計數(shù)乌逐,表示插入了多少條記錄,且在aul6.exe同級目錄下生成日志文件account_manage_sqlldr.log瓣距,包含執(zhí)行結(jié)果的詳細信息黔帕。
11.查看數(shù)據(jù)表代咸,數(shù)據(jù)已成功恢復蹈丸。有時候可能會因為新舊數(shù)據(jù)庫環(huán)境不一致導致中文亂碼,這個解決方法十分簡單÷哒龋可以自己寫一段代碼直接從POI.txt讀取數(shù)據(jù)寫入數(shù)據(jù)庫奋岁。