UNDO表空間備份恢復(三)

 show parameter undo 查看undo表空間的幾本信息

第一,查看undo表空間使用的是第幾個文件

select tablespace_name,file_name from dba_data_files;

TABLESPACE_NAME FILE_NAME
--------------- ---------------------------------------------
USERS  /u01/oracle/oradata/ora10g/users01.dbf
SYSAUX  /u01/oracle/oradata/ora10g/sysaux01.dbf
UNDOTBS1 /u01/oracle/oradata/ora10g/undotbs01.dbf
SYSTEM  /u01/oracle/oradata/ora10g/system01.dbf
MYTBS  /u01/oracle/oradata/ora10g/mytbs01.dbf

我們開始做交易

update scott.emp set sal=sal+1 where deptno=30;

然後查看事物的存在

select XIDUSN,XIDSLOT,XIDSQN from v$transaction;

 XIDUSN    XIDSLOT   XIDSQN
---------- ---------- ----------
  5    27      344

---介紹

XIDUSN:就是事務的回滾段號
XIDSLOT:就是ITL(interesting  transaction  list)列表中,slot的號
XIDSQN:就是表示這個slot被重複使用的次數

查看使用的回滾段

select segment_name,tablespace_name,file_id from dba_rollback_segs where segment_id=2;

SEGMENT_NAME    TABLESPACE_NAME    FILE_ID
------------------------- --------------- ----------
_SYSSMU2$    UNDOTBS1     2

這裏看到2號被使用 

第二,開始破壞回滾段

!cp /etc/passwd /u01/oracle/oradata/ora10g/undotbs01.dbf

再次查看

SQL> SELECT FILE#, STATUS,RECOVER, NAME,error FROM V$DATAFILE_HEADER ;

     FILE#    STATUS     REC      NAME                                                                         ERROR
----------       ----------       ---        --------------------------------------------------                          --------------------
       1          ONLINE     NO      /u01/oracle/oradata/ora10g/system01.dbf
       2          ONLINE                /u01/oracle/oradata/ora10g/undotbs01.dbf      CANNOT READ HEADER
       3          ONLINE     NO     /u01/oracle/oradata/ora10g/sysaux01.dbf
       4          ONLINE     NO     /u01/oracle/oradata/ora10g/users01.dbf
       5          ONLINE     NO     /u01/oracle/oradata/ora10g/mytbs01.dbf

這裏顯示的    需要回復的REC 2號文件時空說明需要恢復  ERROR  2號文件出現了錯誤,由於回滾段是存放交易之前的信息的 所以這時候就找不到之前的信息了。

因爲沒有備份 所以我們建立一個新的undo表空間來取締之前的undo表空間

第三,

drop tablespace undotbs1

drop tablespace undotbs1
*
ERROR at line 1:
ORA-30013: undo tablespace 'UNDOTBS1' is currently in use

報錯:因爲壞塊上面的事物還存在,在內存裏。

select tablespace_name,segment_name,status from dba_rollback_segs where tablespace_name='UNDOTBS1'

TABLESPACE_NAME    SEGMENT_NAME      STATUS
---------------                       -------------------------      ----------
UNDOTBS1                         _SYSSMU1$          OFFLINE
UNDOTBS1                         _SYSSMU2$          ONLINE
UNDOTBS1                         _SYSSMU3$          OFFLINE
UNDOTBS1                         _SYSSMU4$          OFFLINE
UNDOTBS1                         _SYSSMU5$          OFFLINE
UNDOTBS1                         _SYSSMU6$          OFFLINE
UNDOTBS1                         _SYSSMU7$          OFFLINE
UNDOTBS1                         _SYSSMU8$          OFFLINE
UNDOTBS1                         _SYSSMU9$          OFFLINE
UNDOTBS1                         _SYSSMU10$        OFFLINE

2號正是我們剛纔產生事物交易的時候佔用的回滾段 他的狀態是online

SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS
       FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS
       WHERE TABLESPACE_NAME = 'UNDOTBS1' AND SEGMENT_ID = 2

