数据库open时,回滚数据文件丢失,无备份,有活动事务(实验系列)

解决方案:

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)        恢复完毕!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值