Oracle UNDO表空间对应的文件在运行过程中丢失如何恢复

上次在blog中模拟了undo表空间对应的文件在shutdown immediate后,在重新启动之前丢失了,这仅仅是模拟而已,现实中这个时间段(shutdown immediate --- startup)这个期间丢失undo文件的可能性几乎没有.这个情况的恢复请参照http://blog.csdn.net/kkdelta/article/details/7206795

而最常发生的是在运行中undo文件损坏或者丢失.今天来模拟一下这种情况.

1,在一个session中模拟业务正在进行:有更新发生,但是没有提交.

create table test as select * from all_objects where 1=2
insert into test select * from all_objects
insert into test select * from all_objects
select count(*) from test;
COUNT(*)
----------
100402

2,模拟down机,SQL> shutdown abort
ORACLE instance shut down.

3,将undo文件重命名UNDOTBS01.DBF.1,模拟丢失.(在Windows中需要从发出shutdown abort的sqlplus中退出,SQL> exit)

4,这时候重新启动数据库的时候:

SQL> startup
ORACLE instance started.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 343935876 bytes
Database Buffers 260046848 bytes
Redo Buffers 7135232 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF'

如果有备份的undo文件,恢复步骤如下

1,将备份拷贝回来

2恢复文件SQL> recover datafile 2;
Media recovery complete.
3,打开数据库 SQL> alter database open;
Database altered.

数据成功恢复,数据不会有错误.


如果没有备份的undo文件,恢复步骤如下

1,SQL> alter database datafile 2 offline drop;
Database altered.

2,创建一个pfile

SQL> create pfile='D:\oracle\product\10.2.0\admin\orcl\pfile\initorcl.ora' from spfile;
File created.

如果生产的pfile中有重定向的语句,如:*.SPFILE='D:\oracle\product\10.2.0\db_1/dbs/spfileorcl.ora'

SQL> create pfile='D:\oracle\product\10.2.0\admin\orcl\pfile\initorcl.ora' from SPFILE='D:\oracle\product\10.2.0\db_1/dbs/spfileorcl.ora';

将pfile的*.undo_management='AUTO'改为*.undo_management='MANUAL'

在pfile里添加: *._corrupted_rollback_segments=(_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU1$)
3,重新用pfile启动数据库

SQL> shutdown immediate

ORACLE instance shut down.

SQL> startup pfile='D:\oracle\product\10.2.0\admin\orcl\pfile\initorcl.ora'
ORACLE instance started.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 377490308 bytes
Database Buffers 226492416 bytes
Redo Buffers 7135232 bytes
Database mounted.
Database opened.

数据库成功打开.但是数据是不一致的,可以看到test表里没有提交的数据也存在于数据库.

[这一步有的时候成功,有的时候不成功,感觉更数据库打开的时候做实例恢复的时候是否需要做回滚有关,如果需要回滚,则会失败。也可能是别的原因,这里不太清楚.
错误的信息为:ORA-01092: ORACLE instance terminated. Disconnection forced[]

SQL> select count(*) from test;
COUNT(*)
----------
100402

4,重建undo表空间

SQL> drop tablespace UNDOTBS1 including contents and datafiles;
Tablespace dropped.

SQL> create undo tablespace UNDOTBS1 datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF' size 20M;
Tablespace created.

5,用spfile重新启动,数据库改回自动undo管理.

SQL> startup


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值