II 數據庫是啟動著的 如果你檢測到丟失或損壞了回滾段表空間的數據文件
並且數據庫是運行著的
不要把它 down 掉
在很多情況下
數據庫是啟著的比關閉著解決問題更容易些
這種情況的兩種可能的解決方法 :
A) 使丟失的那個數據文件 offline
並從備份中恢復它
這種情況適用於數據庫是處於歸檔方式的
B) 另一個方法是 offline 掉所有的那個文件所屬表空間的回滾段
drop 那個表空間
然後得建它們
你可能不得不殺掉那些使用著回滾段的進程
以便使它 offline
方法 II
A: 從備份恢復那個數據文件
這個方法只有你的庫是在歸檔方式下才能使用
脫機 (offline) 那個丟失的數據文件
ALTER DATABASE DATAFILE
<full_path_file_name>
OFFLINE;
提示
其於目前數據庫的事務量
你可能需要建一個臨時的回滾表空間和一些臨時的回滾段以備正常業務運行
從備份中恢復 (restore) 那個數據文件
執行如下命令
SELECT V
GROUP#
MEMBER
SEQUENCE#
FROM V$LOG V
V$LOGFILE V
WHERE V
GROUP# = V
GROUP# ;
這將列出所有的聯機的重做日志和他們的序號及首次改變號 (first change numbers)
得用聯機日志及歸檔日志恢復那個文件
RECOVER DATAFILE
<full_path_file_name>
確認所有的日志都被恢復
只到你收到
Media recovery complete
信息
使這個數據文件 online
ALTER DATABASE DATAFILE
<full_path_file_name>
ONLINE;
方法 II
B: 重建回滾表空間
這種方法不必考慮數據庫是否是歸檔模式的
步驟如下
試圖脫機所有的丟失或損壞數據文件所在回滾表空間中所包含的回滾段
ALTER ROLLBACK SEGMENT <rollback_segment> OFFLINE;
重復執行這個命令直到所包含的回滾段都脫機
檢查回滾段的狀態
在 drop 掉它們之前它們必需是 offline 狀態的
SELECT SEGMENT_NAME
STATUS FROM DBA_ROLLBACK_SEGS
WHERE TABLESPACE_NAME =
<TABLESPACE_NAME>
;
刪除掉所有脫機的 c
DROP ROLLBACK SEGMENT <rollback_segment>;
處理那些保持 online 狀態的回滾段
重復執行
一下的命令
如果回滾段在執行
中命令仍保扭虧為盈
ONLINE
狀態
意味著它之中有活動的事務
你可以用如下的查詢來確認一下
SELECT SEGMENT_NAME
XACTS ACTIVE_TX
V
STATUS
FROM V$ROLLSTAT V
DBA_ROLLBACK_SEGS
WHERE TABLESPACE_NAME =
<TABLESPACE_NAME>
AND SEGMENT_ID = USN;
如果這個查詢沒有結果返回
意味著沒有事務在這些回滾段中了
哪果有結果返回
那些不能 offline 的回滾段的狀態應為
PENDING OFFLINE
可以用
中的方法把這些事務殺掉
強制使有活動事務的回滾段脫機
執行如下查詢
看這些
PENDING OFFLINE
的回滾段包含哪些事務
SELECT S
SID
S
SERIAL#
S
USERNAME
R
NAME
ROLLBACK
FROM V$SESSION S
V$TRANSACTION T
V$ROLLNAME R
WHERE R
NAME IN (
<PENDING_ROLLBACK_
>
<PENDING_ROLLBACK_N>
)
AND S
TADDR = T
ADDR AND T
XIDUSN = R
USN;
用 ALTER SYSTEM KILL SESSION
<SID>
<SERIAL#>
; 語句殺掉這些事務
重復執行上面的查詢
直到沒有事務存在
這時運行一下
中的查詢
確認這些回滾段己經處於 offline 狀態
並用
中的語句把它們 drop 掉
刪除這個回滾表空間
DROP TABLESPACE <tablespace_name> INCLUDING CONTENTS;
如果語句執行失敗
請與 oracle 技術支持聯系
否則轉向
重建回滾段表空間
重建回滾段
並使它們聯機 (online)
回滾段表空間的數據文件丟失或損壞在實際中是比較棘手和常見的
產生這種問題 的原回很多的
比如介質的損壞
人為的誤操作
機器的突然的斷電等等
建議沒實踐過這種操作的 oracle 的愛好者可以模擬一下這種故障
實際實測一下
注意一定要在測試庫
我模擬的方法如下
單獨建了一個 rbs 表空間
並在這個表空間建了一個回滾段 rbs_test
指定一個 transaction 用這個回滾段
sql>set transaction use rollback segment rbs_test;
sql>insert into test values (
);
sql>insert into test values(
);
另開一個 telnet 窗口 telnet 至主機
執行如下命令 :
sqlplus /nolog
sql>conn / as sysdba
sql>shutdown abort
把新加的那個回滾段表空間的數據文件更個名
From:http://tw.wingwit.com/Article/program/Oracle/201311/17125.html