读书人

UNDO表空间(3)无备份块损坏

发布时间: 2012-09-10 11:02:33 作者: rapoo

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表空间 但同时只有一个表空有效


读书人网 >其他数据库

热点推荐