今日一個同事找到我說他的數據庫無法使用了,希望我幫忙研究一下。
其實本人對數據庫也沒什麼深入研究,只是沒事的時候喜歡度看看網上高手的資料,遇到事情的時候習慣結合高手資料進行不斷嘗試以便總結經驗。
言歸正傳一起來研究一下。
同事說他之前想備份數據庫表空間文件tnits_BAK_2.ORA,備份了之後習慣性的刪除了原有文件,然後想維護一下服務器,就重啟數據庫服務器了。結果服務器起來之後再啟動數據庫才想起來有數據庫文件剛才被刪除掉了,數據庫就起不來了,這就是操作過程。
先讓他啟動了監聽lsnrctl start,發現監聽能啟動起來
使用sqlplus /nolog進入數據庫,然後執行startup,系統提示如下:
cannot start already-running ORACLE - shut it down first
這說明在啟動的時候有問題了。此時想到可以對數據庫啟動過程進行分步執行用於判斷哪一步出現的問題。
啟動數據庫分為三個步驟,分別為nomount、mount、Z喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcGVuo6zSu7DjztLDx9Ta1rG908q508NzdGFydHVwtcTKsbryysfX1Lav1rTQ0NXiM7K9tcShozxicj4KPC9wPgo8cD61sci7ztLDx9Kyv8nS1MrWuaS1pbbA1rTQ0NXiM7j2sr3W6KO6PGJyPgpzdGFydHVwIG5vbW91bnQ8YnI+CmFsdGVyIGRhdGFiYXNlIG1vdW50PGJyPgphbHRlciBkYXRhYmFzZSBvcGVuPGJyPgo8L3A+CjxwPr2r1eLI/b7k1NpzcWy0sL/a1tDWtNDQo6y94bn7yOfPwqO6PC9wPgo8cD5TUUwmZ3Q7IHN0YXJ0dXAgbm9tb3VudDxicj4KU1AyLTA3MTQ6IGludmFsaWQgY29tYmluYXRpb24gb2YgU1RBUlRVUCBvcHRpb25zPGJyPgo8L3A+CjxwPlNRTCZndDsgYWx0ZXIgZGF0YWJhc2UgbW91bnQ7PGJyPgphbHRlciBkYXRhYmFzZSBtb3VudDxicj4KKjxicj4KRVJST1IgYXQgbGluZSAxOjxicj4KT1JBLTAxMTAwOiBkYXRhYmFzZSBhbHJlYWR5IG1vdW50ZWQ8YnI+CjwvcD4KPHA+U1FMJmd0OyBhbHRlciBkYXRhYmFzZSBvcGVuOzxicj4KYWx0ZXIgZGF0YWJhc2Ugb3Blbjxicj4KKjxicj4KRVJST1IgYXQgbGluZSAxOjxicj4KT1JBLTAxMTEzOiBmaWxlIDkgbmVlZHMgbWVkaWEgcmVjb3Zlcnk8YnI+Ck9SQS0wMTExMDogZGF0YSBmaWxlIDk6IA=="/DataExt/tnits_BAK_2.ORA'
這裡第三個語句中的報錯引起了我的重視,他提示“需要回復介質文件”,這說明我同事刪除之後還原回去的tnits_BAK_2.ORA這個文件沒能讓數據庫軟件檢測到。
看了一下同事提供出來的原來文件的截圖和還原之後的文件截圖發現文件大小並沒有區別,只是文件的修改時間上有區別。
修改前
修改後
既然數據庫系統沒有識別出來文件並提示需要回復介質文件那麼我就手工回復一下,執行recover datafile 9,提示如下:
SQL> recover datafile 9
SP2-0640: Not connected
Media recovery complete.
然後再次打開數據庫發現依然無法正常打開,還是提示找不到tnits_BAK_2.ORA這個數據文件。
SQL> alter database open ;
alter database open
*
ERROR at line 1:
ORA-01113: file 9 needs media recovery
ORA-01110: data file 9: "/DataExt/tnits_BAK_2.ORA'
突然想到oracle在啟動的時候會驗證檢查點SNC,如果檢查點驗證不通過,那麼是不是有可能不識別還原的文件,從而導致上面提示的找不到某個文件呢
為了驗證一下我決定tnits_BAK_2.ORA置為offline狀態然後再啟動試試。
SQL> alter database datafile '/DataExt/tnits_BAK_2.ORA' offline;
alter database datafile 'DataExt/tnits_BAK_2.ORA' offline
*
ERROR at line 1:
ORA-01516: nonexistent log file, datafile, or tempfile
"DataExt/tnits_BAK_2.ORA"
結果看來還是不成功,不使用文件名直接使用文件編號再次嘗試更改文件狀態:
SQL> alter database datafile 9 offline;
alter database datafile 9 offline
*
ERROR at line 1:
ORA-01145:
offline immediate disallowed unless media recovery enabled
這次看來有點效果,但是依然不對,記得在網上看到過一個文章似乎數據庫歸檔和非歸檔是有區別的,馬上上網找了一個文檔看了一下,果然是有區別的,歸檔數據庫可以直接使用offline,非歸檔要使用offline drop才行。
使用如下命令進行操作:
SQL> alter database datafile '/DataExt/tnits_BAK_2.ORA' offline drop;
Database altered.
成功完成。
alter database datafile '/DataExt/tnits_BAK_2.ORA' offline;
Database altered.
也完成了。
再次執行打開數據庫命令,發現可以成功打開了。
SQL> alter database open;
Database altered.
進入數據庫進行了驗證,發現各項數據還都在,應用程序也可以正常運行,至此修復完畢。
總結如下:
1、數據文件切記不要輕易刪除,就算要刪除也不要再操作系統層面進行刪除,數據庫本身可以進行文件的刪除,有指定的命令。
2、在數據庫啟動和online的時候,Oracle一定會去online一個“一致”的表空間。此時,它會發現表空間內部SCN的不一致。根據提示,我們需要手工進行文件恢復。或者使用offline drop和offline讓數據庫在啟動時跳過一致性監測。關於此點可以參考http://www.linuxidc.com/Linux/2014-05/101881p2.htm,以及http://blog.csdn.net/folio/article/details/8156805
3、回復的時候要確認數據庫是否為歸檔模式,確認方式為使用dba權限登錄sql窗口,然後執行ARCHIVE LOG LIST,結果提示Database log mode No Archive Mode則為非歸檔。或執行select name,log_mode from v$database;如果結果為QUERY NOARCHIVELOG則為非歸檔。