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表空間 但同時只有一個表空有效