SEGMENT_NAME     ACTIVE_TX    STATUS
-------------------------     ----------             --------------------
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             1                       PENDING OFFLINE
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             0                       ONLINE
_SYSSMU2$             0                       ONLINE

 顯示2號正在等待着離線的狀態

查看是誰在佔用這個回滾段

SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK"
       FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R
       WHERE R.NAME ='_SYSSMU2$'
       AND S.TADDR = T.ADDR AND T.XIDUSN = R.USN

SID          SERIAL#      USERNAME                    ROLLBACK
-----------   ----------        ------------------------------     ------------------------------
 148         28                SCOTT                             _SYSSMU7$

alter system kill session '148,28';

drop tablespace undotbs1;

drop tablespace undotbs1
*
ERROR at line 1:
ORA-30013: undo tablespace 'UNDOTBS1' is currently in use

發現還是刪除不了

SQL> SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS
      FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS
          WHERE TABLESPACE_NAME = 'UNDOTBS1' AND SEGMENT_ID = 2;

SEGMENT_NAME       ACTIVE_TX    STATUS
-------------------------       ----------            --------------------
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      PENDING OFFLINE
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      ONLINE
_SYSSMU2$                0                      ONLINE

SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK"
      FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R
      WHERE R.NAME ='_SYSSMU2$'
        AND S.TADDR = T.ADDR AND T.XIDUSN = R.USN;

no rows selected

發現已經沒有人使用了但是還是無法刪除   這時候我們使用隱含參數 將這個損壞的文件強制離線

shutdown abort

conn /as sysdba

startup nomount  在nomount狀態下降強制離線

alter system set "_offline_rollback_segments"='_SYSSMU7$' scope=spfile;

shutdown immediate    ----一致性停庫

startup nomount

alter database mount;

alter database open;

如果此時啓動檢測這個文件失敗 將這個文件離線
ORA-01122: database file 2 failed verification check
ORA-01110: data file 2: '/u01/oracle/oradata/db20/undotbs01.dbf'
ORA-01251: Unknown File Header Version read for file number 2

alter tablespace undotbs1 offline;

alter database open;

select ename,sal from t1 where deptno=30;

select ename,sal from t1 where deptno=30
                      *
ERROR at line 1:
ORA-00376: file 2 cannot be read at this time
ORA-01110: data file 2: '/u01/oracle/oradata/orcl/undotbs01.dbf'

出錯

我們就創建一個undo表空間

create undo tablespace undotbs2  datafile '/u01/oracle/oradata/ora10g/undotbs02.dbf' size 20M;

alter system undo_tablespace=undotbs2;     把undotbs1設置爲undo表空間

undotbs1表空間刪除掉原來的

drop tablespace undotbs1 including concents cascade constraints;

drop tablespace undotbs1
*
ERROR at line 1:
ORA-01548: active rollback segment '_SYSSMU3$' found, terminate dropping tablespace
發現報錯

然後找出具體的undo段

select segment_name from dba_rollback_segs where tablespace_name='UNDOTBS1'

SEGMENT_NAME
------------------------------
_SYSSMU3$
_SYSSMU4$
_SYSSMU5$
_SYSSMU6$
_SYSSMU7$
_SYSSMU8$
_SYSSMU9$
_SYSSMU10$

發現有這麼多 我們把這些段寫進參數文件然後刪除

創建文本參數文件

create pfile from spfile

shutdown immediate;   停庫

在參數文件裏家進這些回滾段

cd $ORACLE_HOME/

cd dbs

編輯文本參數文件

vi initorcl.ora

加進去那些壞的回滾段

*._corrupted_rollback_segments=(_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)

sqlplus / as sysdba

startup pfile=startup pfile='/u01/oracle/product/10.2.0/dbs/initorcl.ora';

啓動之後刪除老的回滾段

drop tablespace undotbs1 including contents and datafiles cascade constraints;

再次查詢

select ename,sal from scott.emp where deptno=30;

ENAME             SAL
---------- ----------
ALLEN            1600
WARD             1250
MARTIN           1250
BLAKE            2850
TURNER           1500
JAMES             950

發現我們已經恢復完畢。

oracle裏可以有哦多個undo表空間 但同時只有一個表空有效

 

 


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章