Oracle回滾段表空間檔案丟損地處理

2021-05-01 20:46:56 字數 2675 閱讀 9877

資料庫是啟動著的

如果你檢測到丟失或損壞了回滾段表空間的資料檔案,並且資料庫是執行著的,不要把它 down 掉。在很多情況下,資料庫是啟著的比關閉著解決問題更容易些。

這種情況的兩種可能的解決方法:

a) 使丟失的那個資料檔案 offline, 並從備份中恢復它,這種情況適用於資料庫是處於歸檔方式的。

b) 另乙個方法是 offline 掉所有的那個檔案所屬表空間的回滾段, drop 那個表空間 , 然後得建它們。你可能不得不殺掉那些使用著回滾段的程序,以便使它 offline.

方法 ii.a: 從備份恢復那個資料檔案

這個方法只有你的庫是在歸檔方式下才能使用。

1 、離線 (offline) 那個丟失的資料檔案。

alter database datafile offline;

2 、從備份中恢復 (restore) 那個資料檔案。

3 、執行如下命令

select v1.group#, member, sequence#

from v$log v1, v$logfile v2

where v1.group# = v2.group# ;

這將列出所有的聯機的重做日誌和他們的序號及首次改變號 (first change numbers).

4 、得用聯機日誌及歸檔日誌恢復那個檔案

recover datafile

5 、確認所有的日誌都被恢復,只到你收到 "media recovery complete" 資訊。

6 、使這個資料檔案 online

alter database datafile online;

方法 ii.b: 重建回滾表空間

這種方法不必考慮資料庫是否是歸檔模式的。

步驟如下:

1 、試圖離線所有的丟失或損壞資料檔案所在回滾表空間中所包含的回滾段。

alter rollback segment offline;

重複執行這個命令直到所包含的回滾段都離線 .

2 、檢查回滾段的狀態。

在 drop 掉它們之前它們必需是 offline 狀態的。

select segment_name, status from dba_rollback_segs

where tablespace_name = ;

3 、刪除掉所有離線的 c 。

drop rollback segment ;

4 、處理那些保持 online 狀態的回滾段

重複執行 2 一下的命令,如果回滾段在執行 1 中命令仍保扭虧為盈 "online" 狀態,意味著它之中有活動的事務,你可以用如下的查詢來確認一下:

select segment_name, xacts active_tx, v.status

from v$rollstat v, dba_rollback_segs

where tablespace_name = and segment_id = usn;

如果這個查詢沒有結果返回,意味著沒有事務在這些回滾段中了。哪果有結果返回,那些不能offline 的回滾段的狀態應為 "pending offline" 。可以用 5 中的方法把這些事務殺掉。

5 、強制使有活動事務的回滾段離線

執行如下查詢,看這些 "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 (, ... , )

and s.taddr = t.addr and t.xidusn = r.usn;

用 alter system kill session , ; 語句殺掉這些事務,重複執行上面的查詢,直到沒有事務存在,這時執行一下 2 中的查詢,確認這些回滾段己經處於 offline 狀態 , 並用 3 中的語句把它們 drop 掉。

6 、刪除這個回滾表空間。

drop tablespace including contents;

7 、重建回滾段表空間。

8 、重建回滾段,並使它們聯機 (online) 。

譯者按:回滾段表空間的資料檔案丟失或損壞在實際中是比較棘手和常見的,產生這種問題 的原回很多的,比如介質的損壞、人為的誤操作、機器的突然的斷電等等。

建議沒實踐過這種操作的 oracle 的愛好者可以模擬一下這種故障,實際實測一下,注意一定要在測試庫,我模擬的方法如下:

1 、單獨建了乙個 rbs 表空間,並在這個表空間建了乙個回滾段 rbs_test 。

2 、指定乙個 transaction 用這個回滾段

sql>set transaction use rollback segment rbs_test;

sql>insert into test values (2);

sql>insert into test values(3);

3 、另開乙個 telnet 視窗 telnet 至主機,執行如下命令 :

sqlplus /nolog

sql>conn / as sysdba

sql>shutdown abort

4 、把新加的那個回滾段表空間的資料檔案更個名。

回滾段表空間檔案損壞修復記錄

1.回滾段狀態為 needs recovery 需要恢復 2.回滾段表空間離線,資料檔案離線 3.刪除回滾段表空間提示 ora 01548 active rollback segment rbs 01 found,terminate dropping 不能刪除 4.alter rollback se...

ORACLE 建立回滾段

create rollback segment rs01 tablespace ts name storage initial 8m next 8m maxextents unlimited 回滾段管理一直是oracle資料庫管理的乙個難題,本文通過例項介紹oracle回滾段的概念,用法和規劃及問題...

Oracle誤刪表空間檔案

oracle誤刪表空間檔案 網上給的說法是 sqlplus as sysdba 以dba身份登陸資料庫 shutdown immediate 關閉資料庫 startup mount 開啟控制檔案 alter database open 重啟資料庫到mount狀態,然後drop掉誤刪除的檔案,再開啟資...