[Oracle] 解析在沒(méi)有備份的情況下undo損壞怎么辦
如果Oracle在運(yùn)行中很不幸遇到undo損壞,當(dāng)然最好的方法是完全恢復(fù),不過(guò)如果沒(méi)有備份,可以采用一種非常規(guī)的手段(利用Oracle的隱藏參數(shù)),如果此時(shí)undo包含未提交的事務(wù),會(huì)造成一點(diǎn)點(diǎn)的數(shù)據(jù)丟失(一般都是可忍受的),如果沒(méi)有未提交的事務(wù),則不會(huì)有數(shù)據(jù)丟失。其主要步驟有:
1. 修改undo表空間管理為手動(dòng);
2. 設(shè)置隱藏參數(shù)(_offline_rollback_segments或_corrupted_rollback_segments)標(biāo)識(shí)受影響的回滾段,使Oracle忽略其上的未提交事務(wù);
3. 手動(dòng)刪除受影響的回滾段和undo表空間,然后重建新的undo表空間;
4. 還原undo表空間管理為自動(dòng)。
實(shí)驗(yàn)如下:
Step 1.
如果undo數(shù)據(jù)文件損壞,數(shù)據(jù)庫(kù)只能到mount狀態(tài),open時(shí)會(huì)出現(xiàn)以下錯(cuò)誤:
ORA-01157: cannot identify/lock data file 14 - see DBWR trace file
ORA-01110: data file 14: 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0'
說(shuō)明該undo文件已經(jīng)損壞或丟失,把該文件offline之后就可以打開(kāi)數(shù)據(jù)庫(kù)了:
SQL> alter database datafile 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0' offline drop;
SQL> alter database open;
打開(kāi)數(shù)據(jù)庫(kù)的目的是為了找出受影響的回滾段:
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU10_1201331463$ OFFLINE
_SYSSMU9_2926456744$ OFFLINE
_SYSSMU8_640224757$ OFFLINE
_SYSSMU7_3984293596$ OFFLINE
_SYSSMU6_3694658906$ OFFLINE
_SYSSMU5_3475919656$ OFFLINE
_SYSSMU4_168502732$ OFFLINE
_SYSSMU3_1987193959$ OFFLINE
_SYSSMU2_3908286755$ OFFLINE
_SYSSMU1_3281912951$ OFFLINE
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- -------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string undo1
關(guān)閉數(shù)據(jù)庫(kù):
SQL> shutdown immediate;
Step 2.
創(chuàng)建一個(gè)臨時(shí)的pfile:
SQL> create pfile='H:\initO06DMS0.ora' from spfile;
修改pfile如下:
*.undo_management='manual' -- undo表空間管理方式修改為手動(dòng)
*.undo_tablespace='undo2' --指定一個(gè)新的undo表空間
*._offline_rollback_segments=('_SYSSMU10_1201331463$','_SYSSMU9_2926456744$','_SYSSMU8_640224757$','_SYSSMU7_3984293596$','_SYSSMU6_3694658906$','_SYSSMU5_3475919656$','_SYSSMU4_168502732$','_SYSSMU3_1987193959$','_SYSSMU2_3908286755$','_SYSSMU1_3281912951$') --把所有受影響的回滾段都列在這里
并以改pfile重新啟動(dòng)數(shù)據(jù)庫(kù):
SQL> startup pfile='H:\initO06DMS0.ora'
Step 3.
手動(dòng)刪除受影響的回滾段:
SQL>drop rollback segment "_SYSSMU10_1201331463$";
SQL>drop rollback segment "_SYSSMU9_2926456744$";
SQL>drop rollback segment "_SYSSMU8_640224757$";
SQL>drop rollback segment "_SYSSMU7_3984293596$";
SQL>drop rollback segment "_SYSSMU6_3694658906$";
SQL>drop rollback segment "_SYSSMU5_3475919656$";
SQL>drop rollback segment "_SYSSMU4_168502732$";
SQL>drop rollback segment "_SYSSMU3_1987193959$";
SQL>drop rollback segment "_SYSSMU2_3908286755$";
SQL>drop rollback segment "_SYSSMU1_3281912951$";
手動(dòng)刪除舊的undo表空間:
SQL> drop tablespace undo1 including contents;
重建新的undo表空間:
SQL> create undo tablespace undo2 datafile 'I:\INTEL_DATA\O06DMS0\UNDO2.O06DMS0' size 100m;
創(chuàng)建新的spfile,覆蓋舊的spfile:
SQL> create spfile from pfile='H:\initO06DMS0.ora';
關(guān)閉數(shù)據(jù)庫(kù):
SQL> shutdown immediate;
Step 4.
以原來(lái)的spfile啟動(dòng)數(shù)據(jù)庫(kù):
SQL> startup;
還原undo表空間管理為自動(dòng):
SQL> alter system set undo_management='auto' scope=spfile;
取消隱藏參數(shù)的設(shè)置:
SQL> alter system reset "_offline_rollback_segments" scope=spfile;
重啟使其生效:
SQL> shutdown immediate;
SQL> startup
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- -------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string undo2
最終檢查一下:
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU40_1968985325$ ONLINE
_SYSSMU39_4040503138$ ONLINE
_SYSSMU38_4059847715$ ONLINE
_SYSSMU37_2692202156$ ONLINE
_SYSSMU36_2617425201$ ONLINE
_SYSSMU35_1133967719$ ONLINE
_SYSSMU34_1916939664$ ONLINE
_SYSSMU33_99444166$ ONLINE
_SYSSMU32_162619813$ ONLINE
_SYSSMU31_830375278$ ONLINE
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)中的優(yōu)化方法
這篇文章主要給大家介紹了Oracle數(shù)據(jù)庫(kù)中的優(yōu)化方法,Oracle數(shù)據(jù)庫(kù)是當(dāng)前應(yīng)用最廣泛的大型數(shù)據(jù)庫(kù)之一,其系統(tǒng)結(jié)構(gòu)復(fù)雜,性能受多方面因素影響,其中查詢(xún)操作是影響其性能的關(guān)鍵因素,需要的朋友可以參考下2023-07-07Oracle數(shù)據(jù)庫(kù)中l(wèi)ead和lag函數(shù)用法示例
lag與lead函數(shù)是跟偏移量相關(guān)的兩個(gè)分析函數(shù),通過(guò)這兩個(gè)函數(shù)可以在一次查詢(xún)中取出同一字段的前N行的數(shù)據(jù)(lag)和后N行的數(shù)據(jù)(lead)作為獨(dú)立的列,這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)中l(wèi)ead和lag函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2024-06-06Orcale權(quán)限、角色查看創(chuàng)建方法
查看當(dāng)前用戶(hù)擁有的系統(tǒng)權(quán)限、創(chuàng)建用戶(hù)、授予擁有會(huì)話(huà)的權(quán)限、授予無(wú)空間限制的權(quán)限等等,感興趣的朋友可以參考下哈,希望對(duì)你有所幫助2013-05-05maven添加oracle依賴(lài)失敗問(wèn)題的處理方法
這篇文章主要介紹了maven添加oracle依賴(lài)失敗問(wèn)題的處理方法,需要的朋友可以參考下2018-07-07解決The?Network?Adapter?could?not?establish?the?conn問(wèn)題
這篇文章主要介紹了解決The?Network?Adapter?could?not?establish?the?conn問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02oracle獲取上一旬的開(kāi)始時(shí)間和結(jié)束時(shí)間的實(shí)現(xiàn)函數(shù)
本文為大家介紹下oracle如何獲取上一旬的開(kāi)始時(shí)間和結(jié)束時(shí)間,實(shí)現(xiàn)函數(shù)如下,感興趣的朋友可以參考下2013-09-09JDBC Oracle執(zhí)行executeUpdate卡死問(wèn)題的解決方案
今天小編就為大家分享一篇關(guān)于JDBC Oracle執(zhí)行executeUpdate卡死問(wèn)題的解決方案,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Oracle數(shù)據(jù)庫(kù)對(duì)象的使用詳解
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)對(duì)象的使用,文章中涉及到的命令希望大家認(rèn)真學(xué)習(xí),對(duì)大家今后的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07