undo資料表空間修複小結

來源:互聯網
上載者:User

undo資料表空間修複小結

首先要知道復原段在自動管理undo資料表空間下是不能被offline和刪除的,可以先改成manual之後操作, 我們知道undo資料表空間是用來儲存資料被改之前的前鏡像,那麼如果出現問題,可以分兩種情況來處理;
第一種情況:如果損壞的復原段沒有正在執行的事務,那問題還相對簡單,可以直接刪除掉該復原段即可,並且沒有資料丟失。

具體過程:假設檔案undotbs01.dbf丟失或者損壞。

1.先把資料檔案offline,在mount狀態下執行:

SQL>alter database datafile '/software/oradata/JLPROJCT/undotbs01.dbf' offline drop ; 

2,開啟資料庫

SQL>alter  database open;

3.我們知道一個資料檔案對應n個undo段,所有現在已經有好多undo 段已經 offline了,我們先不對他做任何操作,先查看不是offline的undo段,你會發現他們是不是offline的這些undo段是需要恢複(need recover)

SQL> select status,count(*) from dba_rollback_segs group by status;

STATUS            COUNT(*)

---------------- ----------

ONLINE                  23

need recovery        5

OFFLINE                143

SQL>select segment_name,status from dba_rollback_segs where status<>'offline';  就會發現所有使用者復原段是需要恢複的,狀態是need recovery.,這個語句不會顯示由於資料檔案損壞而出現offline的復原段。

SEGMENT_NAME                  STATUS

------------------------------ ----------------

SYSTEM                                        ONLINE                    ###這是系統復原段。

_SYSSMU154_3691636531$        need recovery

_SYSSMU155_3686385895$        need recovery

_SYSSMU156_3796802683$        need recovery

_SYSSMU157_2723916652$        need recovery

_SYSSMU158_1435464080$        need recovery

4.建立一個復原資料表空間,

SQL>create  undo tablespace undo2  datafile  '/software/oradata/JLPROJCT/undotbs02.dbf'  size 100m ;
 

 tablespace created

5,把復原段設定成人工管理,然後刪除損壞的復原段。

SQL>alter system set undo_tablespace= 'undo2'  scope=spfile;  ##指定成建立的undo資料表空間。
 

system altered 

SQL>alter system set undo_management='manual'  scope=spfile;

system altered
 

6,建立pfile

SQL>create pfile='/Oracle/app/pfile.ora  from spfile;
 

file created 

7,一致性關閉資料庫,

SQL>shu  immediate
 

8,在pfile 檔案中添加一個隱藏參數,把這些復原段都列在這個參數值裡,

*._offline_rollback_segment=('_SYSSMU154_3691636531$','_SYSSMU155_3686385895$','_SYSSMU156_3796802683$','_SYSSMU157_2723916652$','_SYSSMU158_1435464080$')

9,建立成spfile  然後啟動資料庫。

SQL>create spfile  from pfile;
 

spfile created 

SQL>startup

10,這時候復原段數量並沒有發生改變,

SQL>select segment_name,status from dba_rollback_segs where status<>'offline'; 

SEGMENT_NAME                  STATUS

------------------------------ ----------------

SYSTEM                                        ONLINE           

_SYSSMU154_3691636531$        need recovery

_SYSSMU155_3686385895$        need recovery

_SYSSMU156_3796802683$        need recovery

_SYSSMU157_2723916652$        need recovery

_SYSSMU158_1435464080$        need recovery
11,因為是手工管理,可以直接刪除掉那些復原段。
SQL> drop rollback segment  “_SYSSMU154_3691636531$”;

rollback segment droped
 

.

.

.

.

12,然後刪掉原來的undo資料表空間。

SQL>drop tablespace undo1  including contents;

13,然後重啟資料庫,

shu immediate 

startup 

14,注意這時候你的undo 管理還是手工的,所以要把之前的修改改正會自動管理。並且把添加的隱含參數*._offline_rollback_segment刪掉。

SQL>alter system set undo_management='auto'  scope=spfile;

第二種情況:當損壞的undo 資料表空間的復原段上還有活動的事務,這種情況就要強行提交這些事務,就會造成一些資料的丟失。

1,啟動資料庫到mount狀態,只能啟動到這裡,

2,把有問題的復原段offline

SQL>alter database datafile '/software/oradata/JLPROJCT/undotbs01.dbf' offline drop ;

3,查看復原段狀態,和第一種情況略有不同,她沒有offline的復原段。

SQL>select usn,xacts from v$rollstat;

SQL> select status,count(*) from dba_rollback_segs group by status;

STATUS            COUNT(*)

---------------- ----------

ONLINE                  23

need recovery        5

QL>select segment_name,status from dba_rollback_segs where status<>'offline'; 

SEGMENT_NAME                  STATUS

------------------------------ ----------------         

_SYSSMU154_3691636531$        need recovery

_SYSSMU155_3686385895$        need recovery

_SYSSMU156_3796802683$        need recovery

_SYSSMU157_2723916652$        need recovery

_SYSSMU158_1435464080$        need recovery

  4,試圖建立發現報錯,真正工作中可以從這裡來判斷到底是那種情況,第一種情況是可以重建立立的。
 必須先禁止繼續使用舊的復原段和復原空間: 

SQL>create pfile=/oracle/app/pfile.ora  from spfile
 

file created 

SQL>shutdown  immediate ;

在pfile中添加並修改以下內容:

*.undo_management='manual'  ###手動管理,才可以刪除復原段

*._offline_rollback_segments=('_SYSSMU154_3691636531$','_SYSSMU155_3686385895$','_SYSSMU156_3796802683$','_SYSSMU157_2723916652$','_SYSSMU158_1435464080$')      ###這樣才能刪除這些復原段

*.undo_tablespace='undo2'    ###這樣就會讓以後的事務不在用舊的復原段和undo資料表空間,

5.建立成spfile  然後啟動資料庫。

SQL>create spfile  from pfile;
 

spfile created 

SQL>startup 

6,刪除舊的復原段和復原資料表空間:

SQL>drop rollbackup segment  '_SYSSMU154_3691636531$'  ;

'

'

'

'

把need recovery 的復原段全部刪除後,

SQL>drop undo tablespace undo1 including  contents;  ###因為已經丟失,就不必要添加資料檔案了(and datafiles 選項了)

7,建立一個新的undo資料表空間,然後啟動資料庫,再修改undo_management 為自動。

注意這樣後,所有未提交的事務都當做提交處理了。

總結:要是undo出現問題,你可以先把資料檔案offline,然後修改undo_management 為manual,之後查出狀態need recover 的復原段,修改隱含參數 *._offline_rollback_segments ,把需要刪除的(狀態為need recover 的復原段)添加進來,然後刪除他們。重新建立undo資料表空間,然後undo_tablespace=新建立的資料表空間,開啟資料庫,最後把undo_management =auto ,即可。

--------------------------------------------------------------------------------

RMAN備份與恢複之undo資料表空間丟失

關於Oracle 釋放過度使用的undo資料表空間

Oracle undo的一些理解

Oracle undo 鏡像資料探究

Oracle 復原(ROLLBACK)和撤銷(undo)

Linux-6-64下安裝Oracle 12C筆記

在CentOS 6.4下安裝Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虛擬機器中安裝步驟

Debian 下 安裝 Oracle 11g XE R2

--------------------------------------------------------------------------------

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.