存储 频道

ORACLE备份&恢复案例(13)

 
5.3.2数据库关闭,但是数据文件中没有活动事务
 
这种情况下最简单的方法就是offline drop掉这个坏了的或者丢失的数据文件,然后以restricted模式打开数据库然后删除并且重建包含损坏文件的回滚段表空间。 
 
具体步骤如下: 
 
1。确定数据库是正常的关闭的。方法是可以去查看alert文件,到最后看是否有如下信息: 
"alter database dismount 
 
Completed: alter database dismount" 
 
如果有的话,就证明数据库是正常关闭的,否则就不能用这个方法去恢复。
 
2。修改init参数文件,移去ROLLBACK_SEGMENTS中包含的损坏数据文件的回滚段表空间的回滚段,如果你不能确定哪些回滚段是坏的,简单的方法是你可以注释掉整个ROLLBACK_SEGMENTS。 
 
3。以restricted模式去mount数据库。 
STARTUP RESTRICT MOUNT 
 
4。offline drop掉那个坏的数据文件 
ALTER DATABASE DATAFILE '<full_path_file_name>' OFFLINE DROP; 
 
5。打开数据库 
ALTER DATABASE OPEN 
如果你看到如下信息"Statement processed",则跳到第7步,如果你看到ORA-604, ORA-376, and ORA-1110的错误信息,继续第6步。 
 
6。正常的关闭数据库,然后在init文件中注释掉ROLLBACK_SEGMENTS,并加入隐含参数 
_corrupted_rollback_segments = ( <rollback1>,...., <rollbackN> ) 
然后以restricted模式打开数据库 
STARTUP RESTRICT 
 
7。删除掉那个包含损坏文件的回滚段表空间。 
DROP TABLESPACE <tablespace_name> INCLUDING CONTENTS; 
 
8。重建回滚段表空间,记得创建后要把回滚段都online。
 
9。重新使数据库对所有用户可用。 
ALTER SYSTEM DISABLE RESTRICTED SESSION; 
 
10。然后正常关闭数据库,修改init文件,如果开始只是注释掉了ROLLBACK_SEGMENTS的,就去掉注释即可,如果加了隐含参数的,注释掉它,并在ROLLBACK_SEGMENTS加入所有的回滚段。 
 
11。正常启动数据库。 
Startup
 
说明:
 
1、这种方法的前提条件是数据库是正常关闭(不是abort)可用
 
2、这种方法是正常方法,不会引起数据错误
 
5.3.3 数据库关闭,数据文件中有活动事务,没有可用备份
 
一般造成这种原因的情况是采用了shutdown abort或其它原因异常关机(如断电)导致的。
1、  开启一个事务 
 
SQL> set transaction use rollback segment rbs0; 
Transaction set.
SQL> insert into test (a) values (1); 
1 row created.
 
2、  异常关闭 
 
SQL> shutdown abort;
ORACLE instance shut down.
 
3、删除rbs的一个数据文件
C:>del D:\Oracle\oradata\chen\rbs01.
 
4、修改INIT<sid>.ora 
rollback_segments=(system) 
添加_corrupted_rollback_segments=(rbs0,rbs1,rbs2……) 
 
5、SQL>Startup mount 
 
6、SQL>alter database datafile ’d:\oracle\oradata\t8i\rbs01.dbf’ offline drop; 
数据库已更改。 
 
7、SQL>recover database ; 
完成介质恢复。 
 
8、SQL>alter database open ; 
数据库已更改。 
 
9、SQL>select * from v$rollname; 
        USN NAME 
----------------- --------------------- 
                 0 SYSTEM 
 
10、SQL>select segment_name,tablespace_name,status from dba_rollback_segs; 
SEGMENT_NAME TABLESPACE_NAME STATUS 
------------------------------ ------ ------------------------------------ 
SYSTEM SYSTEM ONLINE 
RBS0 RBS NEEDS RECOVERY 
RBS1 RBS NEEDS RECOVERY 
RBS2 RBS NEEDS RECOVERY 
 
11、SQL>drop rollback segment rbs0; 
重算段已丢弃。 
     SQL>drop rollback segment rbs1; 
重算段已丢弃。 
      SQL>drop rollback segment rbs2; 
重算段已丢弃。
  
12、SQL>select segment_name,tablespace_name,status from dba_rollback_segs; 
SEGMENT_NAME TABLESPACE_NAME STATUS 
------------------------------ ------ ------------------------------------ 
SYSTEM SYSTEM ONLINE 
 
13、SQL>drop tablespace rbs including contents; 
表空间已丢弃。 
 
14、重建新的回滚表空间及回滚段,并联机。 
 
15、SQL>shutdown abort 
 
16、再修改INIT<sid>.ora 
rollback_segments=(rbs0,rbs1,rbs2) 
将_corrupted_rollback_segments=(rbs0,rbs1,rbs2)去掉。 
 
17、SQL>startup 
 
1、这种办法是万不得以的时候使用的方法,如果有备份,都建议从备份上进行恢复
 
2、这种方法恢复的数据库,可能会引起数据库的数据错误
 
3、恢复成功以后,建议exp/imp数据,并重新分析检查数据库
0
相关文章