解决方案:
1. 创建一个新的undo表空间
2. 删除旧的undo表空间及其文件。(无法删除)
3. 引用隐含参数打开数据库
4. 删除旧的表空间及其数据文件!
实验步骤:
a) Session_A> drop table t1;
Session_A> show parameter undo;(查看undo表空间及其管理方式)!
b) Session_A> create table t1 (x int);
表已创建。
Session_A> insert into t1 values (1);
已创建 1 行。(会话A有问完成事务!)
c) Session_B> select XIDUSN,XIDSLOT,XIDSQN from v$transaction;
XIDUSN XIDSLOT XIDSQN
---------------- ---------------- ----------------
18 26 9
已选择 1 行。
Session_B> select segment_name,tablespace_name,file_id from dba_rollback_segs where segment_id=18;
SEGMENT_NAME TABLESPACE_NAME FILE_ID
------------------------------ -------------------- ----------------
_SYSSMU18$ UNDOTBS02 6(查看回撤段号,文件号,确定有活动事务)
d) 丢失undotbs02数据文件!
e) Session_B> SELECT FILE#, STATUS, ERROR, RECOVER, TABLESPACE_NAME, NAME FROM V$DATAFILE_HEADER
2 WHERE RECOVER = 'YES' OR (RECOVER IS NULL AND ERROR IS NOT NULL);
FILE# STATUS ERROR REC TABLESPACE_NAME NAME
----- ------- ---------- --- -------------------- ---------------------------------------------
6 ONLINE CANNOT D:\ORACLE\ORADATA\YXD\UNDOTBS02.DBF
READ
HEADER
已选择 1 行。(查看相关文件头的信息不能读)
f) SQL> create undo tablespace undotbs01 datafile 'D:\ORACLE\ORADATA\YXD\UNDOTBS01.DBF' size 20M;
表空间已创建。
SQL> alter system set undo_tablespace=undotbs01;
系统已更改。(创建新undo表空间,并指定当前的undo为新建的表空间)
g) SQL> drop tablespace undotbs02;
drop tablespace undotbs02
*
ERROR 位于第 1 行:
ORA-30013: 撤消表空间 'UNDOTBS02' 当前正在使用中(活动事务的回撤段表空间无法删除)
h) SQL> SELECT SEGMENT_NAME, STATUS FROM DBA_ROLLBACK_SEGS WHERE TABLESPACE_NAME ='UNDOTBS02';
SEGMENT_NAME STATUS
------------------------------ ----------------
_SYSSMU11$ OFFLINE
_SYSSMU12$ OFFLINE
_SYSSMU13$ OFFLINE
_SYSSMU14$ OFFLINE
_SYSSMU15$ OFFLINE
_SYSSMU16$ OFFLINE
_SYSSMU17$ OFFLINE
_SYSSMU18$ ONLINE <== 有活动回滚段
_SYSSMU19$ OFFLINE
_SYSSMU20$ OFFLINE(有online的回撤段,就无法删除表空间)
i) SQL> SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS
2 FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS
3 WHERE TABLESPACE_NAME = 'UNDOTBS02' AND SEGMENT_ID = USN;
SEGMENT_NAME ACTIVE_TX STATUS
------------------------------ ---------------- ---------------
_SYSSMU18$ 1 PENDING OFFLINE(查看回撤段的信息为等待变成offline,没转换成功)
j) SQL> SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK"
2 FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R
3 WHERE R.NAME ='_SYSSMU18$'
4 AND S.TADDR = T.ADDR AND T.XIDUSN = R.USN;
SID SERIAL# USERNAME ROLLBACK
---------------- ---------------- ------------ ------------
20 46 SYS _SYSSMU18$(找出该活动事务的会话信息)
k) SQL> alter system kill session '20,46';
系统已更改。(杀掉该会话信息.但是无法救回活动的undo数据,数据仍然不一致)
l) SQL> alter database datafile 6 offline;
数据库已更改。
m) SQL> drop tablespace undotbs02 including contents;
drop tablespace undotbs02 including contents
*ERROR 位于第 1 行:
ORA-30013: 撤消表空间 'UNDOTBS02' 当前正在使用中(无法drop undo表空间)
n) SQL> shutdown immediate
ORA-00376: 此时无法读取文件 6
ORA-01110: 数据文件 6: 'D:\ORACLE\ORADATA\YXD\UNDOTBS02.DBF'
SQL> conn /as sysdba
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
o) SQL> SELECT SEGMENT_NAME, STATUS FROM DBA_ROLLBACK_SEGS WHERE TABLESPACE_NAME ='UNDOTBS02';
SEGMENT_NAME STATUS
------------------------------ ----------------
_SYSSMU11$ OFFLINE
_SYSSMU12$ OFFLINE
_SYSSMU13$ OFFLINE
_SYSSMU14$ OFFLINE
_SYSSMU15$ OFFLINE
_SYSSMU16$ OFFLINE
_SYSSMU17$ OFFLINE
_SYSSMU18$ NEEDS RECOVERY <== 状态是need recovery
_SYSSMU19$ OFFLINE
_SYSSMU20$ OFFLINE
p) SQL> drop tablespace undotbs02 including contents;
drop tablespace undotbs02 including contents
*ERROR 位于第 1 行:
ORA-01548: 已找到活动回退段'_SYSSMU18$',终止删除表空间
q) SQL> alter system set undo_management=manual scope=spfile;
系统已更改。
SQL> startup force
ORACLE 例程已经启动。
SQL> drop tablespace undotbs02 including contents;
drop tablespace undotbs02 including contents
*ERROR 位于第 1 行:
ORA-01548: 已找到活动回退段'_SYSSMU18$',终止删除表空间
r) SQL> alter tablespace undotbs02 offline immediate;
表空间已更改。
SQL> drop tablespace undotbs02 ;
drop tablespace undotbs02
*ERROR 位于第 1 行:
ORA-01548: 已找到活动回退段'_SYSSMU18$',终止删除表空间
s) QL> alter system set "_offline_rollback_segments"='_SYSSMU18$' scope=spfile;
系统已更改。
SQL> startup force
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
t) SQL> drop tablespace undotbs02 including contents;
表空间已丢弃。
u) 恢复完毕!