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

晨曦之光 发布于 2012/04/25 16:16
阅读 197
收藏 0

上次在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



原文链接:http://blog.csdn.net/kkdelta/article/details/7210651
加载中
返回顶部
顶部