相逢即是有缘,相知即是幸运。快乐的生活最重要了,祝我的好朋友们天天开心~

Oracle备份与恢复案例(12)【转帖】

上一篇 / 下一篇  2007-11-20 12:19:54

5.3.2数据库关闭,但是数据文件中没有活动事务

这种情况下最简单的方法就是offline drop掉这个坏了的或者丢失的数据文件,然后以restricted模式打开数据库然后删除并且重建包含损坏文件的回滚段表空间。

 

具体步骤如下:

1确定数据库是正常的关闭的。方法是可以去查看alert文件,到最后看是否有如下信息:

"alter database dismount

Completed: alter database dismount"

如果有的话,就证明数据库是正常关闭的,否则就不能用这个方法去恢复。

2修改init参数文件,移去ROLLBACK_SEGMENTS中包含的损坏数据文件的回滚段表空间的回滚段,如果你不能确定哪些回滚段是坏的,简单的方法是你可以注释掉整个ROLLBACK_SEGMENTS

3restricted模式去mount数据库。

STARTUP RESTRICT MOUNT

4offline 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:>delD:\Oracle\oradata\chen\rbs01.

 

4、修改INIT<sid>.ora :

rollback_segments=(system)

添加_corrupted_rollback_segments=(rbs0,rbs1,rbs2……)

 

5SQL>Startup mount

 

6SQL>alter database datafile 'd:\Oracle\oradata\t8i\rbs01.dbf' offline drop;

数据库已更改。

 

7SQL>recover database

完成介质恢复。

 

8SQL>alter database open ;

数据库已更改。

 

9SQL>select * from v$rollname;

 

      USN NAME

----  -------

        0   SYSTEM

 

10SQL>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

 

11SQL>drop rollback segment rbs0;

重算段已丢弃。

   SQL>drop rollback segment rbs1;

重算段已丢弃。

   SQL>drop rollback segment rbs2;

重算段已丢弃。

 

12SQL>select segment_name,tablespace_name,status
FROM dba_rollback_segs;


SEGMENT_NAME  TABLESPACE_NAME  STATUS

-------------------------------------

SYSTEM        SYSTEM           ONLINE

 

13SQL>drop tablespace rbs including contents;

表空间已丢弃。

 

14、重建新的回滚表空间及回滚段,并联机。

 

15SQL>shutdown abort

 

16、再修改INIT<sid>.ora

rollback_segments=(rbs0,rbs1,rbs2)

_corrupted_rollback_segments=(rbs0,rbs1,rbs2)去掉。

 

17SQL>startup

 

注:

1、这种办法是万不得以的时候使用的方法,如果有备份,都建议从备份上进行恢复;

2、这种方法恢复的数据库,可能会引起数据库的数据错误;

3、恢复成功以后,建议exp/imp数据,并重新分析检查数据库。

5.3.4数据库关闭,数据文件中有活动事务,从备份恢复

1、从一个有效的备份中恢复损坏的数据文件。

2mount数据库。

3、执行以下查询:

SELECT FILE#, NAME, STATUS FROM V$DATAFILE;

如果发现要恢复的文件是offline状态的话,要先online它:

ALTER DATABASE DATAFILE '<full_path_file_name>' ONLINE;

4、执行以下查询

SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#

FROM V$LOG V1, V$LOGFILE V2

WHERE V1.GROUP# = V2.GROUP# ;

这个将列出redlog文件所代表的sequencefirst change numbers

 

5、如果数据库是非归档情况下,执行以下查询:

SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;

如果CHANGE#大于最小的redolog文件的FIRST_CHANGE#,则数据文件可以被恢复,记得在应用日志的时候要把所有redolog文件全部应用一遍。


如果CHANGE#小于最小的redolog文件的FIRST_CHANGE#,则数据文件就不可以被恢复了,这时候你要从一个有效的全备份中去恢复数据库了,如果没有全备份的话,那你就只能把数据库强制打开到一个不一致的状态去exp出数据,然后重新建库导入数据,因为这种方式的恢复Oracle

TAG:

 

评分:0

我来说两句

日历

« 2024-05-15  
   1234
567891011
12131415161718
19202122232425
262728293031 

我的存档

数据统计

  • 访问量: 3558
  • 日志数: 12
  • 建立时间: 2007-11-20
  • 更新时间: 2007-11-20

RSS订阅

Open Toolbar