oracle|資料|資料庫
Oracle物理結構故障是指構成資料庫的各個物理檔案損壞而導致的各種資料庫故障。這些故障可能是由於硬體故障造成的,也可能是人為誤操作而引起。所以我們首先要判斷問題的起因,如果是硬體故障則首先要解決硬體問題。在無硬體問題的前提下我們才能按照下面的處理方發來進一步處理。
控制檔案損壞:
控制檔案記錄了關於oracle的重要配置資訊,如資料庫名、字元集名字、各個資料檔案、記錄檔的位置等等資訊。控制檔案的損壞,會導致資料庫異常關閉。一旦缺少控制檔案,資料庫也無法啟動,這是一種比較嚴重的錯誤。
可以通過查菘獾娜罩疚募炊ㄎ凰鴰盜說目刂莆募H罩疚募揮?ORACLE_BASE/admin/bdump/alert_ORCL.ora.
損壞單個控制檔案:
1. 確保資料庫已經關閉,如果沒有用下面的命令來關閉資料庫:
svrmgrl>shutdown immediate;
2. 查看初始設定檔案$ORACLE_BASE/admin/pfile/initORCL.ora,確定所有控制檔案的路徑。
3. 用作業系統命令將其它正確的控制檔案覆蓋錯誤的控制檔案。
4. 用下面的命令重新啟動資料庫
svrmgrl>startup;
5. 用適當的方法進行資料庫全備份。
損壞所有的控制檔案:
1. 確保資料庫已經關閉,如果沒有用下面的命令來關閉資料庫:
svrmgrl>shutdown immediate;
2. 從相應的備份結果集中恢複最近的控制檔案。對於沒有採用帶庫備份的點可以直接從磁帶上將最近的控制檔案備份恢複到相應目錄;對於採用帶庫備份的點用相應的rman指令碼來恢複最近的控制檔案。
3. 用下面的命令來建立產生資料庫控制檔案的指令碼:
svrmgrl>startup mount;
svrmgrl>alter database backup controlfile to trace noresetlogs;
4. 修改第三步產生的trace檔案,將其中關於建立控制檔案的一部分語句拷貝出來並做些修改,使得它能夠體現最新的資料庫結構。假設產生的sql檔案名稱字為createcontrol.sql.
注意:
Trace檔案的具體路徑可以在執行完第3)步操作後查看$ORACLE_BASE/admin/bdump/alert_ORCL.ora檔案來確定。
5. 用下面命令重新建立控制檔案:
svrmgrl>shutdown abort;
svrmgrl>startup nomount;
svrmgrl>@createcontrol.sql;
6. 用適當的方法進行資料庫全備份。
重做記錄檔損壞:
資料庫的所有增、刪、改都會記錄入重做日誌。如果當前啟用的重做記錄檔損壞,會導致資料庫異常關閉。非啟用的重做日誌最終也會因為日誌切換變為啟用的重做日誌,所以損壞的非啟用的重做日誌最終也會導致資料庫的異常終止。在ipas/mSwitch中每組重做日誌只有一個成員,所以在下面的分析中只考慮重做日誌組損壞的情況,而不考慮單個重做日誌成員損壞的情況。
確定損壞的重做日誌的位置及其狀態:
1. 如果資料庫處於可用狀態:
select * from v$logfile;
svrmgrl>select * from v$log;
2. 如果資料庫處於已經異常終止:
svrmlgr>startup mount;
svrmgrl>select * from v$logfile;
svrmgrl>select * from v$log;
其中,logfile的狀態為INVALID表示這組記錄檔出現已經損壞;log狀態為Inactive:表示重做記錄檔處於非啟用狀態;Active: 表示重做記錄檔處於啟用狀態;Current:表示是重做日誌為當前正在使用的記錄檔。
損壞的記錄檔處於非啟用狀態:
1. 刪除相應的日誌組:
svrmgrl>alter database drop logfile group group_number;
2. 重新建立相應的日誌組:
svrmgrl>alter database add log file group group_number (’log_file_descritpion’,…) size log_file_size;
損壞的記錄檔處於啟用狀態且為非當前日誌:
1. 清除相應的日誌組:
svrmgrl>alter database clear unarchived logfile group group_number;
損壞的記錄檔為當前活動紀錄檔案:
用命令清除相應的日誌組:
svrmgrl>alter database clear unarchived logfile group group_number;
如果清除失敗,則只能做基於時間點的不完全恢複。
開啟資料庫並且用適當的方法進行資料庫全備份:
svrmgrl>alter database open;
部分資料檔案損壞:
若損壞的資料檔案屬於非system資料表空間,則資料庫仍然可以處於開啟狀態可以進行操作,只是損壞的資料檔案不能訪問。這時在資料庫開啟狀態下可以單獨對損壞的資料檔案進行恢複。若是system資料表空間的資料檔案損壞則資料庫系統會異常終止。這時資料庫只能以Mount方式開啟,然後再對資料檔案進行恢複。可以通過查看資料庫記錄檔來判斷當前損壞的資料檔案到底是否屬於system資料表空間。
非system資料表空間的資料檔案損壞
1. 確定損壞的檔案名稱字:
svrmgrl>select name from v$datafile where status=’INVALID’;
2. 將損壞的資料檔案處於offline狀態:
svrmgrl>alter database datafile ‘datafile_name’ offline;
3. 從相應的備份結果集中恢複關於這個資料檔案的最近的備份。對於沒有採用帶庫備份的點可以直接從磁帶上恢複;對於用帶庫備份的點用相應的rman指令碼來恢複。
4. 恢複資料檔案:
svrmgrl>alter database recover datafile ‘file_name’;
5. 使資料庫檔案online:
svrmgrl>alter database datafile ‘datafile_name’ online;
6. 用適當的方法進行資料庫全備份。
system資料表空間的資料檔案損壞:
1. 以mount方式啟動資料庫
svrmgrl>startup mount;
2. 從相應的備份結果集中恢複關於這個資料檔案的最近的備份。對於沒有採用帶庫備份的點可以直接從磁帶上恢複;對於用帶庫備份的點用相應的rman指令碼來恢複。
3. 恢複system資料表空間:
svrmgrl>alter database recover datafile ‘datafile_name’;
4. 開啟資料庫:
svrmgrl>alter database open;
5. 用適當的方法進行資料庫全備份。
資料表空間損壞:
若非system資料表空間已經損壞,則資料庫仍然可以處於開啟狀態可以進行操作,只是損壞的資料表空間不能訪問。這樣在資料庫開啟狀態下可以單獨對損壞的資料表空間進行恢複。若是system資料表空間損壞則資料庫系統會異常終止。這時資料庫只能以Mount方式開啟,然後再對錶空間進行恢複。可以通過查看資料庫記錄檔來判斷當前損壞的資料表空間是否是system資料表空間.
非system資料表空間損壞:
1. 將損壞的資料表空間處於offline狀態:
svrmgrl>alter tablespace ‘tablespace_name’ offline;
2. 從相應的備份結果集中恢複關於這個資料表空間最近的備份。對於沒有採用帶庫備份的點可以直接從磁帶上恢複;對於用帶庫備份的點用相應的rman指令碼來恢複。
3. 恢複資料表空間:
svrmgrl>alter database recover tablespace ‘tablespace_name’;
4. 使資料表空間online:
svrmgrl>alter tablespace ‘tablespace_name’ online;
5. 用適當的方法進行資料庫全備份.
system資料表空間損壞:
1. 以mount方式啟動資料庫
svrmgrl>startup mount;
2. 從相應的備份結果集中恢複system資料表空間最近的備份。對於沒有採用帶庫備份的點可以直接從磁帶上恢複;對於用帶庫備份的點用相應的rman指令碼來恢複。
3. 恢複system資料表空間:
svrmgrl>alter database recover tablespace system;
4. 開啟資料庫:
svrmgrl>alter database open;
5. 用適當的方法進行資料庫全備份。
整個資料庫的所有檔案損壞:
整個資料庫所有檔案的損壞一般是在共用磁碟陣列發生無法恢複的災難時才發生,這種情況下只能對資料庫進行恢複。若資料庫的歸檔目錄也已經丟失,則資料庫不可能做完全恢複,會有使用者資料的丟失。
沒採用帶庫備份的現場:
1. 將最近的備份從磁帶上把各個檔案解包到相應的目錄下。
2. 以mount方式開啟資料庫:
svrmgrl>startup mount;
3. 恢複資料庫:
svrmgrl>recover database until cancel;
4. 開啟資料庫:
svrmgrl>alter database open resetlogs;
5. 用適當的方法進行資料庫全備份。
採用帶庫備份的現場:
1. 以nomount方式開啟資料庫:
svrmgrl>startup nomount;
2. 通過相應的rman指令碼進行資料庫軟恢複。
$rman cmdfile=hot_database_restore.rcv
3. 開啟資料庫:
svrmgrl>alter database open resetlogs;
4. 用適當的方法進行資料庫全備份。
存在最近的資料庫完整冷備份前提下的一些經典緊急情況的處理:
資料檔案,歸檔重作日誌和控制檔案同時丟失或損壞:
無新增archives 時的狀況:
條件和假設:自上次鏡像備份以來尚未產生新的archive log(s); Archivelog Mode; 有同步的datafile(s) 和control file(s) 的鏡像(冷)拷貝
恢複步驟:
1. 將鏡像拷貝的datafile(s) 和control file(s) 抄送回原始地點:
$ cp /backup/good_one.dbf /orig_loc/bad_one.dbf
$ cp /backup/control1.ctl /disk1/control1.ctl
2. 以mount 選項啟動資料庫:
$ svrmgrl
svrmgrl> connect internal
svrmgrl> startup mount
3. 以舊的control file 來恢複資料庫:
svrmgrl> recover database using backup controlfile until cancel;
*** 介質恢複完成
(必須馬上cancel )
4. Reset the logfiles (對啟動而言不可省略):
svrmgrl> alter database open resetlogs;
5. 關閉資料庫並做一次全庫冷備份。
[1] [2] 下一頁