日期:2014-05-16  浏览次数:20491 次

Oracle 基于用户管理的不完全恢复

    Oracle 数据恢复从恢复类型来说,抛开具体的文件,总共可分为两大类型的恢复,一是完全恢复,一个是不完全恢复。其实,熟悉了Oracle
体系结构之后,对于Oracle恢复就会有一个总体的概念。因为Oracle组成的外围部分,主要由不同的文件来组成,每种不同类型的文件有不同的
作用,因此只要了解了其作用,更利于了解与掌握Oralce数据库的备份与恢复。言归正传,完全恢复即是把数据库恢复到最新的SCN,出故障前
的那一刻,是无损恢复。而不完全恢复即是有损恢复,多用于恢复用户误操作,归档日志丢失等情形。本文主要描述基于用户管理的不完全恢复。

 

一、不完全恢复特性

1、不完全恢复

      不完全恢复仅仅是将数据恢复到某一个特定的时间点或特定的SCN,而不是当前时间点。不完全恢复会影响整个数据库,需要在MOUNT状
  态下进行。在不完全恢复成功之后,通常需要使用 resetlogs 选项来打开数据库。当使用resetlogs后,SCN 计数器不会被重置,原来的日
  志序号 log sequence 会结束,从新开始新的日志序列号。在Oracle里称之为产生一个新的incarnation。同时Oracle还会重置联机重做日
  志内容,因此resetlogs之后建议重新全备数据库。
       
2、不完全恢复的情形

      介质故障(media failure)导致部分或全部联机重做日志(online redo log)损坏
      用户操作失误(user error)导致数据丢失,例如,用户由于疏忽而移除了表,提交了无效的数据到表
      由于归档重做日志(archived redo log)丢失而无法进行完全恢复(complete recovery)
      当前控制文件(control file)丢失,必须使用备份的控制文件打开(open)数据库

3、不完全恢复的步骤

      关闭数据库并备份数据库(以防止恢复失败)
      启动数据库到mount 状态
      还原所有数据文件,同时可以选择还原控制文件(注意需要还原所有数据文件,而不仅仅是受损文件)
      将数据库恢复至某个时间点、序列、或系统改变号
      使用RESETLOGS关键字打开数据库

4、注意

      不完全恢复的前提条件是Oracl数据库够到mount状态,即参数文件,控制文件
      在做不完全恢复前建议在恢复前后做一次备份,避免恢复失败导致不必要的损失
      不完全恢复完成后,建议不要直接使用OPEN RESETLOGS 命令以读/写模式打开(open)数据库,而应先以只读模式打开数据库,并检查是否已
      将数据库恢复到正确的时间点。如果恢复的时间点有误,在没有使用OPEN RESETLOGS命令的情况下,重新执行恢复操作相对简单。
      对于恢复结果早于指定的时间点,只需重新执行恢复操作。如果恢复结果超过了指定的时间点,则应再次还原数据库并重新进行恢复。
      本文中的示例为便于演示,没有在恢复前备份故障数据,也没有在resetlog之后进行备份。
      注:Oracle 10g中已经可以在 resetlogs 之后不备份数据库,恢复的时候能够穿越resetlogs

5、不完全介质恢复的几种类型

      基于时间的恢复(Time-based recovery) 将数据恢复到指定的时间点
      用户控制的恢复(Cancel-based recovery) 当用户提交CANCEL后停止恢复(此选项在使用RMAN时无效)
      基于SCN 的恢复(Change-based recovery) 将数据恢复到指定的SCN
      按重做日志序号恢复(Log sequence recovery)将数据恢复到指定的重做日志序号(仅使用RMAN时有效)

 

二、演示基于用户管理的不完全恢复

--1、until time 恢复(恢复到指定时间点)

sys@SYBO2SZ> conn / as sysdba
Connected.
sys@SYBO2SZ> archive log list;  -->当前数据库处于归档模式
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u02/database/SYBO2SZ/archive/
Oldest online log sequence     0
Next log sequence to archive   1
Current log sequence           1

sys@SYBO2SZ> @db_hot_bak       -->对数据库进行热备份
ho cp /u02/database/SYBO2SZ/oradata/sysSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/oradata/sysauxSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ2.dbf /u02/