数据库备份与恢复测试-李济宏

[1] 控制文件损坏(rman和常规恢复)
    [1.1] 有老的备份数据备份和控制文件trace
          [测试1] --使用trace恢复 shutdown abort
          [测试2] --使用trace恢复 正常shutdown
          [测试3] --使用控制文件备份来恢复
          [测试4] 我们现在模拟备份控制文件,同时备份了部分
                  先于备份控制文件的数据文件
          [测试5] 控制文件损坏,有控制文件备份,及控制文件前的所有数据文件的备份  
          [测试5.1] 我们现在模拟控制文件损坏,有控制文件备份,先于控制文件备份的所有数据文件备份
                    使用在线日志进行完全恢复                                                     
          [测试6]   有老的数据文件备份,备份控制文件后插入的数据在shutdown abort后能不能恢复
          [测试7]   有老的数据文件备份,备份控制文件后插入的数据在正常shutdown 后能不能恢复  
          [测试8]   有老的数据文件备份,插入的数据在正常shutdown 后用create controlfile noresetlogs
                    方法来恢复控制文件  
    [1.2] 有RMAN的autobackup,catalog异常 
          [方法1]                          
          [方法2] --使用带resetlogs的创建控制文件trace
          [方法3] 使用noresetlog的trace来恢复
          [方法4] 那我们对数据库的数据文件控制文件和
                  在线日志文件都做备份会需要恢复吗? 
          [测试5] 我们模拟在线日志损坏,使用备份控制文件,有数据文件的备份的恢复
         
    [1.3] 有RMAN的备份,catalog正常   
    [1.4] 控制文件损坏,有trace,非活动在
          线日志损坏
          [方法1] 使用clear group or
          [方法2] 使用trace resetlogs   
          [测试3] 数据文件损坏,控制文件损坏,有trace ,
                  使用resetlogs,非在线日志损坏      
          [测试4] 数据文件损坏,控制文件损坏,有trace ,          
                  使用noresetlogs,非在线日志损坏 ,shutdown abort
   
    [1.5] 有trace,活动在线日志损坏   
          [1.5.1] 有trace,活动在线日志损坏,正常shutdown或是当前的数据文件
          [1.5.2] 有trace,活动在线日志损坏,shutdown abort 或是非当前的数据文件 
                  ,当前在线日志文件损坏               
   
                  [测试1] shutdown abort,备份控制文件或者resetlog的trace,
                  没有数据文件备份,采用强制打开数据库的方法
                  [测试2] shutdown abort,resetlog的trace,                    
                          有数据文件备份,当前在线日志损坏,控制文件损坏,有trace
                  [测试3] shutdown abort,控制文件损坏,备份控制文件,
                          当前在线日志损坏,有数据文件备份
                         
          [1.5.3]  控制文件损坏,如果trace不是最新的数据库结构,如少了个数据文件
          [1.5.4]  控制文件损坏,如果trace不是最新的数据库结构,如少了个只读数据文件
                         
    [1.6] 使用备份的控制文件进行恢复
    [1.7] 数据文件损坏,且没有备份,没有备份控制文件,                     
          且其他数据文件备份中都是在该数据文件创建后                     
          的备份                                                         
          [测试1](resetlogs前创建的数据文件),数据文件丢失,没有备份,控制文件损坏,有备份控制文件,但备份控制文件后于该文件重建日期 
                  使用resetlogs打开数据库,所以没有数据文件自创建以来所有的日志,                                                 
                  因为前面的日志被截取了,(所以resetlog后必须要有备份,                                                           
                  除非是resetlogs后创建的数据文件,可以通过create datafile来恢复)                                                
                  当然如果有resetlogs后的控制文件及相关的数据,也可以完全恢复,参见1.12                                                                 
          [测试2] 控制文件正常,数据文件丢失,数据文件丢失没有备份,                                                                   
                  也就说丢失的数据文件创建在该控制文件中的,该控制文件也没有被trace刷新,那控制文件就包含了该数据文件自创建以来的所有信息
         
          [测试3] 控制文件没有丢失,数据文件丢失,数据文件丢失没有备份
          [测试4] 控制文件丢失,数据文件丢失,没有备份,有trace,那我们看看为什么trace会造成控制文件的头中数据文件创建的信息被修改 
                  无法实现create datafile功能                                                                                          
          [测试5]控制文件没有创建数据文件的起始信息,使用不同trace的方法
          [测试6]  数据文件损坏,且没有备份,控制文件使用备份控制文件,且控制文件是在该数据文件创建后的控制文件
                         
    [1.8] 数据文件损坏,且没有备份,控制文件使用备份控制文件,且控制文件是在该数据文件创建前的控制文件
        参见1.7的测试1                                                                            
   
    [1.9]  数据文件损坏,且没有备份,控制文件使用备份控制文件,且控制文件是在该数据文件创建后的控制文件 
    [1.10] 数据文件损坏,且没有备份,没有备份控制文件,且其他数据文件备份中都是在该数据文件创建后的备份
    [1.11] 损坏单个控制文件                                     
           将好的控制文件覆盖损坏的控制文件                     
    [1.12] 当前控制文件做为备份控制文件恢复,在当前在线日志中有业务数据时的恢复    (通常没有太大意义,只是想做一下resetlogs) 
    [1.13] 在resetlogs前的RMAN备份如何应用到resetlogs后的
           [测试1] 那我们在看看resetlogs前的数据文件控制文件和在线日志都做了备份,        
                   然后resetlogs后的控制文件在线日志都做备份的情况下,是不是能越过resetlogs
          
[2]. 非归档模式下的恢复(rman和常规恢复)
    [测试1] 数据库在非归档模式,数据库打开
    [测试2] 数据库在非归档模式,数据库MOUNT,备份整个数据库
    [测试3] 数据库在非归档模式,数据库MOUNT,备份表空间
    [测试4] 数据库在非归档模式,数据库MOUNT,备份的表空间是常规OFFLINE的
    [测试5] 数据库在非归档模式,数据库MOUNT,shutdown abort,备份的表空间
    [测试6] 数据库在非归档模式,数据库MOUNT,数据文件丢失,有表空间备份
    [测试7] 数据库在归档模式,控制文件损坏,控制文件有备份,使用RMAN恢复
    [测试8] 数据库在非归档模式,数据文件损坏,使用RMAN恢复
    [测试9] 数据库在非归档模式,数据文件损坏,使用RMAN恢复,        
            该文件的日志全部还保留在非当前在线日志和当前在线日志中
    [测试10] 数据库在非归档模式,数据文件损坏,使用RMAN恢复,
            该文件的日志部分由于日志轮转被覆盖了         
   
[3] redo log file损坏(rman和常规恢复)   
    [测试1] 修改日志组大小及增加日志组成员
    [测试2] 非当前非活动的在线日志损坏或当前在线日志损坏,切没有备份数据文件,使用强制打开的方式
    在线日志损坏
    CLEAR的不同方式
           CLEAR LOGFILE
           CLEAR LOGFILE UNARCHIVED
           CLEAR LOGFILE UNARCHIVED             
                 GROUP ? UNRECOVERABLE DATAFILE;
    [测试3] 数据文件损坏,控制文件损坏,有trace ,          
            使用noresetlogs,非在线日志损坏 ,shutdown abort              
    [测试4]      在归档模式下没有设置自动归档下,数据库挂起            
    [测试5] 数据库在非归档模式下,设置了自动归档,当一个事务处理的重做量大于
    所有在线日志的大小总和时                                                             
    [测试6] 数据库在非归档模式下,设置了非自动归档,当一个事务处理的重做量大于
    所有在线日志的大小总和时                                                  
   
   
   
[4].热备份期间的数据库崩墤(rman和常规恢复)   
   
[5] resetlogs 恢复测试    
   
[6] rman Recovering Datablocks 恢复测试   
   
[7].rman Restoring Datafile Copies to a New Host

[8].表空间的恢复(rman和常规恢复)
    [8.1] 非正常关机的情况下,用rman恢复单个数据文件
    [8.2] 非正常关机情况下,非RMAN方式用备份的数据文件进行恢复
    [8.3] 非正常关机情况下,恢复单独表空间
    [8.4] 丢失数据文件,用rman从备份中还原数据文件并恢复tablespace
    [8.5] 重建controlfile文件时,丢失所有在线日志,语句少写了表空间的datafile
    [8.6] 用rman从备份中恢复system表空间

[9].回滚段恢复    
    [9.1].正常shutdown,回滚数据文件丢失,   
          有备份,回滚段恢复            
    [9.2].shutdown abort(或者使用了别的老的数据文件),
          回滚数据文件丢失,有备份,回滚段恢复 ,      
          数据库没有活动事务                         
    [9.3].shutdown abort(或者使用了别的老的数据文件),
          回滚数据文件丢失,有备份,回滚段恢复 ,      
          数据库有活动事务                           
   
    [9.4].shutdown abort(或者使用了别的老的数据文件),
           回滚数据文件丢失,没有备份,回滚段恢复 ,   
           数据库有活动事务                          
    
    [9.5].shutdown abort(或者使用了别的老的数据文件),   
          回滚数据文件丢失,没有备份,但控制文件有创建    
          该回撤段数据文件的所有历史日志,回滚段恢复 , 
          数据库有活动事务   
    [9.6].数据库打开时回撤表空间文件
          损坏,没有备份            
   
         
                                    
[10]. 数据库基于时间点的不完全恢复    
    [10.1] 所有数据文件基于时间点的不完全恢复测试
    [10.2] 单独表空间数据文件基于时间点的恢复测试
    [10.3] 分区表空间数据文件基于时间点的恢复测试
            [10.3_1] 分区表空间数据文件基于时间点的恢复测试: 基于时间的不完全恢复
            [10.3_2] 分区表空间数据文件基于时间点的恢复测试: 数据文件损坏的恢复
   
[11]. 导入/导出备份                                         
    [11.1] 在数据库中迁移表空间 
[12]. Duplicating a Database using RMAN   
   
#########################################################
#  [1] 控制文件损坏(rman和常规恢复)                     #
#########################################################

准备工作
~~~~~~~~
备份
~~~~
C:\Documents and Settings\lifeng.fang>rman nocatalog target "sys/sunsdl"

恢复管理器: 版本9.2.0.1.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.

连接到目标数据库: PDF (DBID=3171861129) --新的ID2334768642
正在使用目标数据库控制文件替代恢复目录

RMAN> configure controlfile autobackup on;

新的 RMAN 配置参数:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
已成功存储新的 RMAN 配置参数
RMAN> configure controlfile autobackup format for device type disk to 'c:\temp\%
F';

新的 RMAN 配置参数:
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'c:\temp\%F';
已成功存储新的 RMAN 配置参数

RMAN>

RMAN> backup database;

启动 backup 于 25-2月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=12 devtype=DISK
分配的通道: ORA_DISK_2
通道 ORA_DISK_2: sid=13 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\PDF\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\PDF\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 25-2月 -05
通道 ORA_DISK_2: 正在启动 full 数据文件备份集
通道 ORA_DISK_2: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\PDF\TOOLS01.DBF
通道 ORA_DISK_2: 正在启动段 1 于 25-2月 -05
通道 ORA_DISK_1: 已完成段 1 于 25-2月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\07GDKT8C_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:56
通道 ORA_DISK_2: 已完成段 1 于 25-2月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\08GDKT8C_1_1 comment=NONE
通道 ORA_DISK_2: 备份集已完成, 经过时间:00:00:57
完成 backup 于 25-2月 -05

启动 Control File and SPFILE Autobackup 于 25-2月 -05
段 handle=C:\TEMP\C-3171861129-20050225-00 comment=NONE
完成 Control File and SPFILE Autobackup 于 25-2月 -05

RMAN>
       
~~~~~~~~~~~       
常规备份
~~~~~~~~~~~
备份数据文件cp   C:\ORACLE\ORADATA\PDF\* C:\ORACLE\ORADATA\bak
备份控制文件                                                             
###################################################
# [1.1] 有老的备份数据备份和控制文件trace
###################################################
SQL> alter session set tracefile_identifier=fanglf
  2  ;

会话已更改。

SQL> alter database backup controlfile to trace;

数据库已更改。

SQL>  alter database backup controlfile to 'c:\temp\controlfile.bak';

数据库已更改。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们也可以使用RMAN来拷贝备份控制文件
RMAN> copy CURRENT CONTROLFILE TO 'c:\cf.cpy';

启动 copy 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 已复制当前的控制文件
输出文件名=C:\CF.CPY
完成 copy 于 03-3月 -05
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> col name format a50
SQL> select * from v$controlfile;

STATUS  NAME
------- --------------------------------------------------
        C:\ORACLE\ORADATA\PDF\CONTROL01.CTL
        C:\ORACLE\ORADATA\PDF\CONTROL02.CTL
        C:\ORACLE\ORADATA\PDF\CONTROL03.CTL     <<-此时仍然可以使用
~~~~~~~~~~~~~~~~
模拟控制文件损坏
~~~~~~~~~~~~~~~~       
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       
使用ULTRAEDIT编辑CONTROL01.CTL部分数据
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select * from v$controlfile;

STATUS  NAME
------- ------------------------------------------------
        C:\ORACLE\ORADATA\PDF\CONTROL01.CTL
        C:\ORACLE\ORADATA\PDF\CONTROL02.CTL
        C:\ORACLE\ORADATA\PDF\CONTROL03.CTL

SQL>
SQL> create table test (a int,v varchar(200));

使用ULTRAEDIT编辑清空CONTROL01.CTL大部分数据
SQL> select * from v$controlfile;  <<-出现异常
select * from v$controlfile
*
ERROR 位于第 1 行:
ORA-12571: TNS: 包写入程序失败
  
~~~~~~~~~~~~~~~~       
在alert中显示 
~~~~~~~~~~~~~~~~
Fri Feb 25 11:51:56 2005
Errors in file c:\oracle\admin\pdf\bdump\pdf_ckpt_2556.trc:
ORA-00227: corrupt block detected in controlfile: (block 1, # blocks 1)
ORA-00202: controlfile: 'C:\ORACLE\ORADATA\PDF\CONTROL01.CTL'

CKPT: terminating instance due to error 227
Fri Feb 25 11:51:58 2005
Errors in file c:\oracle\admin\pdf\bdump\pdf_pmon_3084.trc:
ORA-00227: corrupt block detected in controlfile: (block , # blocks )

Instance terminated by CKPT, pid = 2556       
~~~~~~~~~~~~~~~~
在trace文件中显示
~~~~~~~~~~~~~~~~

Corrupt block relative dba: 0x00000001 (file 0, block 1)
Completely zero block found during control file header read
*** 2005-02-25 11:51:55.000
ksedmp: internal or fatal error
ORA-00202: controlfile: 'C:\ORACLE\ORADATA\PDF\CONTROL01.CTL'

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这里我模拟把3个控制文件都破坏
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

启动数据库时提示
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-00205: ?????????????????????

恢复实例
###################################################
# [测试1] --使用trace恢复 shutdown abort
###################################################
SQL> shutdown abort 
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL>

SQL> CREATE CONTROLFILE REUSE DATABASE "PDF" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\PDF\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\PDF\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\PDF\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\PDF\INDX01.DBF',
17    'C:\ORACLE\ORADATA\PDF\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\PDF\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'

SQL> recover database ;  --因为是shutdown abort关闭,所以需要恢复
完成介质恢复。
SQL> alter database open;

数据库已更改。
###################################################
# [测试2] --使用trace恢复 正常shutdown
###################################################
SQL> insert into test select rownum,'aaaaaaaaaaaaaaaaaaaaaa' from dba_objects;

已创建6165行。

SQL> /

已创建6165行。

SQL> insert into test select * from test;

已创建12330行。

SQL> commit;

提交完成。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL>

SQL> CREATE CONTROLFILE REUSE DATABASE "PDF" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\PDF\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\PDF\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\PDF\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\PDF\INDX01.DBF',
17    'C:\ORACLE\ORADATA\PDF\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\PDF\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建
SQL> alter database open;
                        
数据库已更改。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们看到如果是正常数据库down机的,
那么使用noresetlog创建控制文件后
直接可以打开数据库
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select count(*) from test;

COUNT(*)
----------
     24660
    
用trace完成了数据库的完全恢复

SQL> select * from v$tempfile;

未选定行

SQL> select name from v$tablespace;

NAME
------------------------------
SYSTEM
UNDOTBS1
INDX
TOOLS
USERS
TEMP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意我们可以看到由于重建了控制文件,
临时表空间的临时文件没有了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
################################################### 
# [测试3] --使用控制文件备份来恢复
###################################################
~~~~~~~~~~~~~~~~
还原备份控制文件
~~~~~~~~~~~~~~~~
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile.bak
C:\oracle\oradata\pdf\CONTROL01.CTL
已复制         1 个文件。

C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile.bak
C:\oracle\oradata\pdf\CONTROL02.CTL
已复制         1 个文件。

C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile.bak
C:\oracle\oradata\pdf\CONTROL03.CTL
已复制         1 个文件。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
备份控制文件不会存有关于联机日志文件
和数据文件结束SCN,因此不会在恢复时使
用联机日志文件,并因此将数据文件假定了
一个无穷大的结束SCN,所以要休整他,必须
resetlogs,但是我们可以在例子[测试5.1]中可以看到
我们可以强制应用在线日志实现完全恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
当数据库用normal或immediate关闭时,发
出检查点处理,这将为每个数据文件在控制
文件中设置相应的结束SCN,使其等于数据
文件头中对应的开始SCN
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDpdf.ORA'

SQL> recover database;
ORA-00283: ??????????
ORA-01610: ?? BACKUP CONTROLFILE ??????????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
数据文件头中原有检查点计数器决不会大于
当前控制文件中的检查点计数器,所以必须在
恢复时指定USING  BACKUP CONTROLFILE,
这样就会基于备份控制文件的信息
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01152: ?? 1 ????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这时,没有进行恢复,检查到当前数据文件头
的开始SCN和控制文件的结束SCN不一致需要
进行恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这里无法恢复数据库
而采用第1钟方法执行成功

###################################################
# [测试4] 我们现在模拟备份控制文件,同时备份部分数据文件先于备份
#         控制文件的数据文件
###################################################
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。

copy SYSTEM01.DBF 复件 SYSTEM01.DBF
alter database backup controlfile to 'c:\temp\controlfile1.bak';

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile1.bak C:\oracle\or
adata\pdf\CONTROL01.CTL
已复制         1 个文件。

C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile1.bak C:\oracle\or
adata\pdf\CONTROL02.CTL
已复制         1 个文件。

C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile1.bak C:\oracle\or
adata\pdf\CONTROL03.CTL
已复制         1 个文件。

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> recover database using backup controlfile;
ORA-00279: 更改 1069041 (在 02/25/2005 15:36:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORA92\RDBMS\ARC00012.001
ORA-00280: 更改 1069041 对于线程 1 是按序列 # 12 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开存档日志 'C:\ORACLE\ORA92\RDBMS\ARC00012.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORA92\RDBMS\ARC00012.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 1069041 (在 02/25/2005 15:36:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORA92\RDBMS\ARC00012.001
ORA-00280: 更改 1069041 对于线程 1 是按序列 # 12 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01152: 文件 2 没有从完备的旧备份中恢复
ORA-01110: 数据文件 2: 'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF'

ORA-01112: 未启动介质恢复

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01152: 文件 2 没有从完备的旧备份中恢复
ORA-01110: 数据文件 2: 'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
虽然在备份控制文件前备份了SYSTEM文件,但是
其他文件没有备份,而有超过控制文件检查点SCN
的信息,不能恢复成功
如果有只读表空间,使用备份控制文件恢复,
要先offline 参见备份与恢复手册

对于使用备份控制文件进行恢复由于默认是所有
数据文件联机的,而且resetlogs时需要写数据
文件的,那么只读文件恢复时,由于只读文件不
需要恢复,就要强制将他offline;
所以在选取控制文件时也要注意,如果选取了当
时正好是只读状态的控制文件时,必须将数据文
件offline ,而使得在切换前为读写状态时的数
据无法恢复,反之同理
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#######################################################
# [测试5]我们现在模拟控制文件损坏,将备份控制文件前,先备份所有数据文件
#######################################################

copy SYSTEM01.DBF 复件 SYSTEM01.DBF
copy UNDOTBS01.DBF 复件 UNDOTBS01.DBF
copy TOOLS01.DBF   复件 TOOLS01.DBF
copy USERS01.DBF   复件 USERS01.DBF
copy INDX01.DBF    复件 INDX01.DBF

SQL>  alter database backup controlfile to 'c:\temp\controlfile2.bak';
                                                                     
数据库已更改。

替换老的控制文件

SQL> insert into test select * from test;

已创建24660行。

SQL> commit;

提交完成。

SQL> select count(*) from test;

COUNT(*)
----------
     49320
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

copy c:\temp\controlfile2.bak C:\oracle\oradata\pdf\CONTROL01.CTL
copy c:\temp\controlfile2.bak C:\oracle\oradata\pdf\CONTROL02.CTL
copy c:\temp\controlfile2.bak C:\oracle\oradata\pdf\CONTROL03.CTL

rename SYSTEM01.DBF  复件 SYSTEM01.DBF  SYSTEM01.DBF  -->>临时文件可以不要
rename UNDOTBS01.DBF 复件 UNDOTBS01.DBF UNDOTBS01.DBF
rename TOOLS01.DBF   复件 TOOLS01.DBF   TOOLS01.DBF  
rename USERS01.DBF   复件 USERS01.DBF   USERS01.DBF  
rename INDX01.DBF    复件 INDX01.DBF    INDX01.DBF

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 对于线程 1 是按序列 # 13 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto -->>使用auto恢复也是成功
ORA-00308: 无法打开存档日志 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> recover database using backup controlfile until cancel; -->>这个cancel是表示每次应用一个日志时都提示一下,直到输入cancel后结束
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 对于线程 1 是按序列 # 13 进行的

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cancel通常好于change和time的恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

指定日志: {<RET>=suggested | filename | AUTO | CANCEL} 
cancel  --输入cancel恢复成功 -->>cancel选项允许每次前滚一个日志文件,当需要停止恢复时,输入cancel
                                 ,在这种方式下不会自动运用联机日志文件.
介质恢复已取消。
SQL> alter database open resetlogs;

数据库已更改。
SQL> select CHECKPOINT_CHANGE# from v$database;

CHECKPOINT_CHANGE#
------------------
           1069388
          
SQL> select count(*) from test;

COUNT(*)
----------
     24660  --丢失了数据
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
那我们使用备份控制文件恢复,是不是一定恢复不了在线日志中的数据吗?
答案是错误的,其实也能完全恢复(当然我们用trace更好)  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
#######################################################
# [测试5.1]我们现在模拟控制文件损坏,有控制文件备份,先于控制文件备份的所有数据文件备份
#        使用在线日志进行完全恢复
#######################################################
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE 
         3          4 YES ACTIVE

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69410

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

还原备份控制文件,还原所有备份数据文件
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00314: 日志 1 (线程 1),预计序号  与  不匹配
ORA-00312: 联机日志 1 线程 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69257

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69362 (在 03/04/2005 11:21:25 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69362 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69408 (在 03/04/2005 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69408
             
~~~~~~~~~~~~~~             
到此是不完全恢复
那我们是不是可以
应用在线日志呢,那
我们先应用SEQUENCE=3和4
的日志C:\oracle\oradata\testdb\REDO02.LOG
C:\oracle\oradata\testdb\REDO03.LOG
我们可以看到恢复时这个文件不需要
~~~~~~~~~~~~~~~

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2005 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO02.LOG
ORA-00310: 存档日志包含序列 3;要求序列 5
ORA-00334: 归档日志: 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2005 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO03.LOG
ORA-00310: 存档日志包含序列 4;要求序列 5
ORA-00334: 归档日志: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69408

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们看到非活动在线日志没有被应用
我们应用SEQUENCE=5
的日志C:\oracle\oradata\testdb\REDO01.LOG
我们可以看到恢复时这个文件是需要的
~~~~~~~~~~~~~~~   
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2005 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO01.LOG --这步是关键
已应用的日志。
完成介质恢复。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69418 --在SEQUENCE=5中的SCN被应用了

SQL> alter database open resetlogs;

数据库已更改。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              69418               69516

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     98656 ok
-->>完全恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~
这里主要是由于应用了活动在线日志
C:\oracle\oradata\testdb\REDO01.LOG的恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~
#######################################################
# [测试6]那我们看看,有老的数据文件备份,备份控制文件后插
#  入的数据在shutdown abort后能不能恢复
#######################################################
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69611

SQL>
SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69611

SQL> commit;

提交完成。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69611

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 3月 2 14:25:25 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

已连接到空闲例程。

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69360

SQL> recover database using backup controlfile;
ORA-00279: 更改 69456 (在 03/02/2005 10:26:30 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69456 对于线程 1 是按序列 # 3 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69564 (在 03/02/2005 14:23:19 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69564 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69610 (在 03/02/2005 14:23:21 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69610 对于线程 1 是按序列 # 5 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69610

SQL> recover database using backup controlfile until change 69620;  --我们看到CONTROLFILE_CHANGE#为69610,那我随便加大这个值69620试试看能不能恢复到69610以后
ORA-00279: 更改 69610 (在 03/02/2005 14:23:21 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69610 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69610
             
SQL> recover database using backup controlfile until change 69620;
ORA-00279: 更改 69610 (在 03/02/2005 14:23:21 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69610 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69610

~~~~~~~~~~~~~~
这里如果在线日志没有
损坏,那么可以应用在线
日志完全恢复
~~~~~~~~~~~~~~

SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
     98656 ok  -->>不能恢复status = no ,这部分数据在在线日志中的,但是until cancel+ backup controlfile不前滚在线日志文件

~~~~~~~~~~~~~~~~~~~
经过测试也可以用5.1的方法
应用在线日志进行完全恢复
~~~~~~~~~~~~~~~~~~~
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#  -->>奇怪这里值变成我要until change的值了
------------------- -------------------
              69610               69720

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
     98656 ok

#######################################################
# [测试7]那我们看看,有老的数据文件备份,备份控制文件后插
#  入的数据在正常shutdown 后能不能恢复
#######################################################

测试结果同上.
通过create controlfile方法才能完全恢复
也可以参考[测试5.1]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们注意到,在这里仍然可以用resetlogs
前的trace来进行控制文件恢复,因为结构
没有变动.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#######################################################
# [测试8]那我们看看,有老的数据文件备份,插
#  入的数据在正常shutdown 后用create controlfile noresetlogs
#  方法来恢复控制文件,能不能恢复
#######################################################      
SQL> STARTUP
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69607

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
~~~~~~~~~~~~~~~~~~~~~~~~
删除控制文件
删除USERS01.DBF
~~~~~~~~~~~~~~~~~~~~~~~~
SQL> STARTUP NOMOUNT
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes

SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG

2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,

10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,

11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M

12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',

15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',

16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',

17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',

18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'

19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建

SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 位于第 1 行:
ORA-01113: ?? 5 ??????
ORA-01110: ???? 5: 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'

SQL> RECOVER DATABASE;
完成介质恢复。
SQL> ALTER DATABASE  OPEN;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     98656 ok
完全恢复了

######################################################### 
# [1.2] 有RMAN的autobackup,catalog异常                      
#########################################################

SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> exit

C:\Documents and Settings\lifeng.fang>rman nocatalog target "sys/sunsdl"

恢复管理器: 版本9.2.0.1.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.

连接到目标数据库: pdf(未安装)
正在使用目标数据库控制文件替代恢复目录

RMAN> restore controlfile from autobackup;

启动 restore 于 25-2月 -05

分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=13 devtype=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 02/25/2005 17:21:52
RMAN-06495: must explicitly specify DBID with SET DBID command

RMAN> exit

所以要使用RMAN,那么必须预先知道DBID

如果我们知道(DBID=3171861129)
RMAN> set dbid=3171861129  -->>注意如果startup nomount在RMAN上执行就不需要指定DBID

正在执行命令: SET DBID

RMAN> restore controlfile from autobackup;

启动 restore 于 25-2月 -05

分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=13 devtype=DISK
通道 ORA_DISK_1: 寻找以下日期的自动备份: 20050225
通道 ORA_DISK_1: 寻找以下日期的自动备份: 20050224
通道 ORA_DISK_1: 寻找以下日期的自动备份: 20050223
通道 ORA_DISK_1: 寻找以下日期的自动备份: 20050222
通道 ORA_DISK_1: 寻找以下日期的自动备份: 20050221
通道 ORA_DISK_1: 寻找以下日期的自动备份: 20050220
通道 ORA_DISK_1: 寻找以下日期的自动备份: 20050219
通道 ORA_DISK_1: 没有找到 7 天之内的自动备份
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 02/25/2005 17:26:46
RMAN-06172: no autobackup found or specified handle is not a valid copy or piece
由于catalog坏了,所以备份信息没有了,但是自动控制文件备份提供了特殊的格式,可以不读取catalog或者控制文件信息
来恢复控制文件
我们看到,现在RMAN不能自动找到自动备份的路径.

RMAN> SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/temp/%F';  -->>通过指定的路径就可以恢复了

正在执行命令: SET CONTROLFILE AUTOBACKUP FORMAT

RMAN> restore controlfile from autobackup ;

启动 restore 于 25-2月 -05

使用通道 ORA_DISK_1
通道 ORA_DISK_1: 寻找以下日期的自动备份: 20050225
通道 ORA_DISK_1: 已找到的自动备份: /temp/c-3171861129-20050225-00
通道 ORA_DISK_1: 从自动备份复原控制文件已完成
正在复制控制文件
输出文件名=C:\ORACLE\ORADATA\PDF\CONTROL01.CTL
输出文件名=C:\ORACLE\ORADATA\PDF\CONTROL02.CTL
输出文件名=C:\ORACLE\ORADATA\PDF\CONTROL03.CTL
完成 restore 于 25-2月 -05

==>>用冷备来恢复数据库
用冷备的控制文件和数据文件
SQL> shutdown
ORA-01109: ??????

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> select count(*) from tab;
select count(*) from tab
                     *
ERROR 位于第 1 行:
ORA-01219: ??????: ???????/?????

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00314: ?? 1 (?? 1)?????  ?  ???
ORA-00312: ???? 1 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  -->>这里REDO是无用的,但是因为没有对REDO进行备份,存在他就打不开

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01139: RESETLOGS ???????????????

SQL> alter database open noresetlogs;
alter database open noresetlogs
*
ERROR 位于第 1 行:
ORA-01139: RESETLOGS ???????????????

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00314: ?? 1 (?? 1)?????  ?  ???
ORA-00312: ???? 1 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'

SQL>  alter database clear logfile group 1;

数据库已更改。

SQL>  alter database clear logfile group 2;

数据库已更改。

SQL>  alter database clear logfile group 3;
alter database clear logfile group 3
*
ERROR 位于第 1 行:
ORA-00350: ?? 3 (?? 1) ?????
ORA-00312: ???? 3 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00338: ?? 3 (?? 1) ???????
ORA-00312: ???? 3 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'

SQL>  alter database clear UNARCHIVED logfile group 3;
alter database clear UNARCHIVED logfile group 3
*
ERROR 位于第 1 行:
ORA-00338: ?? 3 (?? 1) ???????
ORA-00312: ???? 3 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'

方法1
SQL> recover database using backup controlfile;
ORA-00279: ?? 48540 (? 02/28/2005 10:06:38 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 48540 ???? 1 ???? # 3 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 68658 (? 02/28/2005 10:22:51 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 68658 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database using backup controlfile using cancel;
ORA-01906: ?? BACKUP ???

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 68658 (? 02/28/2005 10:22:51 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 68658 ???? 1 ???? # 4 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL>
SQL> alter database open resetlogs;

数据库已更改。
####################################################
# [方法2] --使用带resetlogs的创建控制文件trace
####################################################
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS  ARCHIVELOG  --这里我们用了resetlogs
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建

SQL> alter database open resetlogs;

数据库已更改。
~~~~~~~~~~~~~~~
这将丢失部分数据
~~~~~~~~~~~~~~~

#############################################
# [方法3] 使用noresetlog的trace来恢复
#############################################
SQL> shutdown abort 
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL>

SQL> CREATE CONTROLFILE REUSE DATABASE "PDF" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\PDF\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\PDF\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\PDF\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\PDF\INDX01.DBF',
17    'C:\ORACLE\ORADATA\PDF\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\PDF\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'

SQL> recover database ;  --因为是shutdown abort关闭,所以需要恢复
完成介质恢复。
SQL> alter database open;

数据库已更改。
#############################################
# [方法4] 那我们对数据库的数据文件控制文件和
#         在线日志文件都做备份会需要恢复吗?
#############################################

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

将控制文件,数据文件,在线日志文件都进行备份
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from test;

COUNT(*)
----------
     12330

SQL> create table arch (status varchar(2));

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

将控制文件,数据文件,在线日志文件都进行还原
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from test;

COUNT(*)
----------
     12330

SQL> select count(*) from arch;
select count(*) from arch
                     *
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
下一个存档日志序列   3
当前日志序列           3

~~~~~~~~~~~~~~~~~~~~~~~~~~~
数据库冷备份如果包括所有数据
文件控制文件和在线日志,那么
数据库可以直接打开,如果没有在
线日志,那么需要create controlfile
... resetlogs;
或者recover database until cancel;
alter database open resetlogs;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#####################################################
#  但是由于在线日志也被覆盖了,前面的归档3和在序列4已
#  经没有应用,那么我们序列4虽然被强制覆盖了,那么3其实
#  是被归档了,那么我们建的arch表是不是可以恢复出来呢?
#  这里我们看看能不能备份(做完冷备份后的控制文件)控制
#  文件来进行恢复
#  [测试5] 我们模拟在线日志损坏,使用备份控制文件,有数据文件的备份的恢复
####################################################

SQL>  create table arch (status varchar(2));

表已创建。

SQL>  alter system switch logfile;

系统已更改。

SQL>  insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

alter database backup controlfile to 'C:\oracle\oradata\testdb\bak2\controlfile.ctl';
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

拷贝原来的冷备份中的数据文件和在线日志(其实在线日志没有用啦),不拷贝原来冷备份的控制文件

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> recover database using backup controlfile;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 69776 (在 02/28/2005 11:23:24 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69776 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69776 (在 02/28/2005 11:23:24 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69776 对于线程 1 是按序列 # 4 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*) from arch;

COUNT(*)
----------
         0

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~成功了,结果是有表arch,但没有数据,也就是没有应用在线日志,其实这里如果不还原在线日志(反而来搅乱),
我们是可以recover database 进行完全恢复的,因为控制文件其实也是当前的,如果使用后面备份的控制文件,
因为该控制文件已经在建arch表之后,也能进行恢复

上面的方法也是在在线日志被破坏后,有原来的冷备份(或热备份时),使用当前的控制文件(其实已经不是当前的了,
我们在后面可以看到使用了using  backup controlfile)可以还原到最后的归档日志,只是丢失在线日志的数据.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

################################
[1.3] 有RMAN的备份,catalog正常
################################                                                                 
    --需要建立一个catalog库    
   
   
   
   
################################   
[1.4] 控制文件损坏,有trace,非活动在
    线日志损坏 
################################

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     0
下一个存档日志序列   1
当前日志序列           1
SQL> select count(*) from test;

COUNT(*)
----------
     12330

SQL> create table arch (status varchar(2));

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。
SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
下一个存档日志序列   2
当前日志序列           2
SQL>
    SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 NO  CURRENT         
         2          0 YES UNUSED
         3          1 YES INACTIVE          --非在线日志
GROUP#          MEMBER
----------      ----------------------------------------
3                C:\ORACLE\ORADATA\TESTDB\REDO03.LOG        
用ultraedit破坏日志3

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。                                     -->>非在线日志破坏了,数据库仍然能执行

SQL> alter system switch logfile;
系统已更改。
        
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          3 NO  CURRENT
         3          1 YES INACTIVE
SQL> alter system switch logfile;  -->>当切换到日志组3时报错
alter system switch logfile
*
ERROR 位于第 1 行:
ORA-03113: 通信通道的文件结束
       
###########################
# [方法1] 使用clear group
###########################
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          3 NO  INVALIDATED
         3          0 YES UNUSED

SQL> alter database clear logfile group 3;
alter database clear logfile group 3
*
ERROR 位于第 1 行:
ORA-00344: 无法重新创建联机日志 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 32) 进程无法访问文件,因为另一个程序正在使用此文件。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          3 NO  INVALIDATED
         3          0 YES CLEARING   --上面的语句已经执行了clear功能
        
SQL> alter database open;

数据库已更改。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          4 NO  CURRENT
         2          3 YES INACTIVE
         3          0 YES CLEARING        --直接跳过损坏的日志组
        
        
SQL> select count(*) from arch;

COUNT(*)
----------
      6166        -->>数据没有丢失
     
###########################
# [方法2] 使用trace resetlogs
###########################
SQL> create table arch (status varchar(2));

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL>  commit;

提交完成。

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
下一个存档日志序列   2
当前日志序列           2
SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          1 YES INACTIVE
         3          3 NO  CURRENT

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
下一个存档日志序列   3
当前日志序列           3
SQL>
SQL>shutdown
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这时因为是正常shutdown,arch表状态等于
no的数据已经写到数据文件中了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
模拟日志2错误

SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  AR
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 10
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 10
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 10
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建

SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no            -->>我们发现这里在线日志中的数据没有丢失
     12332 ok                                                   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
在这里用resetlogs和noresetlogs创建控制文件都不会丢失数据了,
因为正常shutdown数据已经写到数据文件中了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
那么我们假想使用了老的数据备份,那么在前滚的时候会用到这部分数据吗?
我们在模拟日志2出错后,复制数据文件备份.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

###############################################
# [测试3] 数据文件损坏,控制文件损坏,有trace ,
#         使用resetlogs,非在线日志损坏
###############################################

SQL> create table arch (status varchar(2));  --归档1

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects; --在归档2

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          1 YES INACTIVE
         3          3 NO  CURRENT

SQL>
SQL>
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

这里模拟日志文件组2错误,控制文件损坏,数据文件损坏
SQL>
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> shutdown
ORA-01109: ??????

已经卸载数据库。
ORACLE 例程已经关闭。

还原数据文件
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL>  CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2   --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3       MAXLOGFILES 5
  4       MAXLOGMEMBERS 3
  5       MAXDATAFILES 100
  6       MAXINSTANCES 1
  7       MAXLOGHISTORY 226
  8   LOGFILE
  9     GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10     GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11     GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12   -- STANDBY LOGFILE
13   DATAFILE
14     'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15     'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16     'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17     'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18     'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19   CHARACTER SET ZHS16GBK
20   ;

控制文件已创建

SQL> alter database mount
  2  ;
alter database mount
*
ERROR 位于第 1 行:
ORA-01100: ??????

SQL> shutdown
ORA-01109: ??????

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> recover database using backup controlfile using cancel;
ORA-01906: 需要 BACKUP 关键字

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;

数据库已更改。

SQL>  select count(*),status from arch group by status;
select count(*),status from arch group by status
                             *
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在

SQL> select count(*) from arch;
select count(*) from arch
                     *
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在

SQL> select count(*) from test;

COUNT(*)
----------
     12330           
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
用resetlogs就不会完全恢复了,因为数据文件也还原了,
所以要读在线日志进行前滚,可现在是resetlogs
那我们用noresetlogs来创建控制文件会怎么样呢?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
###############################################
# [测试4] 数据文件损坏,控制文件损坏,有trace ,
#         使用noresetlogs,非在线日志损坏 ,shutdown abort
###############################################    
    
SQL> shutdown
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;

数据库已更改。

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES INACTIVE
         3          4 YES ACTIVE

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69641

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;

数据库已更改。

SQL> insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 YES INACTIVE
         2          6 NO  CURRENT
         3          4 YES INACTIVE

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 3月 2 16:29:44 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

已连接到空闲例程。

SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226

8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M  --这个非在线日志丢了
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'C:\ORACLE\ORADATA\testdb\REDO03.LOG'???
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226

8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M --删除日志3
11  -- STANDBY LOGFILE
12  DATAFILE
13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
18  CHARACTER SET ZHS16GBK
19  ;

控制文件已创建

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database ;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 69594 (? 03/02/2005 16:27:24 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69594 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

已应用的日志。
完成介质恢复。
SQL> alter database open;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 af
      6166 no
     98656 ok
这种情况配合noresetlogs可以完全恢复.

################################                                                                     
# [1.5] 有trace,活动在线日志损坏   
################################
################################                                                             
# [1.5.1] 有trace,活动在线日志损坏,正常shutdown或是当前的数据文件  
################################
SQL> create table arch (status varchar(2));

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          1 YES ACTIVE
         3          3 NO  CURRENT
    
SQL> shutdown  --正常关闭数据库
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

此时模拟删除当前在线日志组3
SQL>
SQL>
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建

SQL> alter database open resetlogs;

数据库已更改。
   
SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     12332 ok

-->>没有丢失任何数据,因为你的数据都已经写到数据文件里了

#########################################                                                  
# [1.5.2] 有trace,活动在线日志损坏,shutdown abort 或是非当前的数据文件
          ,当前在线日志文件损坏         
#########################################

####################################################
[测试1] shutdown abort,备份控制文件或者resetlog的trace,
没有数据文件备份,采用强制打开数据库的方法
####################################################
SQL> create table arch (status varchar(2));           
                                                          
表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;
SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。
SQL>  select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          3 NO  CURRENT
         3          1 YES INACTIVE

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> shutdown abort
ORACLE 例程已经关闭。

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'
ORA-27047: 无法读取文件的标题块
OSD-04006: ReadFile() 失败, 无法读取文件
O/S-Error: (OS 38) 到达文件结尾。

SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
ERROR 位于第 1 行:
ORA-01624: 线程1的紧急恢复需要日志1
ORA-00312: 联机日志 1 线程 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'

SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01194: ??1?????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 70123 (? 02/28/2005 15:22:05 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 70123 ???? 1 ???? # 3 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: ??: RECOVER ??? OPEN RESETLOGS ???????
ORA-01194: ??1?????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

ORA-01112: ???????

我们看到如果是abort DOWN机的话,打开数据库都需要应用在线活动日志

这时必须加隐含参数强制打开数据库,并进行导出,重建数据库,导入业务数据

SQL> show parameter spfile                                                                               
                                                                                                         
NAME                                 TYPE        VALUE                                                   
------------------------------------ ----------- -----------------------------                           
spfile                               string      %ORACLE_HOME%\DATABASE\SPFILE                           
                                                 ORACLE_SID%.ORA                                         
                                                                                                         
                                                                                                         
SQL> create pfile='pfiletest.ora' from spfile;                                                           
                                                                                                         
文件已创建。                                                                                             
                                                                                                         
SQL> create pfile='c:\pfiletest.ora' from spfile;                                                        
                                                                                                         
文件已创建。                                                                                             
编辑c:\pfiletest.ora                                                                                     
增加三个参数                                                                                             
                                                                                                         
_allow_resetlogs_corruption=true                                                                         
_corrupted_rollback_segments=true                                                                        
_offline_rollback_segments=true                                                                          
                                                                                                         
SQL> shutdown immediate                                                                                  
ORA-01109: 数据库未打开                                                                                  
                                                                                                         
                                                                                                         
已经卸载数据库。                                                                                         
ORACLE 例程已经关闭。                                                                                    
SQL>                                                                                                     
SQL>                                                                                                     
SQL>                                                                                                     
SQL> startup pfile='c:\pfiletest.ora'                                                                    
ORACLE 例程已经启动。                                                                                    
                                                                                                         
Total System Global Area  135338868 bytes                                                                
Fixed Size                   453492 bytes                                                                
Variable Size             109051904 bytes                                                                
Database Buffers           25165824 bytes                                                                
Redo Buffers                 667648 bytes                                                                
数据库装载完毕。                                                                                         
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项                                          
                                                                                                         
                                                                                                         
SQL> alter database open resetlogs;                                                                      
alter database open resetlogs                                                                            
*                                                                                                        
ERROR 位于第 1 行:                                                                                       
ORA-01092: ORACLE 例程终止。强行断开连接                                                                 
                                                                                                         
                                                                                                         
SQL>                                                                                                     
SQL>                                                                                                     
SQL> exit                                                                                                
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production                                             
With the Partitioning, OLAP and Oracle Data Mining options                                               
JServer Release 9.2.0.1.0 - Production中断开                                                             
                                                                                                         
C:\>sqlplus "/as sysdba"                                                                                 
                                                                                                         
SQL*Plus: Release 9.2.0.1.0 - Production on 星期五 12月 31 14:03:09 2004                                 
                                                                                                         
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.                                      
                                                                                                         
已连接到空闲例程。                                                                                       
                                                                                                         
SQL> startup pfile='c:\pfiletest.ora'                                                                    
ORACLE 例程已经启动。                                                                                    
                                                                                                         
Total System Global Area  135338868 bytes                                                                
Fixed Size                   453492 bytes                                                                
Variable Size             109051904 bytes                                                                
Database Buffers           25165824 bytes                                                                
Redo Buffers                 667648 bytes                                                                
数据库装载完毕。                                                                                         
数据库已经打开。                                                                                         
SQL>

####################################################
# [测试2] shutdown abort,resetlog的trace,
#         有数据文件备份,当前在线日志损坏,控制文件损坏,有trace
####################################################
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG

2  --  SET STANDBY TO MAXIMIZE PERFORMANCE

3      MAXLOGFILES 5

4      MAXLOGMEMBERS 3

5      MAXDATAFILES 100

6      MAXINSTANCES 1

7      MAXLOGHISTORY 226

8  LOGFILE
  9    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,

10    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M

11  -- STANDBY LOGFILE

12  DATAFILE

13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',

14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',

15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',

16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',

17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'

18  CHARACTER SET ZHS16GBK

19  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01192: ??????????

~~~~~~~~~~~~~~~~~~~~~~
如果是NORESETLOGS,那么他要检查当前的在线日志,而现在没有了

SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG

2  --  SET STANDBY TO MAXIMIZE PERFORMANCE

3      MAXLOGFILES 5

4      MAXLOGMEMBERS 3

5      MAXDATAFILES 100

6      MAXINSTANCES 1

7      MAXLOGHISTORY 226

8  LOGFILE

9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,

10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,

11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M

12  -- STANDBY LOGFILE

13  DATAFILE

14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',

15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',

16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',

17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',

18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'

19  CHARACTER SET ZHS16GBK

20  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'C:\ORACLE\ORADATA\testdb\REDO01.LOG'???  -->>这个文件不在了
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG

2  --  SET STANDBY TO MAXIMIZE PERFORMANCE

3      MAXLOGFILES 5

4      MAXLOGMEMBERS 3

5      MAXDATAFILES 100

6      MAXINSTANCES 1

7      MAXLOGHISTORY 226

8  LOGFILE
  9    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,

10    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M

11  -- STANDBY LOGFILE

12  DATAFILE

13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',

14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',

15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',

16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',

17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'

18  CHARACTER SET ZHS16GBK

19  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-00200: ????????
ORA-00202: ????: 'C:\oracle\oradata\testdb\control01.ctl'  --这个文件不能被覆盖,删除三个控制文件
ORA-27086: skgfglk: ?????? - ?????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 5) >\>x7CNJ!#

SQL> shutdown
ORA-01507: ??????

ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG

2  --  SET STANDBY TO MAXIMIZE PERFORMANCE

3      MAXLOGFILES 5

4      MAXLOGMEMBERS 3

5      MAXDATAFILES 100

6      MAXINSTANCES 1

7      MAXLOGHISTORY 226

8  LOGFILE
  9    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,

10    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M

11  -- STANDBY LOGFILE

12  DATAFILE

13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',

14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',

15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',

16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',

17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'

18  CHARACTER SET ZHS16GBK

19  ;

控制文件已创建

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01589: ??????????? RESETLOGS ? NORESETLOGS ??

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01152: ?? 1 ????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69616 (? 03/02/2005 16:53:52 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69616 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69661 (? 03/02/2005 16:53:54 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69661 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69661 (? 03/02/2005 16:53:54 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69661 ???? 1 ???? # 5 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
     98656 ok  --还原了部分数据,但不能还原在线日志中的数据

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果数据库是abort或者老的数据文件备份,那么就涉及到控制文件和数据文件不一致,需要恢复,就涉及到当前被破坏的在线日志,
,启动时仍然需要用在线活动日志进行恢复.如果是正常的shutdown,而且没有用老的数据备份,那么控制文件和数据文件是一致的,
不需要当前在线日志.而在abort或者老的数据文件备份在这种情况下,只能用备份的datafile和备份的controlfile来做不完
全恢复,都将造成数据丢失。因此多重controlfile 和 online redo log file 很重要。通常情况下是在正常运行数据库时,
当前在线日志被破坏的,此时马上会数据库不正常DOWN机,也就出现1.5.2的情景
我们知道如果是abort关闭的,那么有些事务是不完整的或者有些事务没有被写到数据文件,在数据文件中有这样的标识,这样,用
create controlfile ... noresetlogs或者resetlogs创建时读取数据文件头信息,该文件在控制文件信息,比如结束SCN设置为无穷大)
打开时就需要当前在线日志恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
####################################################
# [测试3] shutdown abort,控制文件损坏,备份控制文件,
#         当前在线日志损坏,有数据文件备份
####################################################

还原原来备份的数据文件,控制文件
SQL> shutdown
ORA-01109: 数据库未打开

ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> recover database using backup controlfile ;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69572 (? 03/02/2005 17:07:43 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69572 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69617 (? 03/02/2005 17:07:44 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69617 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69617

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69617 (? 03/02/2005 17:07:44 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69617 ???? 1 ???? # 5 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69617

SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
     98656 ok

######################################################                                               
# [1.5.3]  控制文件损坏,如果trace不是最新的数据库结构,如少了个数据文件
######################################################

SQL> create table arch (status varchar(2));

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 NO  ACTIVE
         2          1 YES ACTIVE
         3          3 NO  CURRENT   
SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf'
size 10m;

表空间已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

模拟控制文件丢失

SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建

SQL> alter database open;

数据库已更改。

SQL> select name,status from v$datafile;

NAME                                         STATUS
--------------------------------------       -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF       ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF          ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF         ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF             ONLINE
C:\ORACLE\ORA92\DATABASE\MISSING00006        RECOVER --这个文件现在是recover状态

已选择6行。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们发现C:\ORACLE\ORA92\DATABASE\MISSING00006并不存在,只不过是个标记而已
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf';  --MISSING00006不要加路径

数据库已更改。

SQL> recover datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf';
完成介质恢复。

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf' online;

数据库已更改。

~~~~~~~~~~~~~~~~~~~~~~~~~
如果用备份控制文件,且备份
控制文件少了新增加的两个文件
,恢复时会提示错误,我们可以
用rename来解决
~~~~~~~~~~~~~~~~~~~~~~~~~
使用备份控制文件
recover AUTOMATIC   database using backup controlfile until cancel
...      
ORA-00283: recovery session canceled due to errors                  
ORA-01244: unnamed datafile(s) added to controlfile by media recovery
ORA-01110: data file 3: '/oracle/dbs/db2.f'                         
ORA-01110: data file 2: '/oracle/dbs/db3.f'

~~~~~~~~~~~~~~~~~~~~
这是因为前滚时发现file#中
有两个文件,但控制文件没有
我们可以在v$datafile中看到
所以恢复中断
~~~~~~~~~~~~~~~~~~~~
SELECT FILE#,NAME
FROM V$DATAFILE;

FILE#           NAME
--------------- ----------------------
1               /oracle/dbs/db1.f
2               /oracle/dbs/UNNAMED00002
3               /oracle/dbs/UNNAMED00003

这时对文件进行改名就可以了

ALTER DATABASE RENAME FILE '/db/UNNAMED00002' TO '/oracle/dbs/db3.f';
ALTER DATABASE RENAME FILE '/db/UNNAMED00003' TO '/oracle/dbs/db2.f';

RECOVER AUTOMATIC DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL

######################################################                               
# [1.5.4] 控制文件损坏,如果trace不是最新的数据库结构,如少了个只读数据文件
######################################################

SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf'
size 10m ;

表空间已更改。                 
SQL> alter tablespace tools read only;

表空间已更改。
   
    SQL> select name,ENABLED
  2   from v$datafile;

NAME                                            ENABLED
---------------------------------------         ----------   
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                READ WRITE
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                READ WRITE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                READ WRITE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                READ ONLY
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                READ WRITE
C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF                READ ONLY

已选择6行。
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建
SQL> select name from v$datafile;

NAME
---------------------------------------------------------------------------

C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
SQL> alter database open;

数据库已更改。

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------

C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
C:\ORACLE\ORA92\DATABASE\MISSING00006  --OPEN时增加了不认识的文件名

已选择6行。

SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORA92\DATABASE\TOOL
S02.DBF';
alter database rename file 'MISSING00006' to 'C:\ORACLE\ORA92\DATABASE\TOOLS02.D
BF'
*
ERROR 位于第 1 行:
ORA-01511: 重命名日志/数据文件时出错
ORA-01141: 重命名数据文件 6 时出错 - 未找到新文件
'C:\ORACLE\ORA92\DATABASE\TOOLS02.DBF'
ORA-01111: 数据文件 6 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 6: 'C:\ORACLE\ORA92\DATABASE\MISSING00006'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
*
ERROR 位于第 1 行:
ORA-01113: ?? 4 ??????
ORA-01110: ???? 4: 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF'

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF' offline;

数据库已更改。

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF' offline;
alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF' offline
*
ERROR 位于第 1 行:
ORA-01516: ????????, ????????? 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF'

SQL> alter database open ;

数据库已更改。

SQL> alter database datafile 'MISSING00006' offline;  -->>注意只读表空间必须先offline,而且注意MISSING00006不能写全路径

数据库已更改。

SQL> alter database rename file  'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\TOO
LS02.DBF';

数据库已更改。
SQL> alter tablespace tools online;

表空间已更改。

方法2
SQL> SHUTDOWN
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP NOMOUNT
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG

2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\TOOLS02.DBF',  --创建语句中加入该数据文件
19    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
20  CHARACTER SET ZHS16GBK
21  ;

控制文件已创建

SQL> SELECT NAME FROM V$DATAFILE;

NAME
---------------------------------------------------------------------------

C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF

已选择6行。

SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 位于第 1 行:
ORA-01113: ?? 4 ??????
ORA-01110: ???? 4: 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF'

SQL> RECOVER TABLESPACE TOOLS;
完成介质恢复。
SQL> ALTER DATABASE OPEN;

数据库已更改。

##################################             
# [1.6] 使用备份的控制文件进行恢复
#                    
##################################

前面有很多例子

################################################                                                    
# [1.7] 数据文件损坏,且没有备份,没有备份控制文件,
#       且其他数据文件备份中都是在该数据文件创建后
#       的备份
################################################

################################################                                                    
# [测试1](resetlogs前创建的数据文件),数据文件丢失,没有备份,控制文件损坏,有备份控制文件,但备份控制文件后于该文件重建日期
#         使用resetlogs打开数据库,所以没有数据文件自创建以来所有的日志,
#         因为前面的日志被截取了,(所以resetlog后必须要有备份,
#         除非是resetlogs后创建的数据文件,可以通过create datafile来恢复)
#         当然如果有resetlogs后的控制文件及相关的数据,也可以完全恢复,参见1.12
#################################################
还原原来的数据文件和控制文件
然后SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 对于线程 1 是按序列 # 13 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto -->>使用auto恢复也是成功
ORA-00308: 无法打开存档日志 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> recover database using backup controlfile until cancel; -->>这个cancel是表示每次应用一个日志时都提示一下,直到输入cancel后结束
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 对于线程 1 是按序列 # 13 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL} 
cancel  --输入cancel恢复成功 -->>cancel选项允许每次前滚一个日志文件,当需要停止恢复时,输入cancel
                                 ,在这种方式下不会自动运用联机日志文件.
介质恢复已取消。
SQL> alter database open resetlogs;

数据库已更改。

SQL> select name,status from v$datafile;

NAME                                                         STATUS
------------------------------------------------------------ -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                       ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                          ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                         ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                         ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF                         ONLINE

已选择6行。
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

在数据库打开的状况下用ULTRAEDIT破坏文件USERS01.DBF

SQL> shutdown abort
ORACLE 例程已经关闭。

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF' offline;

数据库已更改。

SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF' ;
alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
*
ERROR 位于第 1 行:
ORA-01181: ??5????? RESETLOGS ???????????
ORA-01110: ???? 5: 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
因为使用resetlogs打开数据库,所以没有数据文件自创建以来所有的日志,因为前面的日志被截取了
(所以resetlog后必须要有备份,除非是resetlogs后创建的数据文件,可以通过create datafile来恢复)
换句话说,因为数据文件在创建的时候的创建时间点和相关信息保存在控制文件中!控制文件丢失的话
数据文件的创建时候的信息丢失,则数据库无从知道要 从创建文件创建时候开始recover datafile
需要从哪个归档日志开始。也就无法知道该数据文件是否可以从现有归档日志恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

################################################                                                    
# (resetlog是在数据文件创建前或者控制文件包含了创建该数据文件的起始信息)
          那我们测试resetlogs后创建的数据文件被丢失,没有备份的恢复方法
          假设前面的users01没有破坏,数据库被打开
################################################         
分两种
#####################################################################################################
# [测试2] 控制文件正常,数据文件丢失,数据文件丢失没有备份,
#         也就说丢失的数据文件创建在该控制文件中的,该控制文件也没有被trace刷新,那控制文件就包含了该数据文件自创建以来的所有信息
#####################################################################################################

SQL> shutdown
ORA-01109: ??????

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;

数据库已更改。

SQL>
SQL>
SQL> alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
size 25M;

表空间已更改。

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES INACTIVE
         3          4 YES ACTIVE

SQL> select file# ,name from v$datafile;

FILE#            NAME
----------        ---------------------------------
         1        C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
         2        C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
         3        C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
         4        C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
         5        C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
         6        C:\ORACLE\ORADATA\TESTDB\USERS02.DBF
已选择6行。

SQL> select segment_name from dba_extents where FILE_ID=6;

SEGMENT_NAME
--------------------------------------------------------------------------------
ARCH

SQL> shutdown abort
ORACLE 例程已经关闭。

用ultraedit编辑文件USERS02.DBF

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> select name ,status from v$datafile;

NAME                                                STATUS
---------------------------------------             -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS02.DBF                ONLINE
已选择6行。

SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'; --online也可以create

数据库已更改。 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
system tablespace 的第一个datafile 是不能用 alter database create datafile 命令
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> recover datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF';

完成介质恢复。
SQL> alter database open;

数据库已更改。

SQL> select count(*) ,status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     98656 ok

完全恢复了

#####################################################################################################
# [测试3] 控制文件没有丢失,数据文件丢失,数据文件丢失没有备份
####################################################################################################
-->>那我们看看在offline情况下,recover database 会不会丢失数据

alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF' size 25M;

SQL> select file#,name from v$datafile;

FILE# NAME
---------- --------------------------------------------------
         1 C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
         2 C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
         3 C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
         4 C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
         5 C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
         6 C:\ORACLE\ORADATA\TESTDB\USERS02.DBF
         7 C:\ORACLE\ORADATA\TESTDB\USERS03.DBF
        
SQL> select segment_name from dba_extents where FILE_ID= 7;

未选定行        
        
SQL> insert into arch select * from arch;

已创建104822行。

SQL> commit;

提交完成。

SQL> select segment_name from dba_extents where FILE_ID= 7;

SEGMENT_NAME
-------------------------------------------------------------------
ARCH
用ultraedit编辑文件USERS03.DBF迫害该文件
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01157: ????/?????? 7 - ??? DBWR ????
ORA-01110: ???? 7: 'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF'

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF' offline;

数据库已更改。

SQL> alter database create datafile  'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF';

数据库已更改。

SQL> recover datafile  'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF';
完成介质恢复。
SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF' online;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> select count(*) ,status from arch group by status;

COUNT(*) ST
---------- --
     12332 no
    197312 ok
   
    --数据没有丢失

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
那我们如果使用recover database 方式恢复offline的数据文件呢
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF' size 25M;

表空间已更改。

SQL> select file#,name from v$datafile;

FILE# NAME
---------- --------------------------------------------------
         1 C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
         2 C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
         3 C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
         4 C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
         5 C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
         6 C:\ORACLE\ORADATA\TESTDB\USERS02.DBF
         7 C:\ORACLE\ORADATA\TESTDB\USERS03.DBF
         8 C:\ORACLE\ORADATA\TESTDB\USERS04.DBF

已选择8行。

SQL> insert into arch select * from arch;

已创建209644行。

SQL> select segment_name from dba_extents where FILE_ID= 8;

SEGMENT_NAME
----------------------------------------------------------------------------

ARCH

SQL> commit;

提交完成。

SQL>
SQL>
SQL> shutdown abort
ORACLE 例程已经关闭。

删除文件USERS04
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF' offline;

数据库已更改。

SQL> recover datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF';
ORA-00283: ??????????
ORA-01110: ???? 8: 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF'
ORA-01157: ????/?????? 8 - ??? DBWR ????
ORA-01110: ???? 8: 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF'

SQL> alter database create datafile  'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF';

数据库已更改。

SQL> select name,status from v$datafile;

NAME                                               STATUS
-------------------------------------------------- -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF              SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF             ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS02.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS03.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS04.DBF               RECOVER

已选择8行。

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF' offline;

数据库已更改。

SQL> recover database;   --我们看到offline的数据文件恢复无效,到后来还是要在online之后再恢复一把
完成介质恢复。
SQL>  select count(*) ,status from arch group by status;
select count(*) ,status from arch group by status
                              *
ERROR 位于第 1 行:
ORA-01219: ??????: ???????/?????

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF' online;

数据库已更改。

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 8 ??????
ORA-01110: ???? 8: 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF'

SQL> recover database;
完成介质恢复。
SQL> alter database open;

数据库已更改。

SQL> select count(*) ,status from arch group by status;

COUNT(*) ST
---------- --
     24664 no
    394624 ok
   
#####################################################################################################
# [测试4] 控制文件丢失,数据文件丢失,没有备份,有trace,那我们看看为什么trace会造成控制文件的头中数据文件创建的信息被修改
# 无法实现create datafile功能
#################################################################
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;

数据库已更改。

SQL> alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
size 25m;

表空间已更改。

SQL> alter database backup controlfile to trace;

数据库已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF',
19    'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
20  CHARACTER SET ZHS16GBK
21  ;

控制文件已创建

SQL> alter database open;

数据库已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF' ;
alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
*
ERROR 位于第 1 行:
ORA-01178: 文件 6 在最后一个 CREATE CONTROLFILE 之前创建,无法重新创建
ORA-01110: 数据文件 6: 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以执行了create controlfile后一定要先做个全备份
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#####################################################################################################
# [测试5]控制文件没有创建数据文件的起始信息,使用不同trace的方法
#####################################################################################################
SQL> alter database open;

数据库已更改。

SQL>
SQL>
SQL>
SQL>
SQL> col name format a50
SQL> select name ,status from v$datafile;

NAME                                               STATUS
-------------------------------------------------- -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF              SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF             ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF               ONLINE

SQL> alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
size 25m;

表空间已更改。

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 YES ACTIVE

SQL> select name ,status from v$datafile;

NAME                                               STATUS
-------------------------------------------------- -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF              SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF             ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS02.DBF               ONLINE

已选择6行。

SQL> alter database backup controlfile to 'C:\oracle\oradata\testdb\controlfile
ak.ctl';  --该控制文件包含了USERS02的头信息

数据库已更改。

SQL> alter database backup controlfile to trace;

数据库已更改。
此时用ultraedit破坏文件USERS02

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

删除3个控制文件

SQL> startup nomount;
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF',
19    'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
20  CHARACTER SET ZHS16GBK
21  ;
CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'???
ORA-27047: ??????????
OSD-04006: ReadFile() J'0\, N^7(6AH!ND<~
O/S-Error: (OS 38) 5=4oND<~=aN2!#

SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建

SQL> alter database mount
  2  ;
alter database mount
*
ERROR 位于第 1 行:
ORA-01100: ??????

SQL> shutdown
ORA-01109: ??????

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> col name format a60
SQL> select name ,status from v$datafile;

NAME                                                         STATUS
------------------------------------------------------------ -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                       RECOVER
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                          RECOVER
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                         RECOVER
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                         RECOVER

SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF';
alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
*
ERROR 位于第 1 行:
ORA-01516: 不存在的日志文件, 数据文件或临时文件
'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'

SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF' as 'C
:\ORACLE\ORADATA\TESTDB\USERS02.DBF' reuse ;
alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF' as 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF' reuse
*
ERROR 位于第 1 行:
ORA-01516: 不存在的日志文件, 数据文件或临时文件
'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'

SQL> recover database;
完成介质恢复。
SQL> alter database open;

数据库已更改。

SQL> select name,status from v$datafile;

NAME                                                         STATUS
------------------------------------------------------------ -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                       ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                          ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                         ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                         ONLINE
C:\ORACLE\ORA92\DATABASE\MISSING00006                        RECOVER

已选择6行。

SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\USER
S02.DBF';
alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\USERS02.D
BF'
*
ERROR 位于第 1 行:
ORA-01511: 重命名日志/数据文件时出错
ORA-01141: 重命名数据文件 6 时出错 - 未找到新文件
'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
ORA-01111: 数据文件 6 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 6: 'C:\ORACLE\ORA92\DATABASE\MISSING00006'
ORA-27047: 无法读取文件的标题块
OSD-04006: ReadFile() 失败, 无法读取文件
O/S-Error: (OS 38) 到达文件结尾。

SQL> alter database datafile 'MISSING00006' offline;

数据库已更改。

SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\USER
S02.DBF';
alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\USERS02.D
BF'
*
ERROR 位于第 1 行:
ORA-01511: 重命名日志/数据文件时出错
ORA-01141: 重命名数据文件 6 时出错 - 未找到新文件
'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
ORA-01111: 数据文件 6 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 6: 'C:\ORACLE\ORA92\DATABASE\MISSING00006'
ORA-27047: 无法读取文件的标题块
OSD-04006: ReadFile() 失败, 无法读取文件
O/S-Error: (OS 38) 到达文件结尾。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
数据库打开了,但数据文件USERS02无法恢复,因为控制文件无法记录该文件创建时的信息,所以也无法实现rename file 'MISSING00006'
我们再来验证一下控制文件信息与数据文件头信息的关系
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

###################################################################################
# [测试6]  数据文件损坏,且没有备份,控制文件使用备份控制文件,且控制文件是在该数据文件创建后的控制文件
###################################################################################

那我们用刚开始的备份的控制文件可不可以呢?

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL>
SQL> alter database open;

数据库已更改。

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE

SQL>
SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
ize 10m;

表空间已更改。

SQL> insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL>
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;

数据库已更改。

SQL> alter database backup controlfile to 'c:\control01.ctl';

数据库已更改。

SQL> insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

C:\Documents and Settings\lifeng.fang>
C:\Documents and Settings\lifeng.fang>
C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 3月 2 18:17:11 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

已连接到空闲例程。

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF';

数据库已更改。

SQL> recover database using backup controlfile ;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69563 (? 03/02/2005 18:12:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69563 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69606 (? 03/02/2005 18:12:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69606 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69672 (? 03/02/2005 18:13:24 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_6.DBF
ORA-00280: ?? 69672 ???? 1 ???? # 6 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69834 (? 03/02/2005 18:15:40 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF
ORA-00280: ?? 69834 ???? 1 ???? # 7 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_6.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69834 (? 03/02/2005 18:15:40 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF
ORA-00280: ?? 69834 ???? 1 ???? # 7 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;

数据库已更改。
SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
     12332 af
      6166 no
     98656 ok
#############################################################################################        
[1.8] 数据文件损坏,且没有备份,控制文件使用备份控制文件,且控制文件是在该数据文件创建前的控制文件 
    参见1.7的测试1
#############################################################################################   
###################################################################################
# [1.9]  数据文件损坏,且没有备份,控制文件使用备份控制文件,且控制文件是在该数据文件创建后的控制文件
###################################################################################
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL>
SQL> alter database open;

数据库已更改。

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE

SQL>
SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
ize 10m;

表空间已更改。

SQL> insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile; --一定要归档

系统已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL>
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;

数据库已更改。

SQL> alter database backup controlfile to 'c:\control01.ctl';  --该控制文件有数据文件头信息

数据库已更改。

SQL> insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

C:\Documents and Settings\lifeng.fang>
C:\Documents and Settings\lifeng.fang>

模拟控制文件破坏,删除控制文件,还原备份的控制文件,还原老的所有的数据文件,出了users02.dbf

C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 3月 2 18:17:11 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

已连接到空闲例程。

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF';

数据库已更改。

SQL> recover database using backup controlfile ;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69563 (? 03/02/2005 18:12:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69563 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69606 (? 03/02/2005 18:12:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69606 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69672 (? 03/02/2005 18:13:24 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_6.DBF
ORA-00280: ?? 69672 ???? 1 ???? # 6 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: ?? 69834 (? 03/02/2005 18:15:40 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF
ORA-00280: ?? 69834 ???? 1 ???? # 7 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_6.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69834 (? 03/02/2005 18:15:40 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF
ORA-00280: ?? 69834 ???? 1 ???? # 7 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;

数据库已更改。 
SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
     12332 af
      6166 no
     98656 ok
##############################################################################################    
# [1.10] 数据文件损坏,且没有备份,没有备份控制文件,且其他数据文件备份中都是在该数据文件创建后的备份
##############################################################################################

##############################################################################################
# [1.11] 损坏单个控制文件
#        将好的控制文件覆盖损坏的控制文件
##############################################################################################

##############################################################################################
# [1.12] 当前控制文件做为备份控制文件恢复,在当前在线日志中有业务数据时的恢复    (通常没有太大意义,只是想做一下resetlogs)
##############################################################################################
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL> alter database open;

数据库已更改。

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE

SQL>
SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     98656 ok

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> recover database using backup controlfile;
ORA-00279: ?? 69399 (? 03/01/2005 15:58:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69399 ???? 1 ???? # 4 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 69444 (? 03/01/2005 15:58:23 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69444 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> shutdown
ORA-01109: ??????

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69444 (? 03/01/2005 15:58:23 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69444 ???? 1 ???? # 5 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: ??: RECOVER ??? OPEN RESETLOGS ???????
ORA-01194: ??1?????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

ORA-01112: ???????

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01194: ??1?????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> shutdown
ORA-01109: ??????

已经卸载数据库。
ORACLE 例程已经关闭。

这里我们看到是shutdown abort的,所以需要在线日志恢复,但是使用备份控制文件恢复则是不应用在线日志的

如果不是shutdown abort,那么就可以打开,因为数据文件一直是完整的

##############################################################################          
# [1.13] 在resetlogs前的RMAN备份如何应用到resetlogs后的 
##############################################################################

SQL> alter database open;

数据库已更改。

SQL> select count(*) from arch;
select count(*) from arch
                     *
ERROR 位于第 1 行:
ORA-00942: ???????

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> /

系统已更改。

SQL> /

系统已更改。

SQL> /

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

-->>模拟一个resetlogs
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> recover database until cancel;
完成介质恢复。  -->>这里我们后面可以注意到
SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     98656 ok

SQL> insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> alter system switch logfile;

系统已更改。

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
下一个存档日志序列   2
当前日志序列           2
SQL> shutdown
ORA-01097: 无法在事务处理过程中关闭 - 首先提交或返回
SQL> commit;

提交完成。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

-->>此时模拟删除了users01.dbf
我们没有resetlogs后的备份,想把resetlogs前备份的数据文件恢复数据库到resetlogs后的状态

关键步骤.还原resetlogs前备份的数据文件和控制文件,不包括在线日志(我们后面可以看到在线日志包括了SCN 69628 - 69459)
SQL> select resetlogs_change# - 1 from v$database;

RESETLOGS_CHANGE#-1
-------------------
              68658

SQL> recover database using backup controlfile until change 69639;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69582 (在 03/02/2005 10:28:34 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69582 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69628 (在 03/02/2005 10:28:35 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69628 对于线程 1 是按序列 # 5 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> recover database using backup controlfile until change 69639;
ORA-00279: 更改 69628 (在 03/02/2005 10:28:35 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69628 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> select CONTROLFILE_CHANGE# from v$database;

CONTROLFILE_CHANGE#
-------------------
              69628
             
我们看到没有恢复到69639,因为我还原的时候没有把resetlogs前的在线日志备份给还原,所以没法前滚69628到69639

SQL> shutdown
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。

-->>这里还原resetlogs后的控制文件
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            69639               69795

SQL> recover database;
ORA-00283: 恢复会话因错误而取消
ORA-01190: 控制文件或数据文件1来自于最后一个 RESETLOGS 之前
ORA-01110: 数据文件 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

那我们只能不完全恢复
SQL> recover database until cancel;
ORA-00279: ?? 69452 (? 03/01/2005 17:45:23 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_9.DBF
ORA-00280: ?? 69452 ???? 1 ???? # 9 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69452 (? 03/01/2005 17:45:23 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_9.DBF
ORA-00280: ?? 69452 ???? 1 ???? # 9 ???

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> select count(*),status from arch group by status;
select count(*),status from arch group by status
                            *
ERROR 位于第 1 行:
ORA-01219: ??????: ???????/?????

SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     98656 ok  --我们没有看到af状态的

我们看到这里需要在线日志恢复,无法越过resetlogs恢复

好那我们在关键步骤那步把在线日志也还原的话是否可以越过69628到69639 一直到69795

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from arch;
select count(*) from arch
                     *
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE

SQL>
SQL>
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> recover database until cancel;
完成介质恢复。
SQL> shutdown immediate
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            68659               69884

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> alter database open resetlogs;

数据库已更改。

SQL> select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE# CONTROLFILE_CHANGE# 
----------------- -------------------
            69889               69932

SQL> insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL>
SQL>
SQL> recover database using backup controlfile until change 69888;     -->>这里我们看到until change 69888与RESETLOGS_CHANGE#接上头了,就是以为我们有备份的在线日志
ORA-00279: 更改 69888 (在 03/02/2005 11:11:40 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69888 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            68659               69888

SQL>
SQL> shutdown
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。

-->>这里我们将resetlogs后的控制文件备份还原(不包括resetlogs后的在线日志)
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            69889               69932

SQL> recover database ;
ORA-00283: 恢复会话因错误而取消
ORA-00314: 日志 1 (线程 1),预计序号 1 与 5 不匹配
ORA-00312: 联机日志 1 线程 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  -->>我们这里看到恢复仍然到69889截止,而没有恢复到69932

原因就是我们resetlogs后的在线日志也要做备份.
#################################################################
#[测试1] 那我们在看看resetlogs前的数据文件控制文件和在线日志都做了备份,
#        然后resetlogs后的控制文件在线日志都做备份的情况下,是不是能越过resetlogs
#################################################################

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。

-->>模拟resetlogs
SQL> recover database until cancel;
完成介质恢复。
SQL> shutdown
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。

-->>这里我们对所有的数据文件控制文件和在线日志进行备份
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> alter database open resetlogs;

数据库已更改。

SQL> select resetlogs_change# -1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            69808               69850

SQL> insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

--这时我们备份控制文件和在线日志,因为我们需要69808 到 69850的数据
-->>这时我们把users01.dbf删除
-->>还原resetlogs前的所有数据文件控制文件和在线日志
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL>
SQL>  select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            68659               69804

SQL> recover database using backup controlfile until change 69808;
ORA-00279: 更改 69808 (在 03/02/2005 11:35:33 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69808 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> recover database using backup controlfile until change 69808;
ORA-00279: 更改 69808 (在 03/02/2005 11:35:33 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69808 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL>  select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE# CONTROLFILE_CHANGE#   --已经应用到了69808
----------------- -------------------
            68659               69808

SQL>
SQL>
SQL> shutdown
ORA-01109: 数据库未打开

-->>好这时我们就需要应用69808 到 69850的数据
-->>这时我们要想恢复69808 到 69850的数据就必须要resetlogs后的控制文件,
我们从前面的CONTROLFILE_CHANGE#和ESETLOGS_CHANGE#就可以看的出来,只有他才能进行完全恢复到69850

-->>还原resetlogs后的控制文件和在线日志文件
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL>  select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            69809               69850

SQL> recover database;
完成介质恢复。

SQL> alter database open;

数据库已更改。

SQL> select count(*) ,status from arch group by status;

COUNT(*) ST
---------- --
      6166 af
      6166 no
     98656 ok
     --这一次是真的越过resetlogs正确的完全恢复了
            
-->>注意切换归档是不是的序列号是不是当前序列号

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
必须使用TEMPORARY(一些数据文件对检查点不可用)或IMMEDIATE(所有数据文件对
检查点不可用)选项。在表空间再现联机之前,那些数据文件需要被恢复(数据文件恢复或
表空间恢复)。如果文件修复之后,重新联机之前发生了数据库崩溃,而该崩溃又要求执行不
完全的介质恢复的话,其后用来恢复数据库的RESETLOGS选项将致使该脱机表空间无效。恢
复该表空间的唯一方法是将以前的备份还原到另外一台机器上,用存档重作日志实施恢复,
直到数据库失败前为止,这样做显然会浪费大量的时间和资源。因此在恢复之前,应当切记
检查v$datafile确定所有的关键表空间是联机的。但是,允许只读表空间的数据文件或通过
NORMAL选项脱机的表空间,保持不变(因为它们已经是一致的了,不希望它们隶属于恢复
操作)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

###############################################################################################
#                                  [2]. 非归档模式下的恢复(rman和常规恢复)                    #
###############################################################################################
~~~~~~~~~~~~~~~~~~
准备工作
~~~~~~~~~~~~~~~~~~

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> alter database noarchivelog;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL>
SQL> archive log list
数据库日志模式             非存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     0
当前日志序列           1
SQL>
SQL>
SQL>
SQL>
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup -->>是spfile启动的,所以不需要修改初始化参数就已经启动了非存档模式
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> archive log list
数据库日志模式             非存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     0
当前日志序列           1
SQL>

###############################################
# [测试1] 数据库在非归档模式,数据库打开
###############################################
SQL> startup -->>是spfile启动的,所以不需要修改初始化参数就已经启动了非存档模式
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> archive log list
数据库日志模式             非存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     0
当前日志序列           1
SQL>

C:\Documents and Settings\lifeng.fang>rman nocatalog target "sys/sunsdl"

恢复管理器: 版本9.2.0.1.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.

连接到目标数据库: TESTDB (DBID=2334768642)
正在使用目标数据库控制文件替代恢复目录

RMAN> show all;

RMAN 配置参数为:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'C:\ORACLE\ORA92\DATABASE\SNCFTESTDB.ORA'
; # default

RMAN> backup database include current controlfile;

启动 backup 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 03/03/2005 09:46:
04
ORA-19602: 无法按 NOARCHIVELOG 模式备份或复制活动文件

~~~~~~~~~~~~~~~~~~~~~~~~~~
我们看到如果是NOARCHIVELOG 模式,
数据库如果打开则不能做RMAN备份
~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们可以用RMAN拷贝控制文件
RMAN> copy CURRENT CONTROLFILE TO 'c:\cf.cpy';

启动 copy 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 已复制当前的控制文件
输出文件名=C:\CF.CPY
完成 copy 于 03-3月 -05
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
###############################################
# [测试2] 数据库在非归档模式,数据库MOUNT,备份整个数据库
###############################################
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL>

RMAN> backup database include current controlfile;

启动 backup 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
输入数据文件 fno=00006 name=C:\ORACLE\ORADATA\TESTDB\USERS02.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\02GECED4_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 03-3月 -05

RMAN> backup tablespace users;

启动 backup 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\03GECEG5_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 03-3月 -05

###############################################
# [测试3] 数据库在非归档模式,数据库MOUNT,备份表空间
###############################################
RMAN> backup tablespace users;

启动 backup 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\03GECEG5_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 03-3月 -05

~~~~~~~~~~~~~~~~~~~~~~~~
注意表空间是逻辑概念,常规备份,
必须open数据库后才能看到表空间
但是RMAN可以在mount下备份表空间
~~~~~~~~~~~~~~~~~~~~~~~~

###############################################
# [测试4] 数据库在非归档模式,数据库MOUNT,备份的表空间是常规OFFLINE的
###############################################
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果使用TEMPORARY选项对表空间进行脱机,则数据库仍然会对该表空间
的所有文件进行一个检查点,其中如果有个文件IO损坏,那么他对该文件
不会执行检查点,但是normal方式脱机的话就会强制写检查点,所以如果
io物理损坏了,那么NORMAL方式可能就脱机不了了.假设表空间两个文件
T1,T2,如果T1写错误而被脱机.如果使用temporary选项,则ORACLE在使T1
脱机前设检查点检查文件D2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> alter  tablespace users offline immediate;
alter  tablespace users offline immediate
*
ERROR 位于第 1 行:
ORA-01145: 除非启用了介质恢复,否则不允许紧急脱机

SQL> alter  tablespace users offline TEMPORARY;

表空间已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。

RMAN> backup tablespace users;

启动 backup 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\09GECGJ0_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 backup 于 03-3月 -05

SQL> alter database open;

数据库已更改。

SQL> insert into arch select 'af' from dba_objects;
insert into arch select 'af' from dba_objects
            *
ERROR 位于第 1 行:
ORA-00376: 此时无法读取文件 5
ORA-01110: 数据文件 5: 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'

SQL> alter  tablespace users online;

表空间已更改。

SQL> insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter  tablespace users offline TEMPORARY;

表空间已更改。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。

RMAN> backup tablespace users;

启动 backup 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\0AGECGNM_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 backup 于 03-3月 -05

###############################################
# [测试5] 数据库在非归档模式,数据库MOUNT,shutdown abort,备份的表空间
###############################################

SQL> alter  tablespace users online;

表空间已更改。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建123320行。

SQL> /

已创建246640行。

SQL> /

已创建493280行。

SQL> /

已创建986560行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 NO  ACTIVE
         2          1 NO  ACTIVE
         3          3 NO  CURRENT

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL>
SQL>
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes

###############################################
# [测试6] 数据库在非归档模式,数据库MOUNT,数据文件丢失,有表空间备份
###############################################

RMAN> backup tablespace users;

启动 backup 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=12 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 03/03/2005 10:27
45
ORA-19602: 无法按 NOARCHIVELOG 模式备份或复制活动文件

RMAN> backup database include current controlfile;

启动 backup 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 03/03/2005 10:30:
06
ORA-19602: 无法按 NOARCHIVELOG 模式备份或复制活动文件

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果是shutdown abort,那么数据需要恢复
此时在mount下表空间数据是不完整的,所以无法备份表空间
同样也不能备份整个数据库,因为他不是一致性的数据库
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

RMAN> restore tablespace users;

启动 restore 于 03-3月 -05

使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00005恢复到C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段 handle=C:\ORACLE\ORA92\DATABASE\0AGECGNM_1_1 tag=TAG20050303T103534 params=N
LL
通道 ORA_DISK_1: 恢复完成
完成 restore 于 03-3月 -05

RMAN>

RMAN> recover tablespace users;

启动 recover 于 03-3月 -05
使用通道 ORA_DISK_1

正在开始介质的恢复
完成介质的恢复

完成 recover 于 03-3月 -05

RMAN> alter database open;

数据库已打开

###############################################
# [测试7] 数据库在归档模式,控制文件损坏,控制文件有备份,使用RMAN恢复
###############################################
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;

数据库已更改。

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

RMAN> backup database ;

启动 backup 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\01GECMF4_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 03-3月 -05

RMAN> copy CURRENT CONTROLFILE TO 'c:\cf.cpy';

启动 copy 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 已复制当前的控制文件
输出文件名=C:\CF.CPY
完成 copy 于 03-3月 -05

SQL> select count(*) from arch;

COUNT(*)
----------
      6166

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

模拟控制文件损坏c:\cf.cpy

还原备份的控制文件
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> recover database using backup controlfile;
ORA-00279: 更改 69868 (在 03/03/2005 12:13:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69868 对于线程 1 是按序列 # 4 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69964 (在 03/03/2005 12:14:35 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69964 对于线程 1 是按序列 # 5 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69964 (在 03/03/2005 12:14:35 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69964 对于线程 1 是按序列 # 5 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;

数据库已更改。

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     0
下一个存档日志序列   1
当前日志序列           1

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
     98656 ok
~~~~~~~~~~~~~~~~~~    
在线日志的数据丢失
使用trace可以不丢失数据

###############################################
# [测试8] 数据库在非归档模式,数据文件损坏,使用RMAN恢复
###############################################

###############################################
# [测试9] 数据库在非归档模式,数据文件损坏,使用RMAN恢复,
#         该文件的日志全部还保留在非当前在线日志和当前在线日志中
###############################################
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> alter database noarchivelog;

数据库已更改。

C:\Documents and Settings\lifeng.fang>rman nocatalog target "sys/sunsdl"

恢复管理器: 版本9.2.0.1.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.

连接到目标数据库: TESTDB (DBID=2334768642)
正在使用目标数据库控制文件替代恢复目录

RMAN> backup format 'c:\noarch_%s%p.bak' database;

启动 backup 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\NOARCH_11.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 03-3月 -05

RMAN> copy CURRENT CONTROLFILE TO 'c:\cf.cpy';

启动 copy 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 已复制当前的控制文件
输出文件名=C:\CF.CPY
完成 copy 于 03-3月 -05

SQL> archive log list
数据库日志模式             非存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
当前日志序列           3
SQL> alter database open;

数据库已更改。

SQL> create table arch (status varchar(2)) tablespace users;  --日志1

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;   --日志2

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects; --日志2

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 NO  ACTIVE
         3          4 NO  ACTIVE
        
        
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

删除user01.dbf文件

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。

RMAN> restore datafile 5;

启动 restore 于 03-3月 -05

分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00005恢复到C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段 handle=C:\NOARCH_11.BAK tag=TAG20050303T145842 params=NULL
通道 ORA_DISK_1: 恢复完成
完成 restore 于 03-3月 -05

RMAN> recover datafile 5;

启动 recover 于 03-3月 -05
使用通道 ORA_DISK_1

正在开始介质的恢复
完成介质的恢复

完成 recover 于 03-3月 -05

RMAN> alter database open;

数据库已打开

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     98656 ok

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
我们看到非归档模式,在备份数据文件后的日志如果都
还存在当前在线日志和者非当前在线日志中, 就可以
实现完全恢复,比如我们最先create table arch的日志在
日志组1中,没有被轮转覆盖,所以可以完全恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

那我们试试如果在线日志被覆盖了的情况下是否可以完全恢复.
###############################################
# [测试10] 数据库在非归档模式,数据文件损坏,使用RMAN恢复,
#         该文件的日志部分由于日志轮转被覆盖了
###############################################
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> alter database noarchivelog;

数据库已更改。

SQL> archive log list
数据库日志模式             非存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
当前日志序列           3

C:\Documents and Settings\lifeng.fang>rman nocatalog target "sys/sunsdl"

恢复管理器: 版本9.2.0.1.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.

连接到目标数据库: TESTDB (DBID=2334768642)
正在使用目标数据库控制文件替代恢复目录

RMAN>  backup format 'c:\noarch_%s%p1.bak' database;

启动 backup 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\NOARCH_111.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:26
完成 backup 于 03-3月 -05

SQL> alter database open;

数据库已更改。

SQL> create table arch (status varchar(2)) tablespace users;  --日志序列3在组1

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;  --日志序列4在组2

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select * from arch;  --日志序列5在组3

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects; --日志序列6在组1 ,把前面create table arch给覆盖了

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  ACTIVE
         2          6 NO  CURRENT
         3          4 NO  INACTIVE

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

删除user01.dbf文件

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
   
RMAN> restore datafile 5;

启动 restore 于 03-3月 -05

分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00005恢复到C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段 handle=C:\NOARCH_111.BAK tag=TAG20050303T151544 params=NULL
通道 ORA_DISK_1: 恢复完成
完成 restore 于 03-3月 -05

RMAN> recover datafile 5;

启动 recover 于 03-3月 -05
使用通道 ORA_DISK_1

正在开始介质的恢复

无法找到存档日志
存档日志线程 =1 序列=3
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 03/03/2005 15:19:27
RMAN-06054: media recovery requesting unknown log: thread 1 scn 69456

RMAN> restore datafile 1,2,3,4,5;

启动 restore 于 03-3月 -05

使用通道 ORA_DISK_1
正在略过数据文件 5; 已恢复到文件 C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
正将数据文件00002恢复到C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
正将数据文件00003恢复到C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
正将数据文件00004恢复到C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段 handle=C:\NOARCH_111.BAK tag=TAG20050303T151544 params=NULL
通道 ORA_DISK_1: 恢复完成
完成 restore 于 03-3月 -05

RMAN> recover datafile 1,2,3,4,5;

启动 recover 于 03-3月 -05
使用通道 ORA_DISK_1

正在开始介质的恢复

无法找到存档日志
存档日志线程 =1 序列=3
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 03/03/2005 15:25:01
RMAN-06054: media recovery requesting unknown log: thread 1 scn 69456

~~~~~~~~~~~~~~~~~~~
还需要备份的控制文件
~~~~~~~~~~~~~~~~~~~
还原备份的控制文件

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> recover database using backup controlfile;
ORA-00279: 更改 69456 (在 03/02/2005 10:26:30 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69456 对于线程 1 是按序列 # 3 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69456 (在 03/02/2005 10:26:30 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69456 对于线程 1 是按序列 # 3 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*),status from arch group by status;
select count(*),status from arch group by status
                            *
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以如果是非归档模式,且没有所有日志都在
当前在线日志和非当前在线日志中,那么就不
能完全恢复,而且这时要用备份的数据文件还不够
,还要备份的控制文件
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#####################################################
# [测试1] 修改日志组大小及增加日志组成员
#####################################################
日志处理恢复测试实例
ALTER DATABASE CLEAR LOGFILE GROUP <group_number>;

This statement overcomes two situations where dropping redo logs is not possible:
1.If there are only two log groups
2.The corrupt redo log file belongs to the current group.

SQL> insert into test select * from test;

已创建249744行。

SQL> select value from v$sesstat where STATISTIC#=115 and sid=11;

VALUE
----------
   7675912

SQL> insert into test select * from test;

已创建499488行。

SQL>  select value from v$sesstat where STATISTIC#=115 and sid=11;

VALUE
----------
  15258424

SQL> ALTER DATABASE ADD LOGFILE GROUP 4 ('C:\ORA81\ORA81\ORADATA\TEST\REDO04.LOG
','C:\ORA81\ORA81\ORADATA\TEST\REDO041.LOG') size 20M;

数据库已更改。

SQL> ALTER DATABASE ADD LOGFILE GROUP 5 ('C:\ORA81\ORA81\ORADATA\TEST\REDO05.LOG
','C:\ORA81\ORA81\ORADATA\TEST\REDO051.LOG') size 20M;

数据库已更改。

SQL> ALTER DATABASE ADD LOGFILE GROUP 6 ('C:\ORA81\ORA81\ORADATA\TEST\REDO06.LOG
','C:\ORA81\ORA81\ORADATA\TEST\REDO061.LOG') size 20M;
ALTER DATABASE ADD LOGFILE GROUP 6 ('C:\ORA81\ORA81\ORADATA\TEST\REDO06.LOG','C:
\ORA81\ORA81\ORADATA\TEST\REDO061.LOG') size 20M
*
ERROR 位于第 1 行:
ORA-01185: 日志文件组号6无效

SQL> l
  1* ALTER DATABASE ADD LOGFILE GROUP 6 ('C:\ORA81\ORA81\ORADATA\TEST\REDO06.LOG
','C:\ORA81\ORA81\ORADATA\TEST\REDO061.LOG') size 20M
SQL> ALTER DATABASE ADD LOGFILE GROUP 6 ('C:\ORA81\ORA81\ORADATA\TEST\REDO06.LOG
','C:\ORA81\ORA81\ORADATA\TEST\REDO061.LOG') size 20M;
ALTER DATABASE ADD LOGFILE GROUP 6 ('C:\ORA81\ORA81\ORADATA\TEST\REDO06.LOG','C:
\ORA81\ORA81\ORADATA\TEST\REDO061.LOG') size 20M
*
ERROR 位于第 1 行:
ORA-01185: 日志文件组号6无效

SQL> alter database backup controlfile to trace;

数据库已更改。

SQL> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
         1          1         94   10485760          2 YES INACTIVE
         2          1         95   10485760          2 YES ACTIVE
         3          1         96   10485760          2 NO  CURRENT
         4          1          0   20971520          2 YES UNUSED
         5          1          0   20971520          2 YES UNUSED
SQL> select * from v$logfile;

GROUP# STATUS  TYPE     MEMBER
---------- ------- -------  -------------------------------------------------------------------------------
         1         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG
         2         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO02.LOG
         3         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO03.LOG
         1 INVALID ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG
         2 INVALID ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO021.LOG
         3 INVALID ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO031.LOG
         4         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO04.LOG
         4         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO041.LOG
         5         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO05.LOG
         5         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO051.LOG

已选择10行。

SQL>

SQL> alter database drop logfile group 1;
                                        
数据库已更改。                          
                                        
SQL> alter database drop logfile group 2;
                                        
数据库已更改。                          
                                        
SQL> alter database drop logfile group 3;
                                        
数据库已更改。

SQL> select * from v$logfile;                                                  
                                                                               
    GROUP# STATUS  TYPE     MEMBER
---------- ------- -------  -------------------------------------------------------------------------------                                                                               
         4         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO04.LOG                                                                                     
         4         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO041.LOG              
         5         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO05.LOG              
         5         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO051.LOG

SQL> ALTER DATABASE ADD LOGFILE GROUP 1 ('C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG

2  ','C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG') size 20M;
ALTER DATABASE ADD LOGFILE GROUP 1 ('C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG
*
ERROR 位于第 1 行:
ORA-00301: 添加日志文件 'C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG
' 时出错 - 无法创建文件
ORA-27040: skgfrcre: 创建错误,无法创建文件
OSD-04002: 无法打开文件
O/S-Error: (OS 123) 文件名、目录名或卷标语法不正确。

这里我把原有的C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG和C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG删除,就OK了
SQL> ALTER DATABASE ADD LOGFILE GROUP 1 ('C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG
','C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG') size 20M;

数据库已更改。

SQL> ALTER DATABASE ADD LOGFILE GROUP 2 ('C:\ORA81\ORA81\ORADATA\TEST\REDO02.LOG
','C:\ORA81\ORA81\ORADATA\TEST\REDO021.LOG') size 20M;
ALTER DATABASE ADD LOGFILE GROUP 2 ('C:\ORA81\ORA81\ORADATA\TEST\REDO02.LOG','C:
\ORA81\ORA81\ORADATA\TEST\REDO021.LOG') size 20M
*
ERROR 位于第 1 行:
ORA-00301: 添加日志文件 'C:\ORA81\ORA81\ORADATA\TEST\REDO02.LOG' 时出错 -
无法创建文件
ORA-27038: skgfrcre: 文件存在
OSD-04010: 指定了 <create> 选项, 但文件已经存在

SQL> ALTER DATABASE ADD LOGFILE GROUP 2 ('C:\ORA81\ORA81\ORADATA\TEST\REDO02.LOG
','C:\ORA81\ORA81\ORADATA\TEST\REDO021.LOG') size 20M;

数据库已更改。

SQL> ALTER DATABASE ADD LOGFILE GROUP 3 ('C:\ORA81\ORA81\ORADATA\TEST\REDO03.LOG
','C:\ORA81\ORA81\ORADATA\TEST\REDO031.LOG') size 20M;

数据库已更改。

GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
         4          1        105   20971520          2 NO  CURRENT
         5          1        104   20971520          2 YES INACTIVE

SQL> alter database clear logfile group 5;

数据库已更改。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意如果这个非活动的日志组ARC状态为NO,
也就是说不能被归档,那么,要执行
ALTER DATABASE CLEAR LOGFILE UNARCHIVED GROUP 5;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意如果这时有个offline文件需要这个非
活动的日志组ARC状态为NO的日志使这个文件
带到online状态,那么在CLEAR LOGFILE时指定
这个文件的UNRECOVERABLE DATAFILE参数才行
如:
ALTER DATABASE CLEAR LOGFILE UNARCHIVED
GROUP 5 UNRECOVERABLE DATAFILE;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有时执行ALTER DATABASE CLEAR LOGFILE 会出错
原因是该日志磁盘IO损坏,那么你最好重新部署
该日志到新的路径,如使用修改了的创建控制文件语句
或者ALTER DATABASE RENAME FILE "/oracle/dbs/log_1.rdo"
TO "/temp/log_1.rdo";
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
         1          1          0   20971520          2 YES UNUSED
         2          1          0   20971520          2 YES UNUSED
         3          1          0   20971520          2 YES UNUSED
         4          1        105   20971520          2 NO  CURRENT
         5          1          0   20971520          2 YES UNUSED

SQL> alter system switch logfile;

系统已更改。

SQL> /

系统已更改。

SQL> /

系统已更改。

SQL> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
         1          1        106   20971520          2 YES INACTIVE
         2          1        107   20971520          2 YES INACTIVE
         3          1        108   20971520          2 YES INACTIVE
         4          1        105   20971520          2 YES INACTIVE
         5          1        109   20971520          2 NO  CURRENT

#########################################################
# [测试2] 当前在线日志损坏,切没有备份数据文件,使用强制打开的方式
#########################################################
SQL> select * from v$logfile;

GROUP# STATUS  TYPE     MEMBER
---------- ------- -------  -------------------------------------------------------------------------------
         1         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG
         1         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG
         2         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO02.LOG
         2         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO021.LOG
         3         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO03.LOG
         3         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO031.LOG
         4         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO04.LOG
         4         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO041.LOG
         5         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO05.LOG
         5         ONLINE   C:\ORA81\ORA81\ORADATA\TEST\REDO051.LOG

已选择10行。

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

删除C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG'
ORA-00312: 联机日志 1 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG'

SQL> select count(*) from test;
select count(*) from test
                     *
ERROR 位于第 1 行:
ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询

SQL> alter database clear logfile group 1;

数据库已更改。

这时会自动增加     'C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG'    
                   'C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG' 
两个日志文件

SQL> alter database open;

数据库已更改。

SQL>  select GROUP#,THREAD#,SEQUENCE#,MEMBERS,STATUS,ARCHIVED  from v$log;
                                                                         
    GROUP#    THREAD#  SEQUENCE#    MEMBERS STATUS           ARC         
---------- ---------- ---------- ---------- ---------------- ---         
         1          1          0          2 UNUSED           YES         
         2          1        107          2 INACTIVE         YES         
         3          1        108          2 INACTIVE         YES         
         4          1        105          2 INACTIVE         YES         
         5          1        109          2 CURRENT          NO           
        
SQL> /                                                                  
                                                               
    GROUP#    THREAD#  SEQUENCE#    MEMBERS STATUS           ARC
---------- ---------- ---------- ---------- ---------------- ---
         1          1        110          2 CURRENT          NO
         2          1        107          2 INACTIVE         YES
         3          1        108          2 INACTIVE         YES
         4          1        105          2 INACTIVE         YES
         5          1        109          2 ACTIVE           YES             
        
删除日志组5的文件

SQL> shutdown immediate                                                        
数据库已经关闭。                                                      
已经卸载数据库。                                                      
ORACLE 例程已经关闭。                                                 
SQL> startup                                                          
ORACLE 例程已经启动。                                                 
                                                                      
Total System Global Area  135338868 bytes                             
Fixed Size                   453492 bytes                             
Variable Size             109051904 bytes                             
Database Buffers           25165824 bytes                             
Redo Buffers                 667648 bytes                             
数据库装载完毕。                                                      
ORA-00313: 无法打开日志组 5 (线程 1) 的成员                           
ORA-00312: 联机日志 5 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO05.LOG'
ORA-00312: 联机日志 5 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO051.LOG'
                                                                      
                                                                      
SQL> alter database clear logfile group 5;                            
                                                                      
数据库已更改。                                                        
                                                                      
SQL> alter database open;                                             
                                                                      
数据库已更改。                                                        
                                                                      
SQL>                                                                  
SQL>                                                                  
SQL>                                                                  
SQL> select count(*) from test;                                       
                                                                      
  COUNT(*)                                                            
----------                                                            
   1997951                            
  
SQL> alter system switch logfile;                                                                           
                                                                         
系统已更改。                                                             
                                                                         
SQL>  select GROUP#,THREAD#,SEQUENCE#,MEMBERS,STATUS,ARCHIVED  from v$log;
                                                                         
    GROUP#    THREAD#  SEQUENCE#    MEMBERS STATUS           ARC         
---------- ---------- ---------- ---------- ---------------- ---         
         1          1        110          2 ACTIVE           YES         
         2          1        107          2 INACTIVE         YES         
         3          1        108          2 INACTIVE         YES         
         4          1        105          2 INACTIVE         YES         
         5          1        111          2 CURRENT          NO          
        
        
                                                                
此时用ultraedit把日志组5的两个文件编辑文件头,使他被破坏
SQL> delete test;         
delete test      
       *         
ERROR 位于第 1 行:
ORA-03113: 通信通道的文件结束

C:\>sqlplus "/as sysdba"                                               
                                                                       
SQL*Plus: Release 9.2.0.1.0 - Production on 星期五 12月 31 13:42:01 2004
                                                                       
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.    
                                                                       
已连接到空闲例程。                                                     
                                                                       
SQL>                                                                   
SQL>                                                                   
SQL>                                                                   
SQL> startup                                                           
ORACLE 例程已经启动。                                                  
                                                                       
Total System Global Area  135338868 bytes                              
Fixed Size                   453492 bytes                              
Variable Size             109051904 bytes                              
Database Buffers           25165824 bytes                              
Redo Buffers                 667648 bytes                              
数据库装载完毕。                                                       
ORA-00313: 无法打开日志组 5 (线程 1) 的成员                            
ORA-00312: 联机日志 5 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO05.LOG' 
ORA-00312: 联机日志 5 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO051.LOG'

SQL> alter database clear logfile group 5;虽然是当前数据文件
也可以用clear logfile清理后打开
SQL> alter database clear logfile group 5;
                                         
数据库已更改。                           
                                         
SQL> alter database open;                
                                         
数据库已更改。                           
                                         
SQL>                                     
SQL>                                     
SQL> select count(*) from test;          
                                         
  COUNT(*)                               
----------                               
   1997951

此时用ultraedit把日志组1的两个文件编辑,清空,使他被破坏

SQL> conn /as sysdba
已连接。
SQL> insert into test select rownum from dba_tables;

已创建614行。

SQL> insert into test select rownum from dba_tables;

已创建614行。

SQL> insert into test select rownum from dba_tables;

已创建614行。

SQL> insert into test select rownum from test;

已创建1842行。

SQL> /

已创建3684行。

SQL> /

已创建7368行。

SQL> /

已创建14736行。

SQL> /

已创建29472行。

SQL> /

已创建58944行。

SQL> /

已创建117888行。

SQL> /

已创建235776行。

SQL> /

已创建471552行。

SQL> /
insert into test select rownum from test
*
ERROR 位于第 1 行:
ORA-03113: 通信通道的文件结束
这时由于当前日志文件已经损坏,但insert又产生了很多重做造成切换,所以破坏的日志包含了要恢复的数据

SQL> conn /as sysdba
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-00316: 日志 1 (线程 1),标题中的类型 0 不是日志文件
ORA-00312: 联机日志 1 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG'
ORA-00316: 日志 1 (线程 1),标题中的类型 0 不是日志文件
ORA-00312: 联机日志 1 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG'

SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
ERROR 位于第 1 行:
ORA-01624: 线程1的紧急恢复需要日志1
ORA-00312: 联机日志 1 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG'
ORA-00312: 联机日志 1 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG'

SQL> alter database clear UNARCHIVED logfile group 1;
alter database clear UNARCHIVED logfile group 1
*
ERROR 位于第 1 行:
ORA-01624: 线程1的紧急恢复需要日志1
ORA-00312: 联机日志 1 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO01.LOG'
ORA-00312: 联机日志 1 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG'

SQL> recover database;
ORA-00283: 恢复会话因错误而取消
ORA-00316: 日志 1 (线程 1),标题中的类型 0 不是日志文件
ORA-00312: 联机日志 1 线程 1: 'C:\ORA81\ORA81\ORADATA\TEST\REDO011.LOG'

SQL> recover database until cancel;
ORA-00279: 更改 160295 (在 12/31/2004 13:51:38 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORA81\ORA81\ORADATA\TEST\ARCHIVE\1_120.DBF
ORA-00280: 更改 160295 对于线程 1 是按序列 # 120 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORA81\ORA81\ORADATA\TEST\ARCHIVE\1_120.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件1需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'C:\ORA81\ORA81\ORADATA\TEST\SYSTEM01.DBF'

SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----------------------------
spfile                               string      %ORACLE_HOME%\DATABASE\SPFILE
                                                 ORACLE_SID%.ORA

SQL> create pfile='pfiletest.ora' from spfile;

文件已创建。

SQL> create pfile='c:\pfiletest.ora' from spfile;

文件已创建。
编辑c:\pfiletest.ora
增加三个参数

_allow_resetlogs_corruption=true
_corrupted_rollback_segments=true
_offline_rollback_segments=true

SQL> shutdown immediate
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL>
SQL>
SQL> startup pfile='c:\pfiletest.ora'
ORACLE 例程已经启动。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01092: ORACLE 例程终止。强行断开连接

SQL>
SQL>
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

C:\>sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期五 12月 31 14:03:09 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

已连接到空闲例程。

SQL> startup pfile='c:\pfiletest.ora'
ORACLE 例程已经启动。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> select count(*) from test;

COUNT(*)
----------
         0

###############################################
# [测试3] 数据文件损坏,控制文件损坏,有trace ,
#         使用noresetlogs,非在线日志损坏 ,shutdown abort
###############################################

参见控制文件恢复部分

###############################################
# [测试4]      在归档模式下没有设置自动归档下,数据库挂起
###############################################
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 1M,  --修改在线日志为1M
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 1M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 1M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建

SQL> alter database open resetlogs;

数据库已更改。

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     0
下一个存档日志序列   1
当前日志序列           1

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。

SQL> alter system archive log stop;

系统已更改。

SQL> archive log list
数据库日志模式            存档模式
自动存档             禁用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     0
下一个存档日志序列   1
当前日志序列           1

SQL> alter database open;

数据库已更改。

SQL>  select count(*) from arch;

COUNT(*)
----------
    838576
   
SQL> select bytes ,segment_name from dba_segments where segment_name ='ARCH';

BYTES     SEGMENT_NAME
----------     ---------------
  11534336     ARCH 
 
SQL> delete from arch;  删除11M,但是轮转一圈日志只有3M,所以如果不手工去切换日志将挂起数据库

--这里无法删除数据
SQL> archive log list
数据库日志模式            存档模式
自动存档             禁用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
下一个存档日志序列   1
当前日志序列           3

另一个SESSION也无法插入数据
SQL> insert into arch select * from arch where rownum = 1;

在alertlog中显示
Thread 1 advanced to log sequence 2
  Current log# 1 seq# 2 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO01.LOG
Thread 1 advanced to log sequence 3
  Current log# 2 seq# 3 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 cannot allocate new log, sequence 4 --第4个日志无法被分配,因为日志1不能被覆盖
Checkpoint not complete
  Current log# 2 seq# 3 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 cannot allocate new log, sequence 4
All online logs needed archiving -->>所有的在线日志需要归档
  Current log# 2 seq# 3 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
 
SQL> select count(*) from arch;

查询也被挂气

SQL> alter system switch logfile;

还是被挂住

SQL> alter system archive log all;

系统已更改。

~~~~~~~~~~~~~~~~~~~~~~~~~~
此时日志1,2,3被归档,
alter system switch logfile;    也执行成功
select count(*) from arch;也执行成功
但是后面的在线仍然需要手工归档
~~~~~~~~~~~~~~~~~~~~~~~~~~

Thread 1 advanced to log sequence 5
  Current log# 1 seq# 5 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO01.LOG
Thread 1 cannot allocate new log, sequence 6
Checkpoint not complete
  Current log# 1 seq# 5 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO01.LOG
Thread 1 advanced to log sequence 6
  Current log# 2 seq# 6 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 cannot allocate new log, sequence 7
All online logs needed archiving
  Current log# 2 seq# 6 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
 
 
##################################################################
# [测试5] 数据库在非归档模式下,设置了自动归档,当一个事务处理的重做量大于
# 所有在线日志的大小总和时
################################################################## 
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> alter database noarchivelog;

数据库已更改。
SQL> alter database open ;

数据库已更改。

SQL> select count(*) from arch;

COUNT(*)
----------
    838576
SQL> delete from arch; 
被挂起
 
alertlog中的记录
Mon Mar 07 10:30:55 2005
Thread 1 advanced to log sequence 134
  Current log# 1 seq# 134 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO01.LOG
Mon Mar 07 10:30:55 2005
ARC0: Media recovery disabled
Mon Mar 07 10:30:55 2005
Thread 1 advanced to log sequence 135
  Current log# 2 seq# 135 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Mon Mar 07 10:30:56 2005
ARC0: Media recovery disabled
Mon Mar 07 10:30:56 2005
Thread 1 cannot allocate new log, sequence 136
Checkpoint not complete
  Current log# 2 seq# 135 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 advanced to log sequence 136
  Current log# 3 seq# 136 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO03.LOG
 
SQL> delete from arch; 
已删除838576行。
~~~~~~~~~~~~~~~~~~~~~~~~
在一个事务中可以删除大于所有在线日志的总和的数据
~~~~~~~~~~~~~~~~~~~~~~~~

##################################################################
# [测试6] 数据库在非归档模式下,设置了非自动归档,当一个事务处理的重做量大于
# 所有在线日志的大小总和时
##################################################################
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> alter system archive log stop;

系统已更改。

SQL> alter database open;

数据库已更改。

SQL> archive log list
数据库日志模式             非存档模式
自动存档             禁用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     208
当前日志序列           210

Thread 1 advanced to log sequence 237
  Current log# 2 seq# 237 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 advanced to log sequence 238
  Current log# 3 seq# 238 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO03.LOG
Thread 1 advanced to log sequence 239
  Current log# 1 seq# 239 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO01.LOG
Thread 1 advanced to log sequence 240
  Current log# 2 seq# 240 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 advanced to log sequence 241
  Current log# 3 seq# 241 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO03.LOG
Thread 1 advanced to log sequence 242
  Current log# 1 seq# 242 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO01.LOG
Thread 1 advanced to log sequence 243
  Current log# 2 seq# 243 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 advanced to log sequence 244
  Current log# 3 seq# 244 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO03.LOG
Thread 1 advanced to log sequence 245
  Current log# 1 seq# 245 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO01.LOG
Thread 1 advanced to log sequence 246
  Current log# 2 seq# 246 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 advanced to log sequence 247
  Current log# 3 seq# 247 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO03.LOG
Thread 1 advanced to log sequence 248
  Current log# 1 seq# 248 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO01.LOG
Thread 1 advanced to log sequence 249
  Current log# 2 seq# 249 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 advanced to log sequence 250
  Current log# 3 seq# 250 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO03.LOG
Thread 1 advanced to log sequence 251
  Current log# 1 seq# 251 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO01.LOG
Thread 1 advanced to log sequence 252
  Current log# 2 seq# 252 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 cannot allocate new log, sequence 253
Checkpoint not complete
  Current log# 2 seq# 252 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO02.LOG
Thread 1 advanced to log sequence 253
  Current log# 3 seq# 253 mem# 0: C:\ORACLE\ORADATA\TESTDB\REDO03.LOG
Mon Mar 07 10:38:37 2005
SMON: Parallel transaction recovery tried
Mon Mar 07 10:38:38 2005
Thread 1 cannot allocate new log, sequence 254
Checkpoint not complete

SQL> delete from arch;

已删除838576行。
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们看到最终还是可以删除

###############################################################################################
#                             [4].热备份期间的数据库崩墤(rman和常规恢复)                        #
###############################################################################################

SQL> alter tablespace users begin backup;

表空间已更改。

SQL> host copy D:\oracle\oradata\USERS01.DBF D:\oracle\oradata\oracle\USERS01.DBF
已复制         1 个文件。

SQL> conn scott/tiger
已连接。
SQL> create table empcopy as select * from emp;

表已创建。

SQL> commit;

提交完成。

SQL> alter system switch logfile;
alter system switch logfile
*
ERROR 位于第 1 行:
ORA-01031: 权限不足

SQL> conn sys/oracle as sysdba;
已连接。
SQL> alter system switch logfile;

系统已更改。

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: 文件 9 需要介质恢复
ORA-01110: 数据文件 9: 'D:\ORACLE\ORADATA\USERS01.DBF'

SQL> alter database datafile D:\ORACLE\ORADATA\USERS01.DBF end backup;
alter database datafile D:\ORACLE\ORADATA\USERS01.DBF end backup
                        *
ERROR 位于第 1 行:
ORA-02236: 无效的文件名

SQL> alter database datafile 'D:\ORACLE\ORADATA\USERS01.DBF' end backup;

数据库已更改。

SQL> alter database open;

数据库已更改。

#################################################################################
#                            [5] resetlogs 恢复测试                             #
#################################################################################

参见控制文件恢复部分

#################################################################################
#                            [6] rman Recovering Datablocks 恢复测试            #
#################################################################################

~~~~~~~~~~~
官方文档:
~~~~~~~~~~~

Recovering Individual Data Blocks
You can use RMAN to recover one or more corrupted data blocks. Typically, the corruption is reported in alert logs,
trace files or results of SQL queries. For example:

BLOCKRECOVER DATAFILE 9 BLOCK 12, 235 DATAFILE 4 BLOCK 101;

You can also use BLOCKRECOVER to repair all corrupted blocks listed in V$BACKUP_CORRUPTION and V$COPY_CORRUPTION.
These views are filled whenever RMAN performs a complete scan of a file for a backup. Run this command to repair blocks
listed in the views:

BLOCKRECOVER CORRUPTION LIST;
~~~~~~~~~~~
场景
~~~~~~~~~~~

SQL> create table empblock tablespace users as select * from emp;

表已创建。

SQL> insert into empblock select * from empblock;
  
已创建14行。
   
SQL> select owner,segment_name,tablespace_name,extent_id,file_id,block_id,blocks from dba_extents
   where segment_name='EMPBLOCK' order by block_id;

做一次数据的全库备份
RMAN> backup database;

手工地用ultraedit破坏datafile 9文件

SQL> select count(*) from empblock;
select count(*) from empblock
                     *
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号9,块号11)
ORA-01110: 数据文件 9: 'D:\ORACLE\ORADATA\USERS.DBF'

恢复坏块 

RMAN> BLOCKRECOVER DATAFILE 9 BLOCK 11;

启动 blockrecover 于 2005-03-04 11:06:32
使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00009 的块
通道 ORA_DISK_1: 已从备份段 1 恢复块
段 handle=D:\ORACLE\ORA92\DATABASE\11GEF66H_1_1 tag=TAG20050304T105409 params=NULL
通道 ORA_DISK_1: 块恢复已完成

正在开始介质的恢复
完成介质的恢复

完成 blockrecover 于 2005-03-04 11:06:44

SQL> select count(*) from empblock;

COUNT(*)
----------
    917504
   
#########################################################
#  [测试2]
#########################################################
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;

数据库已更改。

SQL> create table arch1 (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch1 select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch1 select * from arch1;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 YES ACTIVE

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

C:\Documents and Settings\lifeng.fang>oradim -delete -sid testdb

C:\Documents and Settings\lifeng.fang>oradim -new -sid testdb -intpwd sunsdl

RMAN> backup format 'c:\BLOCKRECOVER_%s%p.BAK' database;

启动 backup 于 04-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 04-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 04-3月 -05
段 handle=C:\BLOCKRECOVER_11.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:26
完成 backup 于 04-3月 -05

SQL> insert into arch select * from arch1;

已创建104822行。

SQL> select count(*),status from arch1 group by status;

COUNT(*) ST
---------- --
     12332 no
    197312 ok

SQL> select SEGMENT_NAME,HEADER_BLOCK from dba_segments where SEGMENT_NAME = 'ARCH1';
                                                    
SEGMENT_NAME                          HEADER_BLOCK   
---------------------------           ------------   
ARCH1                                        11

SQL> select to_char(11*8*1024,'xxxxxx') from dual;

TO_CHAR
-------
  16000
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我现在用ultraedit修改arch表的头块
在地址16000上进行破坏
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> INSERT INTO ARCH1 SELECT * FROM ARCH1;
INSERT INTO ARCH1 SELECT * FROM ARCH1
                                *
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号5,块号11)
ORA-01110: 数据文件 5: 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'

RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 11;

启动 blockrecover 于 04-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK

通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00005 的块
通道 ORA_DISK_1: 已从备份段 1 恢复块
段 handle=C:\BLOCKRECOVER_11.BAK tag=TAG20050304T164623 params=NULL
通道 ORA_DISK_1: 块恢复已完成

正在开始介质的恢复
完成介质的恢复

完成 blockrecover 于 04-3月 -05
 
SQL> select count(*),status from arch1 group by status;

COUNT(*) ST
---------- --
     12332 no
    197312 ok
   
         
#################################################################################
#                  [7].rman Restoring Datafile Copies to a New Host             #
#################################################################################

1. a>
        RMAN> run{ set newname for datafile 1 to '/u02/...'  ;
                   restore database; }
        SQL> alter database backup controlfile to '/u02/....' ;
2. copy datafiles & controlfie & archived log & online redo
3. b>
         pfile / spfile                      --controlfile 
         oradim -new -sid odsdb  (windows)
         orapwd
         sqlplus /nolog
         conn /as sysdba
         startup nomount                     --recreate controlfile
         alter database mount
         recover database until cancel;
        
#################################################################################
#                            [8].表空间的恢复(rman和常规恢复)                   #
#################################################################################
####################################################
#  [8.1] 非正常关机的情况下,用rman恢复单个数据文件 
####################################################

1、做一次全库备份
  
     RMAN> backup database;
    
     RMAN> report schema;

数据库方案报表
     文件 KB    表空间           RB segs 数据文件名称
     ---- ---------- -------------------- ------- -------------------
     1        419840 SYSTEM               YES     D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF
     2        204800 UNDOTBS1             YES     D:\ORACLE\ORADATA\ORACLE\UNDOTBS01.DBF
     3         20480 CWMLITE              NO      D:\ORACLE\ORADATA\ORACLE\CWMLITE01.DBF
     4         20480 DRSYS                NO      D:\ORACLE\ORADATA\ORACLE\DRSYS01.DBF
     5        152960 EXAMPLE              NO      D:\ORACLE\ORADATA\ORACLE\EXAMPLE01.DBF
     6         25600 INDX                 NO      D:\ORACLE\ORADATA\ORACLE\INDX01.DBF
     7         20480 ODM                  NO      D:\ORACLE\ORADATA\ORACLE\ODM01.DBF
     8         10240 TOOLS                NO      D:\ORACLE\ORADATA\ORACLE\TOOLS01.DBF
     9         25600 USERS                NO      D:\ORACLE\ORADATA\ORACLE\USERS01.DBF
     10        39040 XDB                  NO      D:\ORACLE\ORADATA\ORACLE\XDB01.DBF
     11       204800 SINO                 NO      D:\ORACLE\ORADATA\ORACLE\SINO.DBF
     12       204800 RCVCAT               NO      D:\ORACLE\ORADATA\ORACLE\RCVCAT.DBF
     13       409600 PERFSTAT             NO      D:\ORACLE\ORADATA\ORACLE\PERFSTAT.DBF
  
   2、显示一下系统时间
  
     SQL> select sysdate from dual;

SYSDATE
     -------------------
     2005-02-25 11:53:00
  
   3、创建一个table
  
     SQL>create table empcopy1 (id number,name varchar2(50),salary number) tablespace users;
    
   4、切换日志
  
     SQL>alter system switch logfile;
    
   5、重启机器至mount状态
  
     SQL>startup mount
    
   6、模拟删除USERS01.DBF文件,进行完全恢复
  
     RMAN> run {
     2> restore datafile 9;
     3> recover datafile 9;
     4> alter database open;
     5> }
   
----------------------------------------------------------------------------------------------------------------------------

####################################################
#  [8.2] 非正常关机情况下,非RMAN方式用备份的数据文件进行恢复              
####################################################

1、恢复前数据库状态
  
   SQL> select * from swap_p1;

ID NAME                                               HIRE_DATE               SALARY
   ---------- -------------------------------------------------- ------------------- ----------
         1002 zhang namo                                         2005-11-01 00:00:00       1200
  
  
   SQL> insert into swap_p1 select * from test;
  
   已创建7行。
  
   SQL> commit;
  
   提交完成。
  
   SQL> conn sys/oracle as sysdba
   已连接。
   SQL> alter system switch logfile;
  
   系统已更改。
  
   SQL> shutdown abort
   ORACLE 例程已经关闭。
   SQL> startup mount
   ORACLE 例程已经启动。
  
   Total System Global Area  135338868 bytes
   Fixed Size                   453492 bytes
   Variable Size             109051904 bytes
   Database Buffers           25165824 bytes
   Redo Buffers                 667648 bytes
   数据库装载完毕。
  
   2、将旧的备份数据文件拷贝到当前的数据文件位置
  
   3、恢复数据库
  
   SQL> recover database ;
   完成介质恢复。

SQL> alter database open;
  
   数据库已更改。
  
   SQL> conn scott/tiger
   已连接。
   SQL> select * from swap_p1;
  
           ID NAME                                               HIRE_DATE               SALARY
   ---------- -------------------------------------------------- ------------------- ----------
         1002 zhang namo                                         2005-11-01 00:00:00       1200
         1001 zhang xiao                                         2004-01-01 00:00:00       1200
         1007 zhang namo                                         2004-10-01 00:00:00       1200
         1008 zhang namo                                         2005-09-01 00:00:00       1200
         1002 zhang namo                                         2005-11-01 00:00:00       1200
         1003 zhang namo                                         2006-11-01 00:00:00       1200
         1005 zhang namo                                         2006-10-01 00:00:00       1200
         1006 zhang namo                                         2006-10-01 00:00:00       1200
  
   已选择8行。

----------------------------------------------------------------------------------------------------------------------------
####################################################
#  [8.3] 非正常关机情况下,恢复单独表空间            
####################################################

1、恢复前数据库状态
    
   SQL> conn scott/tiger
   已连接。
   SQL> select * from swap_p1;
  
   未选定行
  
   SQL> insert into swap_p1 select * from test;
  
   已创建7行。
  
   SQL> commit;
  
   提交完成。
  
   SQL> conn sys/oracle as sysdba
   已连接。
   SQL> shutdown abort
   ORACLE 例程已经关闭。
  
   2、将旧的备份数据文件拷贝到当前的数据文件位置
  
   3、恢复数据文件
   
   SQL> startup mount
   ORACLE 例程已经启动。
  
   Total System Global Area  135338868 bytes
   Fixed Size                   453492 bytes
   Variable Size             109051904 bytes
   Database Buffers           25165824 bytes
   Redo Buffers                 667648 bytes
   数据库装载完毕。
   SQL> alter database datafile 17 offline;
  
   数据库已更改。
  
   SQL> alter database open;
  
   数据库已更改。
  
   SQL> recover tablespace test4;
   完成介质恢复。
   SQL> alter tablespace test4 online;
  
   数据库已更改。
  
   SQL> conn scott/tiger
   已连接。
   SQL> select * from swap_p1;
  
           ID NAME                                               HIRE_DATE               SALARY
   ---------- -------------------------------------------------- ------------------- ----------
         1001 zhang xiao                                         2004-01-01 00:00:00       1200
         1007 zhang namo                                         2004-10-01 00:00:00       1200
         1008 zhang namo                                         2005-09-01 00:00:00       1200
         1002 zhang namo                                         2005-11-01 00:00:00       1200
         1003 zhang namo                                         2006-11-01 00:00:00       1200
         1005 zhang namo                                         2006-10-01 00:00:00       1200
         1006 zhang namo                                         2006-10-01 00:00:00       1200
  
   已选择7行。
####################################################
#  [8.4] 丢失数据文件,用rman从备份中还原数据文件并恢复tablespace
####################################################
 
      RMAN> backup database;
    
     RMAN> report schema;
    
     数据库方案报表
     文件        KB    表空间             RB segs   数据文件名称
     ---- ---------- -------------------- ------- -------------------
     1        419840 SYSTEM               ***     D:\ORACLE\ORADATA\SYSTEM01.DBF
     2        204800 UNDOTBS1             ***     D:\ORACLE\ORADATA\UNDOTBS01.DBF
     3         20480 CWMLITE              ***     D:\ORACLE\ORADATA\CWMLITE01.DBF
     4         20480 DRSYS                ***     D:\ORACLE\ORADATA\DRSYS01.DBF
     5        152960 EXAMPLE              ***     D:\ORACLE\ORADATA\EXAMPLE01.DBF
     6         25600 INDX                 ***     D:\ORACLE\ORADATA\INDX01.DBF
     7         20480 ODM                  ***     D:\ORACLE\ORADATA\ODM01.DBF
     8         10240 TOOLS                ***     D:\ORACLE\ORADATA\TOOLS01.DBF
     9         25600 USERS                ***     D:\ORACLE\ORADATA\USERS01.DBF
     10        39040 XDB                  ***     D:\ORACLE\ORADATA\XDB01.DBF
     11       204800 SINO                 ***     D:\ORACLE\ORADATA\SINO.DBF
     12       204800 RCVCAT               ***     D:\ORACLE\ORADATA\RCVCAT.DBF
     13       409600 PERFSTAT             ***     D:\ORACLE\ORADATA\PERFSTAT.DBF
     14        51200 TEST1                ***     D:\ORACLE\ORADATA\TEST1.DBF
     15        51200 TEST2                ***     D:\ORACLE\ORADATA\TEST2.DBF
     16        51200 TEST3                ***     D:\ORACLE\ORADATA\TEST3.DBF
     17        51200 TEST4                ***     D:\ORACLE\ORADATA\TEST4.DBF
 
 
   2、关闭数据库,删除D:\ORACLE\ORADATA\TEST4.DBF文件
  
   3、启动数据库到mount 状态
  
   4、启动rman
      D:\>rman target sys/oracle nocatalog  
     
   5、恢复tablespace test4
      从copy的备份中恢复
     
   RMAN> run {
   2> allocate channel c1 device type disk maxpiecesize=6000M ;
   3> restore datafile 17 from datafilecopy;
   4> recover tablespace  test4;
   5> alter database open;
   6> release channel c1; }

####################################################  
# [8.5] 重建controlfile文件时,丢失所有在线日志,语句少写了表空间的datafile
####################################################

~~~~~~~~~
~~ 场景
~~~~~~~~~
RMAN> report schema;

数据库方案报表
文件 KB    表空间           RB segs 数据文件名称
---- ---------- -------------------- ------- -------------------
1             0 SYSTEM               ***     D:\ORACLE\ORADATA\SYSTEM01.DBF
2        204800 UNDOTBS1             ***     D:\ORACLE\ORADATA\UNDOTBS01.DBF
3         20480 CWMLITE              ***     D:\ORACLE\ORADATA\CWMLITE01.DBF
4         20480 DRSYS                ***     D:\ORACLE\ORADATA\DRSYS01.DBF
5        152960 EXAMPLE              ***     D:\ORACLE\ORADATA\EXAMPLE01.DBF
6         25600 INDX                 ***     D:\ORACLE\ORADATA\INDX01.DBF
7         20480 ODM                  ***     D:\ORACLE\ORADATA\ODM01.DBF
8         10240 TOOLS                ***     D:\ORACLE\ORADATA\TOOLS01.DBF
9         25600 USERS                ***     D:\ORACLE\ORADATA\USERS01.DBF
10        39040 XDB                  ***     D:\ORACLE\ORADATA\XDB01.DBF
11       204800 SINO                 ***     D:\ORACLE\ORADATA\SINO.DBF
12       204800 RCVCAT               ***     D:\ORACLE\ORADATA\RCVCAT.DBF
13       409600 PERFSTAT             ***     D:\ORACLE\ORADATA\PERFSTAT.DBF
14            0 TEST1                ***     D:\ORACLE\ORA92\DATABASE\MISSING00014
15            0 TEST2                ***     D:\ORACLE\ORA92\DATABASE\MISSING00015
16            0 TEST3                ***     D:\ORACLE\ORA92\DATABASE\MISSING00016
17            0 TEST4                ***     D:\ORACLE\ORA92\DATABASE\MISSING00017

由于redo文件损坏,致使数据库无法正常启动,DBA用重建control文件的方法,使数据库重启,但是没有把14-17datafile文件的名子写在control
文件中,这样,启动数据库后出现上面的结果,在用rman备份数据库文件时,出现错误:

RMAN> backup database;

启动 backup 于 2005-03-03 09:34:57
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 03/03/2005 09:34:57
RMAN-06004: ORACLE error from recovery catalog database: RMAN-20003: target database incarnation not found in recovery catalog

~~~~~~~~~
~~ 恢复数据文件14-17
~~~~~~~~~

1、重命名数据文件
      SQL> ALTER DATABASE OPEN RESETLOGS;
          
      SQL> alter database rename file 'D:\ORACLE\ORA92\DATABASE\MISSING00014' to 'd:\oracle\oradata\test1.dbf';

数据库已更改。
     
      SQL> alter database rename file 'D:\ORACLE\ORA92\DATABASE\MISSING00015' to 'd:\oracle\oradata\test2.dbf';
     
      数据库已更改。
     
      SQL> alter database rename file 'D:\ORACLE\ORA92\DATABASE\MISSING00016' to 'd:\oracle\oradata\test3.dbf';
     
      数据库已更改。
     
      SQL> alter database rename file 'D:\ORACLE\ORA92\DATABASE\MISSING00017' to 'd:\oracle\oradata\test4.dbf';
     
      数据库已更改。

2、用rman备份数据库
  
      RMAN> reset database;

在恢复目录中注册的数据库的新实体化
      正在启动全部恢复目录的 resync
      完成全部 resync
     
      MAN> backup database;

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

####################################################
#  [8.6] 用rman从备份中恢复system表空间
####################################################

  方法一:
   1、做一次全库备份
  
   2、恢复system表空间
     STARTUP MOUNT
     RMAN> run {
     2> restore datafile 1;
     3> recover datafile 1;
     4> alter database open;
     5> }
    
    
  方法二:
   1、做一次全库备份
  
   2、恢复system表空间
  
     RMAN> run {
     2> restore tablespace system;
     3> recover tablespace system;
     4> alter database open;
     5> }
    
####################################################
#  [8.7] 用户表空间损坏
####################################################
一)用户表空间
错误:
在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,
在关闭数据库(使用shutdown normal或shutdown immediate) 时将导致错误ORA
-01116,ORA-01110以及操作系统级错误ORA-07368
解决:
以下有两种解决方案:
1.用户的表空间可以被轻易地重建
即最近导出的对象是可用的或表空间中的对象可以被轻易地重建等.在
这种情况下,最简单的方法是offline并删除该数据文件,删除表空间并
重建表空间以及所有的对象.
svrmgrl> startup mount
svrmgrl> alter database datafile filename offline drop;
svrmgrl> alter database open;
svrmgrl> drop tablespace tablespace_name including contents;
重建表空间及所有对象.
2.用户的表空间不能够被轻易地重建
在大多数情况下,重建表空间是不可能及太辛苦的工作.方法是倒备份及做介
质恢复.如果您的系统运行在NOARCHIVELOG模式下,则只有丢失的数据
在online redo log中方可被恢复。
步骤如下:
1)Restore the lost datafile from a backup
2)svrmgrl> startup mount
3)svrmgrl> select v1.group#,member,sequence#,first_change#
>from v$log v1,v$logfile v2 where v1.group#=v2.group#;
4)如果数据库运行在NOARCHIVELOG模式下则:
svrmgrl> select file#,change# from v$recover_file;
如果 CHANGE# 大于最小的FIRST_CHANGE#则数据文件可以被恢复。
如果 CHANGE# 小于最小的FIRST_CHANGE#则数据文件不可恢复。 恢复最近一
次的全备份或采用方案一.
5)svrmgrl> recover datafile filename;
6)确认恢复成功
7)svrmgrl> alter database open resetlogs;
3.只读表空间无需做介质恢复,只要将备份恢复即可.唯一的例外是:
表空间在最后一次备份后被改为read-write 模式
表空间在最后一次备份后被改为read-only 模式
在这种情况下,均需进行介质恢复

二)临时表空间
临时表空间并不包含真正的数据,恢复的方法是删除临时表空间并重建即可.

三)系统表空间
如果备份不可用,则只能采用重建数据库的方法

######################################################################################
#                                [9].回滚段恢复                                      #
######################################################################################

参见1013221.6
28812.1
################################
# [9.1].正常shutdown,回滚数据文件丢失,
#       有备份,回滚段恢复
################################

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
下一个存档日志序列   3
当前日志序列           3

SQL> select us#, name, status$ from undo$;

US# NAME                              STATUS$
---------- ------------------------------ ----------
         0 SYSTEM                                  3
         1 _SYSSMU1$                               3
         2 _SYSSMU2$                               3
         3 _SYSSMU3$                               3
         4 _SYSSMU4$                               3
         5 _SYSSMU5$                               3
         6 _SYSSMU6$                               3
         7 _SYSSMU7$                               3
         8 _SYSSMU8$                               3
         9 _SYSSMU9$                               3
        10 _SYSSMU10$                              3

已选择11行。

SQL> select SEGMENT_NAME,STATUS from dba_rollback_segs;

SEGMENT_NAME                   STATUS
------------------------------ ----------------
SYSTEM                         ONLINE
_SYSSMU1$                      ONLINE
_SYSSMU2$                      ONLINE
_SYSSMU3$                      ONLINE
_SYSSMU4$                      ONLINE
_SYSSMU5$                      ONLINE
_SYSSMU6$                      ONLINE
_SYSSMU7$                      ONLINE
_SYSSMU8$                      ONLINE
_SYSSMU9$                      ONLINE
_SYSSMU10$                     ONLINE

已选择11行。

RMAN>  backup format 'c:\noarch_%s%p1.bak' database;

启动 backup 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\NOARCH_211.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 03-3月 -05

RMAN>

RMAN>

RMAN> copy current controlfile to 'c:\currcont.ctl';

启动 copy 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 已复制当前的控制文件
输出文件名=C:\CURRCONT.CTL
完成 copy 于 03-3月 -05

RMAN> exit

恢复管理器完成。

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE

SQL> shutdown  -->>这里是正常shutdown,所以会做检查点,当前的数据文件不需要恢复状态
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

~~~~~~~~~~~~~~~~~~~~~~~~
模拟删除UNDOTBS01.DBF
这时其他文件都是一致性的,
只需要UNDOTBS01.DBF恢复
~~~~~~~~~~~~~~~~~~~~~~~~
删除UNDOTBS01.DBF
还原一个UNDOTBS01.DBF的备份

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-01113: 文件 2 需要介质恢复
ORA-01110: 数据文件 2: 'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF'

SQL> recover database ;
完成介质恢复。

SQL> alter database open;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     98656 ok
    
    
################################
# [9.2].shutdown abort(或者使用了别的老的数据文件),
#       回滚数据文件丢失,有备份,回滚段恢复 ,
#       数据库没有活动事务
################################
略:
也能完全恢复
~~~~~~~~~~~~~~~~~~~~~~
虽然是abort,但是只是需要做一个检查点,
将数据写到数据文件中,但这部分数据直接
在在线日志中可以拿到了,只需要前滚,
不需要进行回滚
~~~~~~~~~~~~~~~~~~~~~~

################################
# [9.3].shutdown abort(或者使用了别的老的数据文件),
#       回滚数据文件丢失,有备份,回滚段恢复 ,
#       数据库有活动事务
################################

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            C:\oracle\oradata\testdb\archive
最早的概要日志序列     1
下一个存档日志序列   3
当前日志序列           3

RMAN>  backup format 'c:\noarch_%s%p1.bak' database;

启动 backup 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 03-3月 -05
段 handle=C:\NOARCH_211.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 03-3月 -05

RMAN>

RMAN>

RMAN> copy current controlfile to 'c:\currcont.ctl';

启动 copy 于 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 已复制当前的控制文件
输出文件名=C:\CURRCONT.CTL
完成 copy 于 03-3月 -05

RMAN> exit

恢复管理器完成。

SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects; --这里没有commit

已创建6166行。

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE

SQL> shutdown  abort-->>这里是正常shutdown,所以会做检查点,当前的数据文件不需要恢复状态
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

~~~~~~~~~~~~~~~~~~~~~~~~
模拟删除UNDOTBS01.DBF
这时其他文件都是一致性的,
只需要UNDOTBS01.DBF恢复
~~~~~~~~~~~~~~~~~~~~~~~~
删除UNDOTBS01.DBF
还原一个UNDOTBS01.DBF的备份

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-01113: 文件 2 需要介质恢复
ORA-01110: 数据文件 2: 'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF'

SQL> recover database ;
完成介质恢复。

SQL> alter database open;

数据库已更改。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
     98656 ok 
    
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8i如果有活动的事务,那么恢复回滚表空间时,
在前滚后后滚时要读自己回滚段里的数据,
而自己的数据文件已经损坏了,所以就不允许的,
所以在mount前将初始化参数
rollback_segments=(system)
_corrupted_rollback_segments=(rbs0,rbs1,rbs2……)
而9I,测试中回撤表空间数据文件恢复跟常规表空间恢复一样
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

################################
# [9.4].shutdown abort(或者使用了别的老的数据文件),
#       回滚数据文件丢失,没有备份,回滚段恢复 ,
#       数据库有活动事务
################################
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL>
丢失undo文件
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF' offline;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> select US#,NAME,ts#,STATUS$,FLAGS from undo$ where STATUS$ <> 3;

US# NAME                                  TS#    STATUS$      FLAGS
---------- ------------------------------ ---------- ---------- ----------
         1 _SYSSMU1$                               1          2
         2 _SYSSMU2$                               1          2
         3 _SYSSMU3$                               1          2
         4 _SYSSMU4$                               1          2
         5 _SYSSMU5$                               1          2
         6 _SYSSMU6$                               1          2
         7 _SYSSMU7$                               1          2
         8 _SYSSMU8$                               1          2
         9 _SYSSMU9$                               1          2
        10 _SYSSMU10$                              1          2
        11 _SYSSMU11$                              1          5

SQL> select count(*) from arch;  --这里表是不能读取一致性了
select count(*) from arch
                     *
ERROR 位于第 1 行:
ORA-00376: ???????? 2
ORA-01110: ???? 2: 'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF'

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>

编辑INITtestdb_undo.ORA'
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
_allow_resetlogs_corruption=true
_corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU11$)
_offline_rollback_segments=true

SQL> startup pfile='C:\oracle\ora92\database\INITtestdb_undo.ORA';
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes

SQL> alter database open;

数据库已更改。

SQL> select count(*) from arch;

COUNT(*)
----------
    104822

再创建新的undo表空间
drop 坏的undo tablespace

最好做一个整库的导出,并导入到新系统

################################
# [9.5].shutdown abort(或者使用了别的老的数据文件),
#       回滚数据文件丢失,没有备份,但控制文件有创建
#       该回撤段数据文件的所有历史日志,回滚段恢复 ,
#       数据库有活动事务
################################
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     10800
undo_suppress_errors                 boolean     FALSE
undo_tablespace                      string      UNDOTBS1
SQL> alter tablespace UNDOTBS1 add datafile 'C:\ORACLE\ORADATA\TESTDB\UNDOTBS02
DBF' size 1m;

表空间已更改。

SQL>
SQL>
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> SHUTDOWN ABORT
ORACLE 例程已经关闭。

删除UNDOTBS02

SQL> STARTUP
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'C:\ORACLE\ORADATA\TESTDB\UNDOTBS02.DBF'

SQL> ALTER DATABASE CREATE DATAFILE 'C:\ORACLE\ORADATA\TESTDB\UNDOTBS02.DBF';

数据库已更改。

SQL> RECOVER DATABASE;
完成介质恢复。
SQL> ALTER DATABASE OPEN;

数据库已更改。

SQL> COL NAME FORMAT A50;
SQL> SELECT NAME,STATUS FROM V$DATAFILE;

NAME                                               STATUS
-------------------------------------------------- -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF              SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF             ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\UNDOTBS02.DBF             ONLINE

已选择6行。

################################
# [9.6].数据库打开时回撤表空间文件
#       损坏,没有备份
################################

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES INACTIVE
         3          4 YES ACTIVE

SQL>
SQL>
SQL>
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES INACTIVE
         3          4 YES ACTIVE

SQL> select us#, name, status$ from undo$;

US# NAME                              STATUS$
---------- ------------------------------ ----------
         0 SYSTEM                                  3
         1 _SYSSMU1$                               3
         2 _SYSSMU2$                               3
         3 _SYSSMU3$                               3
         4 _SYSSMU4$                               3
         5 _SYSSMU5$                               3
         6 _SYSSMU6$                               3
         7 _SYSSMU7$                               3
         8 _SYSSMU8$                               3
         9 _SYSSMU9$                               3
        10 _SYSSMU10$                              3

已选择11行。

SQL> select SEGMENT_NAME,STATUS from dba_rollback_segs;

SEGMENT_NAME                   STATUS
------------------------------ ----------------
SYSTEM                         ONLINE
_SYSSMU1$                      ONLINE
_SYSSMU2$                      ONLINE
_SYSSMU3$                      ONLINE
_SYSSMU4$                      ONLINE
_SYSSMU5$                      ONLINE
_SYSSMU6$                      ONLINE
_SYSSMU7$                      ONLINE
_SYSSMU8$                      ONLINE
_SYSSMU9$                      ONLINE
_SYSSMU10$                     ONLINE

已选择11行。

SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     10800
undo_suppress_errors                 boolean     FALSE
undo_tablespace                      string      UNDOTBS1

~~~~~~~~~~~~~~~~~~~~~
这里模拟回撤数据文件损坏
~~~~~~~~~~~~~~~~~~~~~
用ultraedit破坏UNDOTBS01.DBF

SQL> shutdown --因为要使用回滚,但回滚失败
ORA-00603: ORACLE 服务器会话因致命错误而终止

SQL> startup
ORA-24324: 未初始化服务句柄
ORA-01041: 内部错误,hostdef 扩展名不存在
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期五 3月 4 14:18:35 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

已连接。
SQL> startup
ORA-01081: cannot start already-running ORACLE - shut it down first
SQL> shutdown
ORA-01090: shutdown in progress - connection is not permitted
SQL> shutdown abort  --只有abort才可以关闭数据库,因为不需要回滚
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select SEGMENT_NAME,STATUS from dba_rollback_segs;

SEGMENT_NAME                   STATUS
------------------------------ ----------------
SYSTEM                         ONLINE
_SYSSMU1$                      NEEDS RECOVERY
_SYSSMU2$                      NEEDS RECOVERY
_SYSSMU3$                      NEEDS RECOVERY
_SYSSMU4$                      NEEDS RECOVERY
_SYSSMU5$                      NEEDS RECOVERY
_SYSSMU6$                      NEEDS RECOVERY
_SYSSMU7$                      NEEDS RECOVERY
_SYSSMU8$                      NEEDS RECOVERY
_SYSSMU9$                      NEEDS RECOVERY
_SYSSMU10$                     NEEDS RECOVERY

SQL> select us#, name, status$ from undo$;

US# NAME                              STATUS$
---------- ------------------------------ ----------
         0 SYSTEM                                  3
         1 _SYSSMU1$                               5
         2 _SYSSMU2$                               5
         3 _SYSSMU3$                               5
         4 _SYSSMU4$                               5
         5 _SYSSMU5$                               5
         6 _SYSSMU6$                               5
         7 _SYSSMU7$                               5
         8 _SYSSMU8$                               5
         9 _SYSSMU9$                               5
        10 _SYSSMU10$                              5

已选择11行。

~~~~~~~~~~~~~~~~~~~~~
这里我们注意能够打开数据库
但是这里状态是需要恢复
~~~~~~~~~~~~~~~~~~~~~~
SQL> create pfile='c:\undopfile.ora' from spfile;

文件已创建。

SQL> create undo tablespace UNDOTBS2 datafile 'C:\oracle\oradata\testdb\UNDOTB2.DBF' size 50m;

表空间已创建。

SQL> select count(*),status from arch group by status;

COUNT(*) ST
---------- --
      6166 no
     98656 ok
    
SQL> insert into arch select 'af' from dba_objects;
insert into arch select 'af' from dba_objects
            *
ERROR 位于第 1 行:
ORA-01552: 非系统表空间'USERS'无法使用系统回退段

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
编辑c:\undopfile.ora,
将设置*.undo_tablespace='UNDOTBS2'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> startup pfile='c:\undopfile.ora'

ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL>  insert into arch select 'af' from dba_objects;

已创建6166行。

SQL> select
  2        trunc(id1/power(2,16)) rbs,
  3        bitand(id1,to_number('ffff','xxxx'))+0 slot,
  4        id2 seq,
  5        lmode,request
  6   from v$lock,v$session
  7  where v$lock.type = 'TX'
  8    and v$lock.sid = v$session.sid
  9    and v$session.username is not null;

RBS       SLOT        SEQ      LMODE    REQUEST
---------- ---------- ---------- ---------- ----------
        17          0          2          6          0

SQL> select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_rollback_segs;

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU1$                      UNDOTBS1                       NEEDS RECOVERY
_SYSSMU2$                      UNDOTBS1                       NEEDS RECOVERY
_SYSSMU3$                      UNDOTBS1                       NEEDS RECOVERY
_SYSSMU4$                      UNDOTBS1                       NEEDS RECOVERY
_SYSSMU5$                      UNDOTBS1                       NEEDS RECOVERY
_SYSSMU6$                      UNDOTBS1                       NEEDS RECOVERY
_SYSSMU7$                      UNDOTBS1                       NEEDS RECOVERY
_SYSSMU8$                      UNDOTBS1                       NEEDS RECOVERY
_SYSSMU9$                      UNDOTBS1                       NEEDS RECOVERY
_SYSSMU10$                     UNDOTBS1                       NEEDS RECOVERY

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11$                     UNDOTBS2                       ONLINE
_SYSSMU12$                     UNDOTBS2                       ONLINE
_SYSSMU13$                     UNDOTBS2                       ONLINE
_SYSSMU14$                     UNDOTBS2                       ONLINE
_SYSSMU15$                     UNDOTBS2                       ONLINE
_SYSSMU16$                     UNDOTBS2                       ONLINE
_SYSSMU17$                     UNDOTBS2                       ONLINE
_SYSSMU18$                     UNDOTBS2                       ONLINE
_SYSSMU19$                     UNDOTBS2                       ONLINE
_SYSSMU20$                     UNDOTBS2                       ONLINE

SQL> select US#,NAME,ts#,STATUS$,FLAGS from undo$;

US# NAME                                  TS#    STATUS$      FLAGS
---------- ------------------------------ ---------- ---------- ----------
         0 SYSTEM                                  0          3
         1 _SYSSMU1$                               1          5
         2 _SYSSMU2$                               1          5
         3 _SYSSMU3$                               1          5
         4 _SYSSMU4$                               1          5
         5 _SYSSMU5$                               1          5
         6 _SYSSMU6$                               1          5
         7 _SYSSMU7$                               1          5
         8 _SYSSMU8$                               1          5
         9 _SYSSMU9$                               1          5
        10 _SYSSMU10$                              1          5

US# NAME                                  TS#    STATUS$      FLAGS
---------- ------------------------------ ---------- ---------- ----------
        11 _SYSSMU11$                              6          3
        12 _SYSSMU12$                              6          3
        13 _SYSSMU13$                              6          3
        14 _SYSSMU14$                              6          3
        15 _SYSSMU15$                              6          3
        16 _SYSSMU16$                              6          3
        17 _SYSSMU17$                              6          3  --插入数据的回滚信息在这
        18 _SYSSMU18$                              6          3
        19 _SYSSMU19$                              6          3
        20 _SYSSMU20$                              6          3

已选择21行。

这些非online的回撤段也需要在初始化参数中强制_corrupted_rollback_segments
且_offline_rollback_segments=true

这里跟9.4一样,设置初始化文件
编辑INITtestdb_undo.ORA'
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
_allow_resetlogs_corruption=true
_corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU11$)
_offline_rollback_segments=true

然后打开数据库

看看TOM的例子
sys@ORA920.US.ORACLE.COM> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.

sys@ORA920.US.ORACLE.COM> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

[ora920@tkyte-pc-isdn ora920]$ ls
control01.ctl  cwmlite01.dbf  indx01.dbf  redo02.log  redo0B.log    temp01.dbf  
  users01.dbf
control02.ctl  drsys01.dbf    odm01.dbf   redo03.log  redo0C.log    tools01.dbf 
  xdb01.dbf
control03.ctl  example01.dbf  redo01.log  redo0A.log  system01.dbf 
undotbs01.dbf

[ora920@tkyte-pc-isdn ora920]$ mv undotbs01.dbf undotbs01.dbf.xxx

[ora920@tkyte-pc-isdn ora920]$ sqlplus /nolog

SQL*Plus: Release 9.2.0.1.0 - Production on Sat Sep 28 08:33:29 2002

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

idle> connect / as sysdba
Connected to an idle instance.
idle> startup
ORACLE instance started.

Total System Global Area  143725064 bytes
Fixed Size                   451080 bytes
Variable Size             109051904 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2:
'/usr/oracle/ora920/OraHome1/oradata/ora920/undotbs01.dbf'

idle> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     10800
undo_suppress_errors                 boolean     FALSE
undo_tablespace                      string      UNDOTBS1

idle> alter system set undo_management = manual scope=spfile;

System altered.

Note: disabling the undo tablespace here, this'll let us go back to "rollback
segments" and we'll use the system RBS to get back on our feet

idle> shutdown
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.

idle> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

[ora920@tkyte-pc-isdn ora920]$ !sql
sqlplus /nolog

SQL*Plus: Release 9.2.0.1.0 - Production on Sat Sep 28 08:35:34 2002

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

idle> connect / as sysdba;
Connected to an idle instance.
idle> startup
ORACLE instance started.

Total System Global Area  143725064 bytes
Fixed Size                   451080 bytes
Variable Size             109051904 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2:
'/usr/oracle/ora920/OraHome1/oradata/ora920/undotbs01.dbf'

Note: we still have to get rid of that thing..

idle> alter database datafile 
'/usr/oracle/ora920/OraHome1/oradata/ora920/undotbs01.dbf'
  2  offline drop;

Database altered.

idle> alter database open;

Database altered.

idle> drop tablespace undotbs1;

Tablespace dropped.

idle> create UNDO tablespace undotbs1
  2  datafile '/usr/oracle/ora920/OraHome1/oradata/ora920/undotbs01.dbf' size
25m
  3  autoextend on next 1m maxsize 1024m;

Tablespace created.

idle> alter system set undo_management = auto scope=spfile;

System altered.

Now, we've put the undo tablespace "back" by creating a new one.  Just
bounce...

idle> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

######################################################################################
#                        [10]. 数据库基于时间点的不完全恢复      
######################################################################################
**********************************************
   [10.1] 所有数据文件基于时间点的不完全恢复测试:
**********************************************

incremental backup database :
  
   1、做一次level 0级的备份
  
     RMAN> backup incremental level 0 database;
  
   2、在sqlplus建立empcopy表
  
     SQL>create table empcopy as select * from emp;
  
   3、做一次level 1级的备份
  
     RMAN>backup incremental level 1 database;
  
   4、查看一下系统时间
  
     SQL> select sysdate from dual;
  
     SYSDATE
     -------------------
     2005-02-17 15:01:20
  
   5、切换日志
  
     SQL>alter system switch logfile;
  
   6、模拟不完全恢复
  
     SQL>drop table empcopy;
  
   7、关闭数据库
  
     SQL>shutdown immediate
  
   8、将数据库启动到mount状态
  
     SQL>startup mount
  
   9、启动rman
  
     c:>rman target sys/oracle nocatalog;
  
   10、进行不完全恢复
    
     恢复archive log 文件:
     RMAN> run {
       allocate channel test type disk;
       SET ARCHIVELOG DESTINATION TO 'D:\oracle\oradata\archive';
       RESTORE ARCHIVELOG ALL;
       release channel test;
     }

恢复controlfile文件:
     RMAN> run {
    allocate channel test type disk;
    restore controlfile to 'd:\control.ctl';
       release channel test;
   }
    
     恢复数据文件:
     RMAN> run {
        -- set newname for datafile 1 to '...'  ;
        set until time="to_date('2007-06-08 14:25:18','yyyy-mm-dd hh24:mi:ss')" ;                                                                          
        restore database;
        recover database;
        alter database open resetlogs;
        }
  
   11、数据库恢复成功
  
     SQL> select table_name from user_tables;
    
     TABLE_NAME
     ------------------------------
     BONUS
     DEPT
     EMP
     EMPCOPY
     EMPCOPY1
     EMPCOPY2
     EMPCOPY3
     EMPCOPY4
     SALGRADE
    
     注意:需要所有的archivelog 文件及所有的备份文件
    
   11、重新注册rman
  
     RMAN> register database;
     RMAN> list incarnation of database;
     RMAN> reset database;
     RMAN> list incarnation of database;
    
    
----------------------------------------------------------------------------------------------------------------------------

####################################################
#   [10.2] TSPITR测试,单独表空间数据文件基于时间点的恢复测试:
####################################################

测试1

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;

数据库已更改。

SQL> create table arch1 (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch1 select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch1 select * from arch1;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES INACTIVE
         3          4 YES ACTIVE

SQL> alter database backup controlfile to 'c:\backup.ctl';

数据库已更改。

SQL> select count(*) from arch1;

COUNT(*)
----------
     98656

SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2005-03-07:15:46:17

alter system switch logfile;

系统已更改。
-->>这一步很重要,如果没有在时间点恢复时应用归档,那么我们只能拷贝在线日志去恢复了,否则会出现system01.dbf没有恢复的错误

SQL> drop table arch1;

表已丢弃。

SQL> create table salgrade (grade number,losal number,hisal number) tablespace users;

表已创建。

SQL> select owner,name,tablespace_name,
  2         to_char(creation_time,'YYYY-MM-DD:HH24:MI:SS')
  3    from sys.ts_pitr_objects_to_be_dropped
  4   where tablespace_name in ('USERS')
  5     and creation_time > to_date('2005-03-07:15:46:17','YYYY-MM-DD:HH24:MI:SS')
  6    order by tablespace_name, creation_time;

OWNER                          NAME                        
------------------------------ ----------------------------------------
TABLESPACE_NAME                TO_CHAR(CREATION_TI         
------------------------------ -------------------         
SYS                            SALGRADE                    
USERS                          2005-03-07:15:46:36

SQL> alter tablespace users offline for recover;

表空间已更改。

~~~~~~~~~~~~~~~~
克隆数据库
~~~~~~~~~~~~~~~~

oradim -new -sid clone -intpwd clone

set oracle_sid=clone
创建初始化文件initCLONE.ora
增加*.lock_name_space=CLONE
注意db_name跟主数据库一样
归档路径也可以一样,以便于恢复时使用默认的路径

SQL> create pfile='C:\oracle\ora92\database\initCLONE.ora' from spfile;

文件已创建。

shutdown

set ORACLE_SID=CLONE

C:\Documents and Settings\lifeng.fang>sqlplus "sys/clone as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期一 3月 7 17:18:51 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

已连接到空闲例程。

SQL> startup nomount pfile='C:\oracle\ora92\database\initCLONE.ora'
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes

--重新建立数据库controlfile, 要添加set database new_instancename
CREATE CONTROLFILE REUSE SET DATABASE "RMSQAS" RESETLOGS  ARCHIVELOG    --set
    MAXLOGFILES 64
    MAXLOGMEMBERS 2
    MAXDATAFILES 1024
    MAXINSTANCES 1
    MAXLOGHISTORY 453
LOGFILE
  GROUP 1 (
    '/oradata/RMSQAS/data/RMSPRD_redo01a.log',
    '/oradata/RMSQAS/data/RMSPRD_redo01b.log'
  ) SIZE 250M,
  GROUP 2 (
    '/oradata/RMSQAS/data/RMSPRD_redo02a.log',
    '/oradata/RMSQAS/data/RMSPRD_redo02b.log'
  ) SIZE 250M,
  GROUP 3 (
    '/oradata/RMSQAS/data/RMSPRD_redo03a.log',
    '/oradata/RMSQAS/data/RMSPRD_redo03b.log'
  ) SIZE 250M
DATAFILE

SQL> alter database mount clone database;

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------

C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF

SQL> alter database rename file 'c:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'  to 'c:\
ORACLE\ORADATA\CLONE\SYSTEM01.DBF' ;

数据库已更改。

SQL> alter database rename file 'c:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF' to 'c:\
ORACLE\ORADATA\CLONE\UNDOTBS01.DBF';

数据库已更改。

SQL> alter database rename file 'c:\ORACLE\ORADATA\TESTDB\INDX01.DBF'    to 'c:\
ORACLE\ORADATA\CLONE\INDX01.DBF'   ;

数据库已更改。

SQL> alter database rename file 'c:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF'   to 'c:\
ORACLE\ORADATA\CLONE\TOOLS01.DBF'  ;

数据库已更改。

SQL> alter database rename file 'c:\ORACLE\ORADATA\TESTDB\USERS01.DBF'   to 'c:\
ORACLE\ORADATA\CLONE\USERS01.DBF'  ;

数据库已更改。

SQL>
SQL>
SQL> alter database datafile 'C:\ORACLE\ORADATA\CLONE\SYSTEM01.DBF' online;

数据库已更改。

SQL> alter database datafile 'C:\ORACLE\ORADATA\CLONE\UNDOTBS01.DBF'  online;

数据库已更改。

SQL> alter database datafile 'C:\ORACLE\ORADATA\CLONE\INDX01.DBF'     online;

数据库已更改。

SQL> alter database datafile 'C:\ORACLE\ORADATA\CLONE\TOOLS01.DBF'    online;

数据库已更改。

SQL> alter database datafile 'C:\ORACLE\ORADATA\CLONE\USERS01.DBF'  online;

数据库已更改。

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL TIME '2005-03-07:16:57:31';

ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69556 (在 03/07/2005 16:45:42 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69556 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69601 (在 03/07/2005 16:45:43 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69601 对于线程 1 是按序列 # 5 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

已应用的日志。
完成介质恢复。

--在clone库exp该表空间

alter tablespace users read only;

exp SYS/clone FILE=expat.dmp TRANSPORT_TABLESPACE=y TABLESPACES=(users) TTS_FULL_CHECK=y

把users.dbf数据文件拷贝到 C:\ORACLE\ORADATA\CLONE\USERS01.DBF ,并且把expat.dmp拷贝到target

在主数据库中
DROP TABLESPACE users INCLUDING CONTENTS and datafiles;

在主库
imp TRANSPORT_TABLESPACE=y FILE=expat.dmp DATAFILES=('C:\ORACLE\ORADATA\CLONE\USERS01.DBF')

alter tablespace users read write;

####################################################
   [10.2] 单独表空间数据文件基于时间点的恢复测试:
####################################################

1、做一次全库冷备份,将所有数据文件从 D:\oracle\oradata 拷贝至 D:\oracle\oradata\oracle 目录下
  
       SQL> alter database backup controlfile to 'd:\oracle\oradata\oracle\control.ctl';
     
   2、显示系统时间
  
       SQL> select sysdate from dual;

SYSDATE
       -------------------
       2005-02-28 10:26:05
      
       SQL> select name,status from v$datafile;

NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\SYSTEM01.DBF                     SYSTEM
        D:\ORACLE\ORADATA\UNDOTBS01.DBF                    ONLINE
        D:\ORACLE\ORADATA\CWMLITE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\DRSYS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\EXAMPLE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\INDX01.DBF                       ONLINE
        D:\ORACLE\ORADATA\ODM01.DBF                        ONLINE
        D:\ORACLE\ORADATA\TOOLS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\USERS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\XDB01.DBF                        ONLINE
        D:\ORACLE\ORADATA\SINO.DBF                         ONLINE
        D:\ORACLE\ORADATA\RCVCAT.DBF                       ONLINE
        D:\ORACLE\ORADATA\PERFSTAT.DBF                     ONLINE
       
        已选择13行。
      
   3、执行 drop table empcopysystem;
  
   4、执行 create table empcopy tablespace users as select * from emp;
  
   5、执行 select table_name,tablespace_name from user_tables;  
  
   6、执行 alter tablespace users offline;
  
   7、执行 alter system switch logfile;
  
   8、执行语句,查看基于时间点后的table
  
          select owner,name,tablespace_name,to_char(creation_time,'yyyy-mm-dd hh24:MI:SS')
            from sys.ts_pitr_objects_to_be_dropped
            where tablespace_name in ('USERS')
            and creation_time > to_date('2005-02-28 10:27:00','yyyy-mm-dd hh24:MI:SS')
            order by tablespace_name,creation_time;
           
   9、执行 alter system switch logfile;   
  
   10、执行create table emptest as select * from emp;      
  
   11、关闭数据库,用已有的init.ora文件重启数据库,在init.ora文件中把controlfile文件指向旧的controlfile文件
  
     startup mount pfile='D:\oracle\init.ora'     
  
   12、执行下列语句,将新的数据库文件指向备份文件,进行恢复。
  
        SQL> alter database rename file 'D:\ORACLE\ORADATA\USERS01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\USERS01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\SYSTEM01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\UNDOTBS01.DBF' to  'D:\ORACLE\ORADATA\ORACLE\UNDOTBS01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\CWMLITE01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\CWMLITE01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\DRSYS01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\DRSYS01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\EXAMPLE01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\EXAMPLE01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\INDX01.DBF' to  'D:\ORACLE\ORADATA\ORACLE\INDX01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\ODM01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\ODM01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\TOOLS01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\TOOLS01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\XDB01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\XDB01.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\SINO.DBF' to 'D:\ORACLE\ORADATA\ORACLE\SINO.DBF';
        SQL> alter database rename file 'D:\ORACLE\ORADATA\RCVCAT.DBF' to 'D:\ORACLE\ORADATA\ORACLE\RCVCAT.DBF';  
        SQL> alter database rename file 'D:\ORACLE\ORADATA\PERFSTAT.DBF' to 'D:\ORACLE\ORADATA\ORACLE\PERFSTAT.DBF';
       
   13、进行数据库的不完全恢复
  
        SQL> recover database using backup controlfile until time '2005-02-28 13:45:00';
        ORA-00279: ?? 3589502 (? 02/28/2005 13:37:10 ??) ???? 1 ????
        ORA-00289: ??: D:\ORACLE\ORA92\RDBMS\ARC00053.001
        ORA-00280: ?? 3589502 ???? 1 ???? # 53 ???
       
       
        指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
        D:\oracle\oradata\archive\ARC00053.001
        已应用的日志。
        完成介质恢复。
       
   14、打开数据库并检查已删除的table
  
        SQL> alter database open resetlogs;
       
        SQL> select name,status from v$datafile;

NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\oracle\SYSTEM01.DBF                     SYSTEM
        D:\ORACLE\ORADATA\oracle\UNDOTBS01.DBF                    ONLINE
        D:\ORACLE\ORADATA\oracle\CWMLITE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\oracle\DRSYS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\oracle\EXAMPLE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\oracle\INDX01.DBF                       ONLINE
        D:\ORACLE\ORADATA\oracle\ODM01.DBF                        ONLINE
        D:\ORACLE\ORADATA\oracle\TOOLS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\oracle\USERS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\oracle\XDB01.DBF                        ONLINE
        D:\ORACLE\ORADATA\oracle\SINO.DBF                         ONLINE
        D:\ORACLE\ORADATA\oracle\RCVCAT.DBF                       ONLINE
        D:\ORACLE\ORADATA\oracle\PERFSTAT.DBF                     ONLINE
       
        已选择13行。
       
   15、将已删除的表进行导出
  
        c:>exp scott/tiger file=exp_empcopysystem.dmp tables=empcopysystem
       
   16、关闭数据库,用spfile打开数据库至原始状态(删除文件状态)
      
      SQL> startup mount
      
      打开数据库时,如果redo中有活动的transaction,会报错
        SQL> alter database open;
        alter database open
        *
        ERROR 位于第 1 行:
        ORA-00314: 日志 1 (线程 1),预计序号  与  不匹配
        ORA-00312: 联机日志 1 线程 1: 'D:\ORACLE\ORADATA\ORACLE\REDO01.LOG'

清空未归档的日志文件
        SQL> alter database clear unarchived logfile 'D:\ORACLE\ORADATA\ORACLE\REDO01.LOG';
       
        SQL> select name,status from v$datafile;

NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\SYSTEM01.DBF                     SYSTEM
        D:\ORACLE\ORADATA\UNDOTBS01.DBF                    ONLINE
        D:\ORACLE\ORADATA\CWMLITE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\DRSYS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\EXAMPLE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\INDX01.DBF                       ONLINE
        D:\ORACLE\ORADATA\ODM01.DBF                        ONLINE
        D:\ORACLE\ORADATA\TOOLS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\USERS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\XDB01.DBF                        ONLINE
        D:\ORACLE\ORADATA\SINO.DBF                         ONLINE
        D:\ORACLE\ORADATA\RCVCAT.DBF                       ONLINE
        D:\ORACLE\ORADATA\PERFSTAT.DBF                     ONLINE
       
        已选择13行。
            
   17、导入文件 exp_empcopysystem.dmp
             
        c:>imp scott/tiger file=exp_empcopysystem.dmp tables=empcopysystem

总结:在做这个实验时,要注意两次恢复的数据文件,通过v$datafile可以看出第一次基于时间点的不完全恢复,所有的数据文件要用备份的
   数据文件和备份的control文件,在init文件中,要把control文件指向这个备份的control文件。将所需的文件导出后,要重新用原来
   的数据文件和control文件启动数据库,这时可能会遇到上面的错误信息,因为redo日志中会有transaction,这时要注意,在做第一次
   不完全恢复时要切换几次日志,保证redo中没有需要回滚的信息,以免强制clear日志后造成的不必要的损失。

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

####################################################
   [10.3] 分区表空间数据文件基于时间点的恢复测试:
####################################################  

##########################################################################  
#   [10.3_1] 分区表空间数据文件基于时间点的恢复测试: 基于时间的不完全恢复
##########################################################################   
   1、创建分区表
  
       SQL> create table test (id number,name varchar2(40),hire_date date,salary number)
         2  partition by range(hire_date)
         3  (
         4  partition p1 values less than (to_date('2005-01-01','yyyy-mm-dd')) tablespace test1,
         5  partition p2 values less than (to_date('2006-01-01','yyyy-mm-dd')) tablespace test2,
         6  partition p3 values less than (to_date('2007-01-01','yyyy-mm-dd')) tablespace test3
         7  );
      
       表已创建。
      
       SQL> insert into test values (1001,'zhang xiao',to_date('2004-01-01','yyyy-mm-dd'),1200);
       SQL> insert into test values (1002,'zhang namo',to_date('2005-11-01','yyyy-mm-dd'),1200);
       SQL> insert into test values (1003,'zhang namo',to_date('2006-11-01','yyyy-mm-dd'),1200);
      
       SQL> select table_name,tablespace_name,high_value,partition_name from user_tab_partitions;

TABLE_NAME                     TABLESPACE_NAME                HIGH_VALUE                                                                       PARTITION_NAME
            ------------------------------ ------------------------------ -------------------------------------------------------------------------------- ------------------------------
            TEST                           TEST1                          TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P1
            TEST                           TEST2                          TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P2
            TEST                           TEST3                          TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P3
      
      
   2、做一次全库冷备份,将所有数据文件从 D:\oracle\oradata 拷贝至 D:\oracle\oradata\oracle 目录下
      
       SQL> alter database backup controlfile to 'd:\oracle\oradata\oracle\control.ctl'; 
      
   3、显示系统时间
  
       SQL> select sysdate from dual;

SYSDATE
       -------------------
       2005-03-01 11:11:36
      
   4、SQL> insert into test values (1004,'zhang namo',to_date('2005-10-01','yyyy-mm-dd'),1200);
      SQL> insert into test values (1005,'zhang namo',to_date('2006-10-01','yyyy-mm-dd'),1200);
     
      SQL> alter table test drop partition p2;
     
      SQL> insert into test values (1006,'zhang namo',to_date('2006-10-01','yyyy-mm-dd'),1200);
      SQL> insert into test values (1007,'zhang namo',to_date('2004-10-01','yyyy-mm-dd'),1200);
      SQL> insert into test values (1008,'zhang namo',to_date('2005-09-01','yyyy-mm-dd'),1200);   
     
   5、恢复前数据库的状态
  
      SQL> select * from test partition(p1);                                                        
                                                                                              
              ID NAME                                               HIRE_DATE               SALARY
      ---------- -------------------------------------------------- ------------------- ----------
            1001 zhang xiao                                         2004-01-01 00:00:00       1200
            1007 zhang namo                                         2004-10-01 00:00:00       1200
                                                                                              
      SQL> select * from test partition(p2);                                                     
      select * from test partition(p2)                                                           
                                   *                                                             
      ERROR 位于第 1 行:                                                                         
      ORA-02149: 指定的分区不存在                                                                
                                                                                              
                                                                                              
      SQL> select * from test partition(p3);                                                     
                                                                                              
              ID NAME                                               HIRE_DATE               SALARY
      ---------- -------------------------------------------------- ------------------- ----------
            1003 zhang namo                                         2006-11-01 00:00:00       1200
            1005 zhang namo                                         2006-10-01 00:00:00       1200
            1006 zhang namo                                         2006-10-01 00:00:00       1200
            1008 zhang namo                                         2005-09-01 00:00:00       1200   
           
      SQL> select name,status from v$datafile;                 
                                                         
      NAME                                               STATUS
      -------------------------------------------------- -------
      D:\ORACLE\ORADATA\SYSTEM01.DBF                     SYSTEM
      D:\ORACLE\ORADATA\UNDOTBS01.DBF                    ONLINE
      D:\ORACLE\ORADATA\CWMLITE01.DBF                    ONLINE
      D:\ORACLE\ORADATA\DRSYS01.DBF                      ONLINE
      D:\ORACLE\ORADATA\EXAMPLE01.DBF                    ONLINE
      D:\ORACLE\ORADATA\INDX01.DBF                       ONLINE
      D:\ORACLE\ORADATA\ODM01.DBF                        ONLINE
      D:\ORACLE\ORADATA\TOOLS01.DBF                      ONLINE
      D:\ORACLE\ORADATA\USERS01.DBF                      ONLINE
      D:\ORACLE\ORADATA\XDB01.DBF                        ONLINE
      D:\ORACLE\ORADATA\SINO.DBF                         ONLINE
      D:\ORACLE\ORADATA\RCVCAT.DBF                       ONLINE
      D:\ORACLE\ORADATA\PERFSTAT.DBF                     ONLINE
      D:\ORACLE\ORADATA\TEST1.DBF                        ONLINE
      D:\ORACLE\ORADATA\TEST2.DBF                        ONLINE
      D:\ORACLE\ORADATA\TEST3.DBF                        ONLINE
      D:\ORACLE\ORADATA\TEST4.DBF                        ONLINE
                                                         
      已选择17行。    
     
   6、用原有的init.ora文件启动数据库到mount状态,并在init.ora文件中将control指向备份的control文件d:\oracle\oradata\oracle\control.ctl
  
      SQL>  startup mount pfile='D:\oracle\init.ora'    
     
   6、将数据文件指向备份的数据文件
        
      SQL> alter database rename file 'D:\ORACLE\ORADATA\USERS01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\USERS01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\SYSTEM01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\UNDOTBS01.DBF' to  'D:\ORACLE\ORADATA\ORACLE\UNDOTBS01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\CWMLITE01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\CWMLITE01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\DRSYS01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\DRSYS01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\EXAMPLE01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\EXAMPLE01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\INDX01.DBF' to  'D:\ORACLE\ORADATA\ORACLE\INDX01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\ODM01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\ODM01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\TOOLS01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\TOOLS01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\XDB01.DBF' to 'D:\ORACLE\ORADATA\ORACLE\XDB01.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\SINO.DBF' to 'D:\ORACLE\ORADATA\ORACLE\SINO.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\RCVCAT.DBF' to 'D:\ORACLE\ORADATA\ORACLE\RCVCAT.DBF';  
      SQL> alter database rename file 'D:\ORACLE\ORADATA\PERFSTAT.DBF' to 'D:\ORACLE\ORADATA\ORACLE\PERFSTAT.DBF'; 
      SQL> alter database rename file 'D:\ORACLE\ORADATA\TEST1.DBF' to 'D:\ORACLE\ORADATA\ORACLE\TEST1.DBF'; 
      SQL> alter database rename file 'D:\ORACLE\ORADATA\TEST2.DBF' to 'D:\ORACLE\ORADATA\ORACLE\TEST2.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\TEST3.DBF' to 'D:\ORACLE\ORADATA\ORACLE\TEST3.DBF';
      SQL> alter database rename file 'D:\ORACLE\ORADATA\TEST4.DBF' to 'D:\ORACLE\ORADATA\ORACLE\TEST4.DBF';    
     
   7、进行数据库的不完全恢复
  
        SQL> recover database using backup controlfile until time '2005-03-01 11:11:36';
        ORA-00279: 更改 3663151 (在 02/28/2005 17:11:09 生成) 对于线程 1 是必需的
        ORA-00289: 建议: D:\ORACLE\ORA92\RDBMS\ARC00018.001
        ORA-00280: 更改 3663151 对于线程 1 是按序列 # 18 进行的
       
       
        指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
        D:\ORACLE\ORA92\RDBMS\ARC00018.001
        已应用的日志。
        完成介质恢复。   
       
   7、打开数据库
  
        SQL> alter database open resetlogs;
       
        SQL> select name,status from v$datafile;

NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF              SYSTEM
        D:\ORACLE\ORADATA\ORACLE\UNDOTBS01.DBF             ONLINE
        D:\ORACLE\ORADATA\ORACLE\CWMLITE01.DBF             ONLINE
        D:\ORACLE\ORADATA\ORACLE\DRSYS01.DBF               ONLINE
        D:\ORACLE\ORADATA\ORACLE\EXAMPLE01.DBF             ONLINE
        D:\ORACLE\ORADATA\ORACLE\INDX01.DBF                ONLINE
        D:\ORACLE\ORADATA\ORACLE\ODM01.DBF                 ONLINE
        D:\ORACLE\ORADATA\ORACLE\TOOLS01.DBF               ONLINE
        D:\ORACLE\ORADATA\ORACLE\USERS01.DBF               ONLINE
        D:\ORACLE\ORADATA\ORACLE\XDB01.DBF                 ONLINE
        D:\ORACLE\ORADATA\ORACLE\SINO.DBF                  ONLINE
       
        NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\ORACLE\RCVCAT.DBF                ONLINE
        D:\ORACLE\ORADATA\ORACLE\PERFSTAT.DBF              ONLINE
        D:\ORACLE\ORADATA\ORACLE\TEST1.DBF                 ONLINE
        D:\ORACLE\ORADATA\ORACLE\TEST2.DBF                 ONLINE
        D:\ORACLE\ORADATA\ORACLE\TEST3.DBF                 ONLINE
        D:\ORACLE\ORADATA\ORACLE\TEST4.DBF                 ONLINE
       
        已选择17行。
       
   8、导出数据
       
        建立交换table
        create table swap_p1 (id number,name varchar2(40),hire_date date,salary number) tablespace test4;    
       
        SQL> alter table test exchange partition p2 with table swap_p1;
       
        SQL> select obj1_owner,obj1_name,obj1_type,ts1_name,obj2_name,obj2_type,obj2_owner,ts2_name,reason
             from ts_pitr_check
             where (ts1_name in('TEST2') and ts2_name not in ('TEST2'))
                or (ts1_name not in('TEST2') and ts2_name in ('TEST2'));
               
        将分区的内容作为table导出
        exp scott/tiger file=d:\exp_swap.dmp tables=swap_p1
       
   9、重新启动数据库至mount状态
       
        SQL> startup mount
        ORACLE 例程已经启动。
       
        Total System Global Area  135338868 bytes
        Fixed Size                   453492 bytes
        Variable Size             109051904 bytes
        Database Buffers           25165824 bytes
        Redo Buffers                 667648 bytes
        数据库装载完毕。
       
        SQL> alter database open;
        alter database open
        *
        ERROR 位于第 1 行:
        ORA-00314: 日志 1 (线程 1),预计序号  与  不匹配
        ORA-00312: 联机日志 1 线程 1: 'D:\ORACLE\ORADATA\ORACLE\REDO01.LOG'  
       
        清空日志
        SQL> alter database clear unarchived logfile 'D:\ORACLE\ORADATA\ORACLE\REDO03.LOG';                                                                                                                                           
        SQL> alter database clear unarchived logfile 'D:\ORACLE\ORADATA\ORACLE\REDO02.LOG';                                                                            
        SQL> alter database clear unarchived logfile 'D:\ORACLE\ORADATA\ORACLE\REDO01.LOG';
       
        打开数据库                                                 
        SQL> alter database open;

9、检查数据库状态
       
        SQL> select name,status from v$datafile;

NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\SYSTEM01.DBF                     SYSTEM
        D:\ORACLE\ORADATA\UNDOTBS01.DBF                    ONLINE
        D:\ORACLE\ORADATA\CWMLITE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\DRSYS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\EXAMPLE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\INDX01.DBF                       ONLINE
        D:\ORACLE\ORADATA\ODM01.DBF                        ONLINE
        D:\ORACLE\ORADATA\TOOLS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\USERS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\XDB01.DBF                        ONLINE
        D:\ORACLE\ORADATA\SINO.DBF                         ONLINE
       
        NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\RCVCAT.DBF                       ONLINE
        D:\ORACLE\ORADATA\PERFSTAT.DBF                     ONLINE
        D:\ORACLE\ORADATA\TEST1.DBF                        ONLINE
        D:\ORACLE\ORADATA\TEST2.DBF                        ONLINE
        D:\ORACLE\ORADATA\TEST3.DBF                        ONLINE
        D:\ORACLE\ORADATA\TEST4.DBF                        ONLINE
       
        已选择17行。    
       
        SQL> select table_name,tablespace_name,high_value,partition_name from user_tab_partitions;

TABLE_NAME                     TABLESPACE_NAME                HIGH_VALUE                                                               PARTITION_NAME
        ------------------------------ ------------------------------ -------------------------------------------------------------------------------- ------------------------------
        TEST                           TEST1                          TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P1
        TEST                           TEST3                          TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P3                                                         
       
   10、导入已删除的分区的内容
       
        增加分区
        SQL> alter table test split partition p3 at (to_date('2006-01-01','yyyy-mm-dd')) into (partition p2 tablespace test2,partition p3);
       
        导入表
        imp scott/tiger file=d:\exp_swap.dmp tables=swap_p1
       
        将数据插入分区表
        insert into test select * from swap_p1;
       
   11、数据库的状态
       
        SQL> select table_name,tablespace_name,high_value,partition_name from user_tab_partitions;

TABLE_NAME                     TABLESPACE_NAME                HIGH_VALUE                                                               PARTITION_NAME
        ------------------------------ ------------------------------ -------------------------------------------------------------------------------- ------------------------------
        TEST                           TEST2                          TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P2
        TEST                           TEST1                          TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P1
        TEST                           TEST3                          TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P3
       
        SQL> select name,status from v$datafile;
       
        NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\SYSTEM01.DBF                     SYSTEM
        D:\ORACLE\ORADATA\UNDOTBS01.DBF                    ONLINE
        D:\ORACLE\ORADATA\CWMLITE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\DRSYS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\EXAMPLE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\INDX01.DBF                       ONLINE
        D:\ORACLE\ORADATA\ODM01.DBF                        ONLINE
        D:\ORACLE\ORADATA\TOOLS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\USERS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\XDB01.DBF                        ONLINE
        D:\ORACLE\ORADATA\SINO.DBF                         ONLINE
       
        NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\RCVCAT.DBF                       ONLINE
        D:\ORACLE\ORADATA\PERFSTAT.DBF                     ONLINE
        D:\ORACLE\ORADATA\TEST1.DBF                        ONLINE
        D:\ORACLE\ORADATA\TEST2.DBF                        ONLINE
        D:\ORACLE\ORADATA\TEST3.DBF                        ONLINE
        D:\ORACLE\ORADATA\TEST4.DBF                        ONLINE
       
        已选择17行。    
       
       
----------------------------------------------------------------------------------------------------------------------------
      
##########################################################################    
#   [10.3_2] 分区表空间数据文件基于时间点的恢复测试: 数据文件损坏的恢复
##########################################################################  
   1、数据库分区表的状态:
  
       SQL> select table_name,tablespace_name,high_value,partition_name from user_tab_partitions;

TABLE_NAME                     TABLESPACE_NAME                HIGH_VALUE                                                               PARTITION_NAME
        ------------------------------ ------------------------------ -------------------------------------------------------------------------------- ------------------------------
        TEST                           TEST2                          TO_DATE(' 2006-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P2
        TEST                           TEST1                          TO_DATE(' 2005-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P1
        TEST                           TEST3                          TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA P3
       
        SQL> select name,status from v$datafile;
       
        NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\SYSTEM01.DBF                     SYSTEM
        D:\ORACLE\ORADATA\UNDOTBS01.DBF                    ONLINE
        D:\ORACLE\ORADATA\CWMLITE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\DRSYS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\EXAMPLE01.DBF                    ONLINE
        D:\ORACLE\ORADATA\INDX01.DBF                       ONLINE
        D:\ORACLE\ORADATA\ODM01.DBF                        ONLINE
        D:\ORACLE\ORADATA\TOOLS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\USERS01.DBF                      ONLINE
        D:\ORACLE\ORADATA\XDB01.DBF                        ONLINE
        D:\ORACLE\ORADATA\SINO.DBF                         ONLINE
       
        NAME                                               STATUS
        -------------------------------------------------- -------
        D:\ORACLE\ORADATA\RCVCAT.DBF                       ONLINE
        D:\ORACLE\ORADATA\PERFSTAT.DBF                     ONLINE
        D:\ORACLE\ORADATA\TEST1.DBF                        ONLINE
        D:\ORACLE\ORADATA\TEST2.DBF                        ONLINE
        D:\ORACLE\ORADATA\TEST3.DBF                        ONLINE
        D:\ORACLE\ORADATA\TEST4.DBF                        ONLINE
       
        已选择17行。
       
   2、备份数据库
  
       RMAN> backup database;
      
       备份archivelog文件
       RMAN> run {
       2> allocate channel c1 type disk;
       3> backup archivelog all delete input; (或者BACKUP ARCHIVELOG TIME BETWEEN 'SYSDATE-31' AND 'SYSDATE-7'; )
       4> release channel c1;
       5> }
      
       备份controlfile文件
       RMAN> run {                     
       2> allocate channel c1 type disk;
       3> backup current controlfile ; 
       4> release channel c1;          
       5> }              
      
   3、启动数据到mount状态,在rman中进行恢复                       
      
       显示备份的archivelog文件
       list backup of archivelog all;
      
       恢复日志文件,如果不指定destination,则恢复到当前数据库默认的log_archive_dest目录下
       RMAN> run {
       2> allocate channel c1 type disk;
       3> set ARCHIVELOG DESTINATION TO 'D:\oracle\ora92\rdbms';
       3> restore archivelog sequence  between 34 and 40;
       4> release channel c1;
       5> }
      
       恢复数据文件                            
       RMAN> run {
       2> allocate channel c1 type disk;
       3> restore datafile 14;
       4> recover datafile 14;
       5> alter database open;
       6> release channel c1;
       7> }
      
   4、查看恢复后的表,恢复成功 
 
 
=============================
ora-01110错误 

--首先主在窗口我在已存在的tablespace中增加了一个datafile
SQL> alter tablespace example add datafile 'd:\ORACLE\ORADATA\ORACLE\exampleadd.dbf' size 50M;

Tablespace altered.

--这时我在另外一个窗口作了以下操作
SQL> create table empcomy as select * from empcomy;

SQL> insert into empcomy select * from empcomy;
14 rows created.

--在主窗口我offline其中一个datafile
SQL> alter database datafile 'd:\ORACLE\ORADATA\ORACLE\exampleadd.dbf' offline;

Database altered.

--在另外一个窗口中作了以下操作
SQL> create table empcopy as select * from emp;

Table created.

SQL> insert into empcopy select * from empcopy;

14 rows created.

--这时在主窗口中我online datafile,报错
SQL> alter database datafile 'd:\ORACLE\ORADATA\ORACLE\exampleadd.dbf' online;
alter database datafile 'd:\ORACLE\ORADATA\ORACLE\exampleadd.dbf' online
*
ERROR at line 1:
ORA-01113: file 2 needs media recovery
ORA-01110: data file 2: 'D:\ORACLE\ORADATA\ORACLE\EXAMPLEADD.DBF'

--我只能在mount阶段进行数据库的恢复
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  143727516 bytes
Fixed Size                   453532 bytes
Variable Size             117440512 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
Database mounted.

SQL> alter database datafile 'd:\ORACLE\ORADATA\ORACLE\exampleadd.dbf' online;

Database altered.

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 2 needs media recovery
ORA-01110: data file 2: 'D:\ORACLE\ORADATA\ORACLE\EXAMPLEADD.DBF'

SQL> recover datafile 'D:\ORACLE\ORADATA\ORACLE\EXAMPLEADD.DBF';
Media recovery complete.
SQL> alter database open;

Database altered.

--在另外一个窗口中作了以下操作
SQL> select count(*) from empcopy;

COUNT(*)
----------
       28

SQL> select count(*) from empcomy;

COUNT(*)
----------
        28
       
--到这里,你可以放心的看到,做这个datafile的恢复,是不影响你的其它操作。
 不过,为了安全起见,在线做这个操作之前,你最好做个全库备份,如果发现有什么不对,还可以恢复到备份的时间点。

建议楼主在恢复之前,先把文件移到你希望存放的位置,然后在恢复,恢复完成之后备份整个数据库。示例:

SQL> select file_name||'          '||tablespace_name from dba_data_files;

FILE_NAME||''||TABLESPACE_NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/std1/system01.dbf          SYSTEM
/opt/oracle/oradata/std1/undotbs01.dbf          UNDOTBS1
/opt/oracle/oradata/std1/cwmlite01.dbf          CWMLITE
/opt/oracle/oradata/std1/drsys01.dbf          DRSYS
/opt/oracle/oradata/std1/example01.dbf          EXAMPLE
/opt/oracle/oradata/std1/indx01.dbf          INDX
/opt/oracle/oradata/std1/odm01.dbf          ODM
/opt/oracle/oradata/std1/tools01.dbf          TOOLS
/opt/oracle/oradata/std1/users01.dbf          USERS
/opt/oracle/oradata/std1/xdb01.dbf          XDB
/opt/oracle/oradata/rcat01.dbf          RCAT

SQL> alter database datafile '/opt/oracle/oradata/rcat01.dbf' offline;

Database altered.

SQL> host mv /opt/oracle/oradata/rcat01.dbf /opt/oracle/oradata/std1/rcat01.dbf

SQL> alter database rename file '/opt/oracle/oradata/rcat01.dbf' to '/opt/oracle/oradata/std1/rcat01.dbf';

Database altered.

SQL> select file_id||' '||file_name  from dba_data_files;

FILE_ID||''||FILE_NAME
--------------------------------------------------------------------------------
1 /opt/oracle/oradata/std1/system01.dbf
2 /opt/oracle/oradata/std1/undotbs01.dbf
3 /opt/oracle/oradata/std1/cwmlite01.dbf
4 /opt/oracle/oradata/std1/drsys01.dbf
5 /opt/oracle/oradata/std1/example01.dbf
6 /opt/oracle/oradata/std1/indx01.dbf
7 /opt/oracle/oradata/std1/odm01.dbf
8 /opt/oracle/oradata/std1/tools01.dbf
9 /opt/oracle/oradata/std1/users01.dbf
10 /opt/oracle/oradata/std1/xdb01.dbf
11 /opt/oracle/oradata/std1/rcat01.dbf

SQL> recover datafile 11;
Media recovery complete.
SQL> alter database datafile 11 online;

Database altered.

--备份整个数据库及控制文件

======================================
主机崩溃,在另外的机器上恢复数据库全过程

Enviroment:
Two Machines ip  OS  Oracle
A:prod db  172.16.100.31  RedHatES3 9.2.0.6
B:backup db  172.16.100.29  RedHatES3 9.2.0.6

--step1.backup database
ensure that Machine A prod db is under archivelog mode
Machin A:
rman nocatalog target /

Recovery Manager: Release 9.2.0.6.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.

connected to target database: STD1 (DBID=3008016294)
using target database controlfile instead of recovery catalog

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/opt/oracle/rman/std31_cf_%F';

RMAN> configure channel 1 device type disk format '/opt/oracle/rman/std31_%U';

RMAN> backup database;

Starting backup at 09-SEP-05
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=12 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=/opt/oracle/oradata/std1/system01.dbf
input datafile fno=00002 name=/opt/oracle/oradata/std1/undotbs01.dbf
input datafile fno=00005 name=/opt/oracle/oradata/std1/example01.dbf
input datafile fno=00011 name=/opt/oracle/oradata/rcat01.dbf
input datafile fno=00010 name=/opt/oracle/oradata/std1/xdb01.dbf
input datafile fno=00006 name=/opt/oracle/oradata/std1/indx01.dbf
input datafile fno=00009 name=/opt/oracle/oradata/std1/users01.dbf
input datafile fno=00003 name=/opt/oracle/oradata/std1/cwmlite01.dbf
input datafile fno=00004 name=/opt/oracle/oradata/std1/drsys01.dbf
input datafile fno=00007 name=/opt/oracle/oradata/std1/odm01.dbf
input datafile fno=00008 name=/opt/oracle/oradata/std1/tools01.dbf
channel ORA_DISK_1: starting piece 1 at 09-SEP-05
channel ORA_DISK_1: finished piece 1 at 09-SEP-05
piece handle=/opt/oracle/rman/std31_05gu6stc_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:58
Finished backup at 09-SEP-05

Starting Control File and SPFILE Autobackup at 09-SEP-05
piece handle=/opt/oracle/rman/std31_cf_c-3008016294-20050909-00 comment=NONE
Finished Control File and SPFILE Autobackup at 09-SEP-05

--setp2.make suer the path of datafiles, controlfiles and spfile
--all datafile under path /opt/oracle/oradata/
--spfile is /opt/oracle/product/9.2.0/dbs/spfilestd1.ora
--controlfile is /opt/oracle/oradata/std1/control01.ctl,
  /opt/oracle/oradata/std1/control02.ctl,
  /opt/oracle/oradata/std1/control03.ctl

--step3.recove backup to Machine B
--1.install database software and create the same directories
Machine B:
mkdir -p /opt/oracle/oradata/std1/

--2.cope files from Machine A to Machine B with the same paths.
cp /opt/oracle/rman/std31_03gu4uef_1_1 /opt/oracle/rman/std31_03gu4uef_1_1
cp /opt/oracle/rman/std31_cf_c-3008016294-20050908-01 /opt/oracle/rman/std31_cf_c-3008016294-20050908-01

--3.recover database
Machine B:
--set enviroment and create pwdfile
su - oracle
orapwd file=/opt/oracle/product/9.2.0/dbs/orapwstd1 password=oracle entries=10
lsnrctl start

rman nocatalog target /

RMAN> set dbid=3008016294

executing command: SET DBID

RMAN> startup force nomount

startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/opt/oracle/product/9.2.0/dbs/initstd1.ora'

trying to start the Oracle instance without parameter files ...
Oracle instance started

Total System Global Area      97588624 bytes

Fixed Size                      451984 bytes
Variable Size                 46137344 bytes
Database Buffers              50331648 bytes
Redo Buffers                    667648 bytes

RMAN> restore spfile from '/opt/oracle/rman/std31_cf_c-3008016294-20050909-00';
RMAN> shutdown immediate

Oracle instance shut down

RMAN> startup nomount

connected to target database (not started)
Oracle instance started

Total System Global Area     236000476 bytes

Fixed Size                      451804 bytes
Variable Size                201326592 bytes
Database Buffers              33554432 bytes
Redo Buffers                    667648 bytes

RMAN> restore controlfile from '/opt/oracle/rman/std31_cf_c-3008016294-20050909-00';

Starting restore at 09-SEP-05

using channel ORA_DISK_1
channel ORA_DISK_1: restoring controlfile
channel ORA_DISK_1: restore complete
replicating controlfile
input filename=/opt/oracle/oradata/std1/control01.ctl
output filename=/opt/oracle/oradata/std1/control02.ctl
output filename=/opt/oracle/oradata/std1/control03.ctl
Finished restore at 09-SEP-05

RMAN> alter database mount;

database mounted

RMAN> restore database;

Starting restore at 09-SEP-05

using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /opt/oracle/oradata/std1/system01.dbf
restoring datafile 00002 to /opt/oracle/oradata/std1/undotbs01.dbf
restoring datafile 00003 to /opt/oracle/oradata/std1/cwmlite01.dbf
restoring datafile 00004 to /opt/oracle/oradata/std1/drsys01.dbf
restoring datafile 00005 to /opt/oracle/oradata/std1/example01.dbf
restoring datafile 00006 to /opt/oracle/oradata/std1/indx01.dbf
restoring datafile 00007 to /opt/oracle/oradata/std1/odm01.dbf
restoring datafile 00008 to /opt/oracle/oradata/std1/tools01.dbf
restoring datafile 00009 to /opt/oracle/oradata/std1/users01.dbf
restoring datafile 00010 to /opt/oracle/oradata/std1/xdb01.dbf
restoring datafile 00011 to /opt/oracle/oradata/rcat01.dbf
channel ORA_DISK_1: restored backup piece 1
piece handle=/opt/oracle/rman/std31_05gu6stc_1_1 tag=TAG20050909T114652 params=NULL
channel ORA_DISK_1: restore complete
Finished restore at 09-SEP-05

RMAN> recover database noredo;

Starting recover at 09-SEP-05
using channel ORA_DISK_1

starting media recovery
media recovery complete

Finished recover at 09-SEP-05

RMAN> alter database open resetlogs;

database opened

RMAN>

--4.add temp files
SQL> alter tablespace TEMP add tempfile '/opt/oracle/oradata/std1/temp01.dbf' size 50M;

Tablespace altered.

--step4.check the db status, done
...

=================================
Listing Backups
Lets spend just a minute looking alittle more at the history of backups using the "list" RMAN command. Using the "list backup" RMAN statement we can list the backups we've made.

[oracle@vixen oracle]$echo $ORACLE_SID
cuddle
[oracle@vixen oracle]$rman nocatalog
Recovery Manager: Release 10.1.0.2.0 - 64bit Production
Copyright (c) 1995, 2004, Oracle.  All rights reserved.

RMAN> connect target /
connected to target database: CUDDLE (DBID=251015092)
using target database controlfile instead of recovery catalog

RMAN> list backup;

List of Backup Sets
===================

BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
1       Full    441M       DISK        00:01:23     15-OCT-04     
        BP Key: 1   Status: AVAILABLE  Compressed: NO  Tag: TAG20041015T175207
        Piece Name: /export/rman/rman_CUDDLE_01g2k8m8_1_1.bus
  List of Datafiles in backup set 1
  File LV Type Ckp SCN    Ckp Time  Name
  ---- -- ---- ---------- --------- ----
  1       Full 396472     15-OCT-04 /u02/oradata/cuddle/system01.dbf
  2       Full 396472     15-OCT-04 /u02/oradata/cuddle/undotbs01.dbf
  3       Full 396472     15-OCT-04 /u02/oradata/cuddle/sysaux01.dbf
  4       Full 396472     15-OCT-04 /u02/oradata/cuddle/users01.dbf

BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
2       Full    2M         DISK        00:00:02     15-OCT-04     
        BP Key: 2   Status: AVAILABLE  Compressed: NO  Tag: TAG20041015T175207
        Piece Name: /export/rman/rman_CUDDLE_02g2k8ou_1_1.bus
  Controlfile Included: Ckp SCN: 396502       Ckp time: 15-OCT-04
  SPFILE Included: Modification time: 15-OCT-04

RMAN>

Here we can see 2 backup pieces, the first contains the datafiles for the "cuddle" database, is 441MB in side, was made to disk and took 1 minute and 23 seconds to make. We aslo see the peices tag (notice the tag is the same for both peices). Notice also that each datafile in the backup peice has a Checkpoint System Change Number (Ckp SCN) associated with it (SCNs were covered earlier). The second peice is 2MB in size, took 2 seconds to backup and was done to disk. Notice that the second peice lists the modification time for the SPFILE and the SCN for the Controlfile.

The list command has a number of argument that can allow you to tailor the output to just about any way you want to see it. A nice and consice output is seen using "list backup summary".

See a complete list of options to the RMAN list command in the Oracle Database Recovery Manager Reference manual:

http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10770/toc.htm
http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10770/rcmsynta36.htm#105210
http://www.csee.umbc.edu/help/oracle8/server.815/a67773/rmansy24.htm
http://www.camden.rutgers.edu/help/Documentation/Oracle/server.815/a67773/rmansy24.htm

--列的解释

Column   Indicates  
KEY 
 a unique key identifying this backup set.

Note: If the target database control file is used instead of the recovery catalog, then this field is a unique identifier that specifies this backup set in the target database control file (and is equal to the RECID, which serves this purpose when a recovery catalog is not used). Use this key in a change ... backupset statement to change the status of the backup set. 
 
RECID 
 when combined with the STAMP column, a unique key that identifies this backup set in the target database control file. The RECID will be invalid when a new control file record occupies the space used by the old record. For this reason, issue resync commands often so that the new records are copied to the recovery catalog as soon as possible. 
 
STAMP 
 when combined with the RECID column, a unique key that identifies this backup set in the target database control file. 
 
LV 
 the level of the backup: NULL for non-incrementals, level 0-4 for incrementals. 
 
SET STAMP 
 when combined with the SET COUNT column, a unique key that identifies this backup set in the target database control file. Use these values to access the control file records in the V$BACKUP_SET, V$BACKUP_PIECE, V$BACKUP_DATAFILE, and V$BACKUP_REDOLOG views.

The SET STAMP value is valid at all times, both in the control file (when not using a recovery catalog) and when using a recovery catalog. SET STAMP values are never entered by a user because they are part of a two-value key. Oracle World Wide Support may request this value if your database requires recovery when no recovery catalog exists and control file records are gone.

See Also: For more information about data dictionary views, see the Oracle8i Reference. 
 
SET COUNT 
 when combined with the SET STAMP column, a unique key that identifies this backup set in the target database control file. Use these values to access the control file records in the V$BACKUP_SET, V$BACKUP_PIECE, V$BACKUP_DATAFILE, and V$BACKUP_REDOLOG views.

The SET COUNT value is valid at all times, both in the control file (when not using a recovery catalog) and when using a recovery catalog. SET COUNT values are never entered by a user because they are part of a two-value key. Oracle World Wide Support may request this value if your database requires recovery when no recovery catalog exists and control file records are gone. 
 
COMPLETION TIME 
 the date and time that the backup set completed. Note that the format of this field depends on the NLS_LANG and NLS_DATE_FORMAT environment settings.

KEY 
 a unique identifier for this backup piece in the recovery catalog or target database control file.

Note: The values for KEY in the recovery catalog and the control file are different. 
 
PC# 
 the piece number of this backup piece within the backup set. 
 
CP# 
 the copy number of this backup piece in a duplexed backup. For example, if set duplex = 4, then CP# will range from 1 to 4.

Note: If the backup is not duplexed, then CP# = 1. 
 
STATUS 
 the backup piece status: AVAILABLE, UNAVAILABLE, or EXPIRED (see the change command for an explanation of each status). 
 
COMPLETION TIME 
 the date and time when the piece was created. 
 
PIECE NAME 
 the name of the backup piece.

CKP SCN 
 the SCN of the backup control file checkpoint. All database changes recorded in the redo records before the specified SCN are reflected in this control file. 
 
CKP TIME 
 the time of the backup control file checkpoint. All database changes recorded in the redo records before the specified time are reflected in this control file. 
 
FILE 
 the number of the file that was backed up. 
 
NAME 
 the location where this file would be restored now if it were restored from this backup set and no set newname command (see "set_run_option") was entered. 
 
LV 
 the level of the backup: NULL for non-incrementals, level 0-4 for incrementals. 
 
TYPE 
 whether the backup was FULL or INCR (incremental). 
 
CKP SCN 
 the checkpoint of the datafile at the time it was backed up. All database changes prior to the SCN have been written to the file; changes after the specified SCN have not been written to the file. 
 
CKP TIME 
 the checkpoint of the datafile at the time it was backed up. All database changes prior to the time have been written to the file; changes after the specified time have not been written to the file.

KEY 
 the unique identifier for the datafile copy. Use this value in a change command to alter the status of the datafile copy.

Note: The values for KEY in the recovery catalog and the control file are different. 
 
FILE 
 the file number of the original datafile from which this copy was made. 
 

 the backup piece status: AVAILABLE, UNAVAILABLE, or EXPIRED (see the change command for an explanation of each status). 
 
COMPLETION TIME 
 the date and time that the copy completed. Note that the value of this field is sensitive to the NLS_LANG and NLS_DATE_FORMAT environment variables. 
 
CKP SCN 
 the checkpoint of this datafile when it was copied. All database changes prior to the SCN have been written to this file. 
 
CKP TIME 
 the checkpoint of this datafile when it was copied. All database changes prior to the time have been written to this file. 
 
NAME 
 the filename of the datafile copy. 
 
KEY 
 the unique identifier for this archived redo log copy. Use this value in a change command to alter the status of the copy.

Note: The values for KEY in the recovery catalog and the control file are different. 
 
THRD 
 the redo log thread number. 
 
SEQ 
 the log sequence number. 
 
COMPLETION TIME 
 the date and time that the copy completed. Note that the value of this field is sensitive to the NLS_LANG and NLS_DATE_FORMAT environment variables. 
 
NAME 
 the filename of the archived redo log copy. 
 
DB KEY 
 when combined with the INC KEY, the unique key by which RMAN identifies the database incarnation in the recovery catalog. Use this key to unregister a database, i.e., delete all the rows associated with that database from the recovery catalog. 
 
INC KEY 
 when combined with DB KEY, the unique key by which RMAN identifies the database incarnation in the recovery catalog. Use this key in the reset database to incarnation command, which you must use if you want to recover your database to a time prior to the most recent RESETLOGS. 
 
DB NAME 
 the database name as listed in the DB_NAME parameter. 
 
DB ID 
 the database identification number, which Oracle generates automatically at database creation. 
 
CUR 
 whether the incarnation is the current incarnation of the database. 
 
RESET SCN 
 the SCN at which the incarnation was created. 
 
RESET TIME 
 the time at which the incarnation was created.
 
 
================================
To generate a list of copies and backups restricted by object or other conditions:

Start RMAN and connect to the target database and, optionally, the recovery catalog database. For example, enter:

% rman target / catalog rman/rman@rcvcat

To restrict by object, use list copy or list backup with the of listObjList condition. For example, enter:

list backup of database;     # lists backups of all files in database
list copy of datafile '/oracle/dbs/tbs_1.f'; # lists copy of specified datafile
list backup of tablespace SYSTEM; # lists all backups of SYSTEM tablespace
list copy of archivelog all;  # lists all archived redo logs and copies of logs
list backup of controlfile; # lists all control file backups

You can also restrict your search by specifying a combination of tag, device type, filename pattern, or time options. For example, enter:

list backup tag 'weekly_full_db_backup';    # by tag
list copy of datafile '/oracle/dbs/tbs_1.f' type 'sbt_tape';   # by type
list backup like '/oracle/backup/tbs_4%';    # by filename pattern
list backup of archivelog until time 'SYSDATE-30';   # by time
list copy of datafile 2 completed between '10-DEC-1998' and '17-DEC-1998'; # by time

Examine the output. For example, following is sample output for a list of copies of datafile 1:

RMAN> list copy of datafile 1;

RMAN-03022: compiling command: list

List of Datafile Copies
Key     File S Completion time Ckp SCN    Ckp time        Name
------- ---- - --------------- ---------- --------------- ------
3       1    A 18-DEC-98       114148     18-DEC-98       /vobs/oracle/dbs/df1.bak

=======================================================
To report on objects that need a backup:

Start RMAN and connect to the target database and, optionally, the recovery catalog database. For example, enter:

% rman target / catalog rman/rman@rcat

To write the output to a log file, specify a file at startup:

% rman target / catalog rman/rman@rcat log "/oracle/log/mlog.f'

If necessary, issue crosscheck commands to update the status of backups and change ... crosscheck commands to update the status of image copies (if you want to specify image copies by primary key, issue a list command to obtain the keys).

Following is a possible crosscheck session:

# must allocate maintenance channel for crosscheck
rman> allocate channel for maintenance type disk;
released channel: ORA_DISK_1
allocated channel: ORA_MAINT_DISK_1                            --为crosscheck分配了maintenance通道
channel ORA_MAINT_DISK_1: sid=19 devtype=DISK

rman> crosscheck backup;  # crosschecks all backups
rman> change datafile copy 100,101,102,103,104,105,106,107 crosscheck; # specified by key
rman> change archivelog copy 50,51,52,53,54 crosscheck;  # specified by key
rman> release channel;

Use the need backup option to identify which datafiles need a new backup, restricting the report by a threshold number of days or incremental backups. RMAN considers any backups older than the days parameter value as needing a new backup because backups require days worth of archived redo logs for recovery.

For example, enter:

report need backup days = 7 database;  # needs at least 7 days of logs to recover
report need backup days = 30 tablespace system;
report need backup days = 14 datafile '/oracle/dbs/tbs_5.f';

You can also specify the incremental parameter. If complete recovery of a datafile requires more than the specified number of incremental backups, then RMAN considers it in need of a new backup. For example, enter:

report need backup incremental = 1 database;
report need backup incremental = 3 tablespace system;
report need backup incremental = 5 datafile '/oracle/dbs/tbs_5.f';

Examine the report and back up those datafiles requiring a new backup.

See Also: For an explanation of the various column headings in the report output, see "Report Output".

To report on backups that are obsolete:

Start RMAN and connect to the target database and, optionally, the recovery catalog database. For example, enter:

% rman target / catalog rman/rman@rcat

If you want to write the output to a message log file, specify the file at startup:

% rman target / catalog rman/rman@rcat log "/oracle/log/mlog.f'

If necessary, issue crosscheck commands to update the status of backups and change ... crosscheck commands to update the status of image copies (if you want to specify copies by primary key, issue a list command to obtain them):

allocate channel for maintenance type disk;
crosscheck backup;
change datafile copy 100,101,102,103,104,105,106,107 crosscheck;
change archivelog copy 50,51,52,53,54 crosscheck;
release channel;

Use the obsolete option to identify which backups are obsolete because they are no longer needed for recovery. The redundancy parameter specifies the minimum level of redundancy considered necessary for a backup or copy to be obsolete (if you do not specify the parameter, redundancy defaults to 1).

A datafile copy is obsolete if at least integer more recent backups of this file exist; a datafile backup set is obsolete if at least integer more recent backups or image copies of each file contained in the backup set exist. For example, enter:

# Lists backups or copies that have at least 2 more recent backups or copies
report obsolete redundancy = 2;

Use the untilClause to use make the redundancy check for backups sets or copies that are more recent, but not later than the specified time, SCN, or log sequence number:

# Obsolete if there are at least 2 copies/backupss that are no more than 2 weeks old. 
report obsolete redundancy = 2 until time 'SYSDATE-14'; 
report obsolete until scn 1000;
report obsolete redundancy = 3 until logseq = 121 thread = 1;

delete obsolete ;

Use the orphan option to list which backups and copies are unusable because they belong to a incarnation that is not a direct predecessor of the current incarnation:

report obsolete orphan;

For an explanation of orphaned backups, see "Reporting on Orphaned Backups".

Examine the report and delete those backups that are obsolete.

RMAN> report obsolete;
   
 
    RMAN-03022: compiling command: report
Report of obsolete backups and copies
Type                 Recid  Stamp     Filename
-------------------- ------ --------- --------------------------
Backup Set           4      345390311
Backup Piece         4      345390310 /oracle/dbs/04a9cf76_1_1

RMAN> allocate channel for delete type disk;
 
RMAN-03022: compiling command: allocate
RMAN-03023: executing command: allocate
RMAN-08030: allocated channel: delete
RMAN-08500: channel delete: sid=11 devtype=DISK
 
RMAN> change backuppiece '/oracle/dbs/04a9cf76_1_1' delete;
 
RMAN-03022: compiling command: change
RMAN-03023: executing command: change
RMAN-08073: deleted backup piece
RMAN-08517: backup piece handle=/oracle/dbs/04a9cf76_1_1 recid=4 stamp=345390310
RMAN-03023: executing command: partial resync
RMAN-08003: starting partial resync of recovery catalog
RMAN-08005: partial resync complete

============================
To report the database schema at a specified point in time:

You must use a recovery catalog for reporting on database schema at a past time, SCN, or log sequence number.

Start RMAN and connect to the target database and the recovery catalog database. For example, enter:

% rman target / catalog rman/rman@rcat

If you want to write the output to a message log file, specify the file at startup:

% rman target / catalog rman/rman@rcat log "/oracle/log/mlog.f'

Issue report schema for a list of all the datafiles and tablespaces in the target database at the current time:

report schema;

Use the untilClause to specify a past time, SCN, or log sequence number:

report schema at time 'SYSDATE-14';
report schema at scn 1000;
report schema at logseq 100;

Examine the report. For example, here is sample output:

RMAN> report schema at scn 1000;
RMAN-03022: compiling command: report

Report of database schema
File K-bytes    Tablespace           RB segs Name
---- ---------- -------------------- ------- -------------------
1         35840 SYSTEM               YES     /vobs/oracle/dbs/tbs_01.f
2           978 SYSTEM               YES     /vobs/oracle/dbs/tbs_02.f
3           978 TBS_1                NO      /vobs/oracle/dbs/tbs_11.f
4           978 TBS_1                NO      /vobs/oracle/dbs/tbs_12.f
5           978 TBS_2                NO      /vobs/oracle/dbs/tbs_21.f
6           978 TBS_2                NO      /vobs/oracle/dbs/tbs_22.f

===============================
Deleting Obsolete Backups

In this scenario, assume that you want to delete the following:

Datafile copies for which there are at least two more recent copies.

Datafile backups for which there are at least two more recent backups or image copies of each datafile contained in the backup set.

Generate a report with redundancy set to 2:

report obsolete redundancy 2;

RMAN-03022: compiling command: report
Report of obsolete backups and copies
Type                 Recid  Stamp     Filename
-------------------- ------ --------- --------------------------
Datafile Copy        23     345392880 /vobs/oracle/dbs/tbs_01.copy
Datafile Copy        22     345392456 /vobs/oracle/dbs/tbs_01_copy.f
Backup Set           31     345552065
Backup Piece         31     345552061 /vobs/oracle/dbs/0va9hd5o_1_1
Backup Set           23     345399397
Backup Piece         23     345399391 /vobs/oracle/dbs/0ma9co2p_1_1
Backup Set           20     345397468
Backup Piece         20     345397464 /vobs/oracle/dbs/0ka9cm6l_1_1

Issue change ... delete commands for the copies and backups. Use the filenames or issue a list command to obtain the primary keys:

allocate channel for delete type disk;
change backuppiece '/vobs/oracle/dbs/0va9hd5o_1_1', '/vobs/oracle/dbs/0ma9co2p_1_1',
   '/vobs/oracle/dbs/0ka9cm6l_1_1' delete;
change datafilecopy '/vobs/oracle/dbs/tbs_01.copy', '/vobs/oracle/dbs/tbs_01_copy.f'
   delete;
release channel;

==============================
创建rman catalog

--To create the recovery catalog schema in the recovery catalog database:

Start SQL*Plus and then connect with administrator privileges to the database containing the recovery catalog. For example, enter:
CONNECT SYS/oracle@catdb AS SYSDBA

Create a user and schema for the recovery catalog. For example, enter:
CREATE USER rman924 IDENTIFIED BY rman924
  TEMPORARY TABLESPACE temp
  DEFAULT TABLESPACE system
  QUOTA UNLIMITED ON system;

Grant the RECOVERY_CATALOG_OWNER role to the schema owner. This role provides the user with privileges to maintain and query the recovery catalog.
SQL> GRANT RECOVERY_CATALOG_OWNER TO rman924;

Grant other desired privileges to the RMAN user.
SQL> GRANT CONNECT, RESOURCE TO rman924;

--To create the recovery catalog:

Connect to the database that will contain the catalog as the catalog owner. For example, enter the following from the operating system command line:
% rman CATALOG rman924/rman924

You can also connect from the RMAN prompt:

% rman
RMAN> CONNECT CATALOG rman/cat@catdb

Run the CREATE CATALOG command to create the catalog. If the catalog tablespace is this user's default tablespace, then you can run this command:
CREATE CATALOG;

Note that the creation of the catalog can take several minutes.

Optionally, start SQL*Plus and query the recovery catalog to see which tables were created:
SQL> SELECT TABLE_NAME FROM USER_TABLES;

--To register the target database:

Connect to the target database and recovery catalog database. For example, issue the following to connect to the catalog database catdb as user rman (who owns the catalog schema):
% rman TARGET / CATALOG rman/cat@catdb

If the target database is not mounted, then mount or open it. For example, issue:
STARTUP MOUNT;

The recovery catalog database must be open.

To use RMAN with a target database, you must first register the database. Run the following command:
REGISTER DATABASE;

After you run REGISTER DATABASE, RMAN creates rows in the repository that contain information about the target database. Then, RMAN performs a full resynchronization with the catalog in which it transfers all pertinent data about the target database from the control file and saves it in the catalog.

Test that the registration was successful by running REPORT SCHEMA. This command shows the database structure as it is stored in the repository. For example:
RMAN> REPORT SCHEMA;

Report of database schema
File K-bytes    Tablespace           RB segs Datafile Name
---- ---------- -------------------- ------- -------------------
1        307200 SYSTEM               ***     /oracle/oradata/trgt/system01.dbf
2         20480 UNDOTBS              ***     /oracle/oradata/trgt/undotbs01.dbf
3         10240 CWMLITE              ***     /oracle/oradata/trgt/cwmlite01.dbf
4         10240 DRSYS                ***     /oracle/oradata/trgt/drsys01.dbf
5         10240 EXAMPLE              ***     /oracle/oradata/trgt/example01.dbf
6         10240 INDX                 ***     /oracle/oradata/trgt/indx01.dbf
7         10240 TOOLS                ***     /oracle/oradata/trgt/tools01.dbf
8         10240 USERS                ***     /oracle/oradata/trgt/users01.dbf

If there are any existing user-created copies of datafiles or archived logs on disk that were created under Oracle release 8.0 or higher, you can add them to the recovery catalog with the CATALOG command. For example:
CATALOG DATAFILECOPY '/tmp/users01.dbf';
CATALOG ARCHIVELOG '/tmp/archive1_731.dbf', '/tmp/archive1_732.dbf';

--To perform a full resynchronization of the recovery catalog:

Connect SQL*Plus to the recovery catalog database, and open the database if it is not already open. For example, enter:
STARTUP

Connect RMAN to the target and recovery catalog databases, and then mount the target database if it is not already mounted. For example, enter:
STARTUP MOUNT;

Run the RESYNC CATALOG command at the RMAN prompt:
RESYNC CATALOG;

--http://www.oracle.com.cn/onlinedoc/server.920/a96566/rcmrepos.htm#449434

run {
allocate channel dev1_1 type 'sbt_tape'
parms='SBT_LIBRARY=/opt/CA/BABoraagt/libobk64.so,ENV=(PARENT_JOBID=190,SBT_PARMS=10.254.2.5;<NULL>;<NULL>;<NULL>;<NULL>;ALL;FALSE;FALSE;<NULL>;<NULL>;FALSE;0;0;5;0)';
restore archivelog from logseq = 2875 until logseq = 2899 thread = 1;
release channel dev1_1;
}

run {
allocate channel dev1_1 type 'sbt_tape'
parms='SBT_LIBRARY=/opt/CA/BABoraagt/libobk64.so,ENV=(PARENT_JOBID=190,SBT_PARMS=10.254.2.5;<NULL>;<NULL>;<NULL>;<NULL>;ALL;FALSE;FALSE;<NULL>;<NULL>;FALSE;0;0;5;0)';
restore archivelog from time = "to_date ('02/02/2007:13:37:00', 'dd/mm/yyyy:hh24:mi:ss')" until time = "to_date ('04/02/2007:13:37:00', 'dd/mm/yyyy:hh24:mi:ss')";
release channel dev1_1;
}

run {
allocate channel dev1_1 type 'sbt_tape' format '%u_%p_%c'
parms='SBT_LIBRARY=/opt/CA/BABoraagt/libobk64.so,ENV=(PARENT_JOBID=77,SBT_PARMS=10.254.2.5;003;ARCHIVE LOG;<NULL>;<NULL>;ALL;FALSE;FALSE;<NULL>;<NULL>;FALSE;0;0;5;0)';
sql 'alter system archive log current';
backup archivelog from time 'sysdate-3' all delete input  ;
release channel dev1_1;
}

run {
allocate channel dev1_1 type 'sbt_tape' format '%u_%p_%c'
parms='SBT_LIBRARY=/opt/CA/BABoraagt/libobk64.so,ENV=(PARENT_JOBID=77,SBT_PARMS=10.254.2.5;003;ARCHIVE LOG;<NULL>;<NULL>;ALL;FALSE;FALSE;<NULL>;<NULL>;FALSE;0;0;5;0)';
sql 'alter system archive log current';
backup archivelog until time 'sysdate-1' delete input  ;
release channel dev1_1;
}

RMAN> backup archivelog from time '01-jan-00' until time '30-jun-00';
RMAN> backup archivelog like 'oracle/arc/dest/log%';
RMAN> backup archivelog all;
RMAN> backup archivelog from logseq 20 until logseq 50 thread 1; ...

--catalog

--change backupset to unavailable

RMAN> change backupset 150 unavailable;

changed backup piece unavailable
backup piece handle=D:\CONTROL06.CTL recid=8 stamp=621551818
Changed 1 objects to UNAVAILABLE status

RMAN> change backupset 150 available;

using channel ORA_DISK_1
changed backup piece available
backup piece handle=D:\CONTROL06.CTL recid=8 stamp=621551818
Changed 1 objects to AVAILABLE status

RMAN> change backup of controlfile unavailable;

changed backup piece unavailable
backup piece handle=C:\BAK_01IFKK3J_%C_%P.BAK recid=1 stamp=620384375
changed backup piece unavailable
backup piece handle=D:\ORACLE9I\ORA92\DATABASE\05IFL60J_1_1 recid=5 stamp=620402709
changed backup piece unavailable
backup piece handle=D:\CONTROL06.CTL recid=8 stamp=621551818
Changed 3 objects to UNAVAILABLE status

RMAN> change copy of archivelog sequence between 10 and 21 unavailable;

RMAN> list backup of archivelog all;

--keep backupset

RMAN> change backupset 150 keep forever nologs;

using channel ORA_DISK_1
keep attributes for the backup are changed
backup will never be obsolete
archived logs required to recover from this backup will not be kept
backup set key=150 recid=8 stamp=621551818

--unkeep backupset

RMAN> change backupset 150 nokeep;

using channel ORA_DISK_1
keep attributes for the backup are deleted
backup set key=150 recid=8 stamp=621551818

--catalog datafilecopy

RMAN> catalog datafilecopy 'D:\EXAMPLE01.DBF';

RMAN> list copy;

List of Datafile Copies
Key     File S Completion Time Ckp SCN    Ckp Time        Name
------- ---- - --------------- ---------- --------------- ----
140     5    A 02-MAY-07       881239     02-MAY-07       D:\EXAMPLE01.DBF

--uncatalog datafilecopy

RMAN> change datafilecopy 'D:\EXAMPLE01.DBF' uncatalog;

uncataloged datafile copy
datafile copy filename=D:\EXAMPLE01.DBF recid=3 stamp=621550374
Uncataloged 1 objects

--catalog archivelog

RMAN> catalog archivelog 'd:\ARC00026.001','d:\ARC00027.001';

cataloged archive log
archive log filename=D:\ARC00026.001 recid=41 stamp=621551313
cataloged archive log
archive log filename=D:\ARC00027.001 recid=42 stamp=621551313

RMAN> list archivelog all;

List of Archived Log Copies
Key     Thrd Seq     S Low Time  Name
------- ---- ------- - --------- ----
143     1    26      A 20-APR-07 D:\ARC00026.001
144     1    27      A 22-APR-07 D:\ARC00027.001

--uncatalog archivelog

RMAN> change archivelog 'D:\ARC00027.001' uncatalog;

uncataloged archive log
archive log filename=D:\ARC00028.001 recid=43 stamp=621551405
Uncataloged 1 objects

RMAN> list archivelog all;

List of Archived Log Copies
Key     Thrd Seq     S Low Time  Name
------- ---- ------- - --------- ----
143     1    26      A 20-APR-07 D:\ARC00026.001

--也可以用delete彻底删除备份文件及物理文件

RMAN> delete archivelog 'D:\ARC00026.001';

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=18 devtype=DISK

List of Archived Log Copies
Key     Thrd Seq     S Low Time  Name
------- ---- ------- - --------- ----
154     1    26      A 20-APR-07 D:\ARC00026.001

Do you really want to delete the above objects (enter YES or NO)? y
deleted archive log
archive log filename=D:\ARC00026.001 recid=44 stamp=621552279
Deleted 1 objects

--catalog controlfilecopy

SQL> alter database backup controlfile to 'd:\control.ctl';  --要用backup controlfile备份 ,否则rman不会识别controlfile header

Database altered.

RMAN> catalog controlfilecopy 'd:\CONTROL.CTL' ;

cataloged controlfile copy
controlfile copy filename=D:\CONTROL.CTL recid=5 stamp=621555113

RMAN> list copy;

List of Controlfile Copies
Key     S Completion Time Ckp SCN    Ckp Time        Name
------- - --------------- ---------- --------------- ----
166     A 02-MAY-07       893935     02-MAY-07       D:\CONTROL.CTL

--uncatalog controlfilecopy

RMAN> change controlfilecopy 'D:\CONTROL.CTL' uncatalog;

uncataloged controlfile copy
controlfile copy filename=D:\CONTROL.CTL recid=5 stamp=621555113
Uncataloged 1 objects

--从指定的备份集中恢复control 和 spfile文件

RMAN> restore controlfile to 'd:\backup\control01.ctl' from 'D:\backup\BAK_01IJMF84_1_1.BAK';

启动 restore 于 08-6月 -07

使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在恢复控制文件
通道 ORA_DISK_1: 恢复完成
完成 restore 于 08-6月 -07

RMAN> restore spfile to 'd:\backup\init01.ora' from 'D:\backup\BAK_01IJMF84_1_1.BAK';

启动 restore 于 08-6月 -07

使用通道 ORA_DISK_1
通道 ORA_DISK_1: 已找到的自动备份: D:\backup\BAK_01IJMF84_1_1.BAK
通道 ORA_DISK_1: 从自动备份复原 SPFILE 已完成
完成 restore 于 08-6月 -07

RMAN> RUN {
  backup incremental level 0 format 'd:\backup\%U' filesperset 5
  (database include current controlfile);
  sql 'alter system archive log current’;              
  }

--alter tablespace begin backup

SQL> select FILE#,STATUS,CREATION_CHANGE#,CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# STATUS  CREATION_CHANGE# CHECKPOINT_CHANGE#
---------- ------- ---------------- ------------------
         1 ONLINE                11             857392
         2 ONLINE            187697             857392
         3 ONLINE              6283             857392
         4 ONLINE              6302             857392
         5 ONLINE              6324             857392
         6 ONLINE              6343             857392
         7 ONLINE              6363             857392
         8 ONLINE              6382             857392
         9 ONLINE              6401             857392
        10 ONLINE              6420             857392
        12 ONLINE            537521             857392

已选择11行。

SQL> alter tablespace users begin backup;

表空间已更改。

SQL> select * from v$backup;

FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ----------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
         6 NOT ACTIVE                  0
         7 NOT ACTIVE                  0
         8 NOT ACTIVE                  0
         9 ACTIVE                 857881 08-8月 -07
        10 NOT ACTIVE                  0
        12 NOT ACTIVE                  0

已选择11行。

SQL> select FILE#,STATUS,CREATION_CHANGE#,CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# STATUS  CREATION_CHANGE# CHECKPOINT_CHANGE#
---------- ------- ---------------- ------------------
         1 ONLINE                11             857392
         2 ONLINE            187697             857392
         3 ONLINE              6283             857392
         4 ONLINE              6302             857392
         5 ONLINE              6324             857392
         6 ONLINE              6343             857392
         7 ONLINE              6363             857392
         8 ONLINE              6382             857392
         9 ONLINE              6401             857881
        10 ONLINE              6420             857392
        12 ONLINE            537521             857392

已选择11行。

SQL> alter system checkpoint;

系统已更改。

SQL> select FILE#,STATUS,CREATION_CHANGE#,CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# STATUS  CREATION_CHANGE# CHECKPOINT_CHANGE#
---------- ------- ---------------- ------------------
         1 ONLINE                11             858228
         2 ONLINE            187697             858228
         3 ONLINE              6283             858228
         4 ONLINE              6302             858228
         5 ONLINE              6324             858228
         6 ONLINE              6343             858228
         7 ONLINE              6363             858228
         8 ONLINE              6382             858228
         9 ONLINE              6401             857881
        10 ONLINE              6420             858228
        12 ONLINE            537521             858228

已选择11行。

SQL> alter tablespace users end backup;

表空间已更改。

SQL> select FILE#,STATUS,CREATION_CHANGE#,CHECKPOINT_CHANGE# from V$DATAFILE_HEADER;

FILE# STATUS  CREATION_CHANGE# CHECKPOINT_CHANGE#
---------- ------- ---------------- ------------------
         1 ONLINE                11             858228
         2 ONLINE            187697             858228
         3 ONLINE              6283             858228
         4 ONLINE              6302             858228
         5 ONLINE              6324             858228
         6 ONLINE              6343             858228
         7 ONLINE              6363             858228
         8 ONLINE              6382             858228
         9 ONLINE              6401             858228
        10 ONLINE              6420             858228
        12 ONLINE            537521             858228

已选择11行。

SQL> alter tablespace users begin backup;

表空间已更改。

SQL> select * from v$backup;

FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ----------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
         6 NOT ACTIVE                  0
         7 NOT ACTIVE                  0
         8 NOT ACTIVE                  0
         9 ACTIVE                 859047 08-8月 -07
        10 NOT ACTIVE                  0
        12 NOT ACTIVE                  0

已选择11行。

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 8月 8 11:29:52 2007

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn /as sysdba
已连接到空闲例程。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> ALTER DATABASE END BACKUP;

数据库已更改。

SQL> select *from v$backup;

FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ----------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
         6 NOT ACTIVE                  0
         7 NOT ACTIVE                  0
         8 NOT ACTIVE                  0
         9 NOT ACTIVE             859047 08-8月 -07
        10 NOT ACTIVE                  0
        12 NOT ACTIVE                  0

已选择11行。

SQL> alter database open;

数据库已更改。

SQL> select *from v$backup;

FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ----------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
         6 NOT ACTIVE                  0
         7 NOT ACTIVE                  0
         8 NOT ACTIVE                  0
         9 NOT ACTIVE             859047 08-8月 -07
        10 NOT ACTIVE                  0
        12 NOT ACTIVE                  0

已选择11行。

--并行备份
run {
     allocate channel c1 device type disk maxpiecesize=60M;
     allocate channel c2 device type disk maxpiecesize=60M;
     allocate channel c3 device type disk maxpiecesize=60M;
     backup
   incremental level = 0
   format 'd:\backup\df_%d_%s_%p.bak'
   (datafile 1,4,5 channel c1 tag=DF1)
   (datafile 2,3,9,10 channel c2 tag=DF2)
   (datafile 6,7,8,12 channel c3 tag=DF3);
     sql 'alter system archive log current';
  }

RMAN> BACKUP COPIES 2 DATAFILE 1 DATAFILE 2 FORMAT '/BACKUP1/%U','/BACKUP2/%U';

--设置maxsetsize
当备份的结果集的大小超过maxsetsize的时候,那么就会返回错误。

RMAN> show all;

RMAN 配置参数为:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 3;
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT   'd:\backup\database_%U.bak';
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\ORA92\DATABASE\SNCFORACLE.ORA'; # default

RMAN> CONFIGURE MAXSETSIZE TO 100m;

新的 RMAN 配置参数:
CONFIGURE MAXSETSIZE TO 100 M;
已成功存储新的 RMAN 配置参数

RMAN> backup database;

启动 backup 于 08-8月 -07
使用通道 ORA_DISK_1
使用通道 ORA_DISK_2
使用通道 ORA_DISK_3
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 08/08/2007 16:54:52
RMAN-06183: datafile or datafilecopy larger than SETSIZE: file# 1 D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF

--手工备份spfile
RMAN> BACKUP COPIES 2 DEVICE TYPE disk SPFILE;

--检测备份
SELECT sid, serial#, context, sofar, totalwork,
        round(sofar/totalwork*100,2) "% Complete"
  FROM v$session_longops
  WHERE opname LIKE 'RMAN:%'
  AND opname NOT LIKE 'RMAN: aggregate%';

SELECT sid, spid, client_info
 FROM v$process p, v$session s
 WHERE p.addr = s.paddr
 AND client_info LIKE '%id=rman%';

SELECT sid, serial#, context, sofar, totalwork
  FROM v$session_longops
  WHERE opname LIKE 'RMAN:%'
  AND opname NOT LIKE 'RMAN: aggregate%';  
  
  
  
  
  
--基于sequence 的不完全恢复

RMAN> run {
2> set until sequence 5 thread 1;
3> restore database;
4> recover database;
5> alter database open resetlogs;
6> }

--基于scn 的不完全恢复

RMAN> run {
2> set until scn=873333;
3> restore database;
4> recover database;
5> alter database open resetlogs;
6> }

--duration

run {
backup as backupset format '/u01/%U.bak' duration 2:00 minimize load (database);
}

--rman encryption test

1. Create a wallet: automatically or by using Oracle Wallet Manager.
2. Open the wallet from within your instance:
SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY <password>;
3. Set the master key from within your instance:
SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY <password>;
4. Configure RMAN to use transparent encryption:
RMAN> CONFIGURE ENCRYPTION FOR DATABASE ON
5. There are no changes to your backup or recover commands.
6. Permanent configuration can be temporarily overwritten:
SQL>    SET ENCRYPTION OFF

--Password Mode Setup
1. Set your RMAN session to use password encryption:
RMAN> SET ENCRYPTION ON IDENTIFIED BY password ONLY

2. There are no changes to your backup commands.
Set your RMAN session to decrypt password-encrypted backups:
RMAN> SET DECRYPTION IDENTIFIED BY password1 {, password2,…, passwordn}

4. There are no changes to your recover commands.

SQL> alter system set encryption wallet open identified by QAZ12WSX;
 
System altered.

RMAN> backup datafile 4;
 
Starting backup at 18-SEP-07
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00004 name=/u01/oracle/product/10.2.0/oradata/orcl/users01.dbf
channel ORA_DISK_1: starting piece 1 at 18-SEP-07
channel ORA_DISK_1: finished piece 1 at 18-SEP-07
piece handle=/u01/1eis8gih_1_1.bak tag=TAG20070918T131705 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:30
Finished backup at 18-SEP-07
 
Starting Control File and SPFILE Autobackup at 18-SEP-07
piece handle=/u01/oracle/product/10.2.0/db_1/flash_recovery_area/ORCL/autobackup/2007_09_18/o1_mf_s_633619056_3gyqvl7s_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 18-SEP-07

SQL> alter tablespace users offline;
 
Tablespace altered.

RMAN> restore datafile 4;
 
Starting restore at 18-SEP-07
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=152 devtype=DISK
 
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00004 to /u01/oracle/product/10.2.0/oradata/orcl/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/1eis8gih_1_1.bak
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 09/18/2007 13:20:11
ORA-19870: error reading backup piece /u01/1eis8gih_1_1.bak
ORA-19913: unable to decrypt backup
ORA-28365: wallet is not open

SQL> alter system set encryption wallet open identified by QAZ12WSX;
 
System altered.

RMAN> restore datafile 4;
 
Starting restore at 18-SEP-07
using channel ORA_DISK_1
 
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00004 to /u01/oracle/product/10.2.0/oradata/orcl/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/1eis8gih_1_1.bak
channel ORA_DISK_1: restored backup piece 1
piece handle=/u01/1eis8gih_1_1.bak tag=TAG20070918T131705
channel ORA_DISK_1: restore complete, elapsed time: 00:00:39
Finished restore at 18-SEP-07

RMAN> set encryption identified by oracle;
 
executing command: SET encryption
 
RMAN> backup datafile 4;
 
Starting backup at 18-SEP-07
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00004 name=/u01/oracle/product/10.2.0/oradata/orcl/users01.dbf
channel ORA_DISK_1: starting piece 1 at 18-SEP-07
channel ORA_DISK_1: finished piece 1 at 18-SEP-07
piece handle=/u01/1his8h0i_1_1.bak tag=TAG20070918T132434 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:45
Finished backup at 18-SEP-07
 
Starting Control File and SPFILE Autobackup at 18-SEP-07
piece handle=/u01/oracle/product/10.2.0/db_1/flash_recovery_area/ORCL/autobackup/2007_09_18/o1_mf_s_633619520_3gyrb3wc_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 18-SEP-07

--restart database
 
RMAN> restore datafile 4;
 
Starting restore at 18-SEP-07
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=134 devtype=DISK
 
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00004 to /u01/oracle/product/10.2.0/oradata/orcl/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/1his8h0i_1_1.bak
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 09/18/2007 14:03:22
ORA-19870: error reading backup piece /u01/1his8h0i_1_1.bak
ORA-19913: unable to decrypt backup
ORA-28365: wallet is not open

RMAN> set decryption identified by oracle;
 
executing command: SET decryption
 
RMAN> restore datafile 4;
 
Starting restore at 18-SEP-07
using channel ORA_DISK_1
 
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00004 to /u01/oracle/product/10.2.0/oradata/orcl/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/1his8h0i_1_1.bak
channel ORA_DISK_1: restored backup piece 1
piece handle=/u01/1his8h0i_1_1.bak tag=TAG20070918T132434
channel ORA_DISK_1: restore complete, elapsed time: 00:00:53
Finished restore at 18-SEP-07

RMAN> RUN
{
  SET MAXCORRUPT FOR DATAFILE 1 TO 10;
  BACKUP DATABASE
    SKIP INACCESSIBLE
    SKIP READONLY
    SKIP OFFLINE;
}

RMAN> RUN
{
  SET MAXCORRUPT FOR DATAFILE 1 TO 10;
  BACKUP DATABASE
    SKIP INACCESSIBLE
    SKIP READONLY
    SKIP OFFLINE reuse ;                                           --如果文件存在,则覆盖旧的文件
}

RMAN> RUN {
          ALLOCATE CHANNEL c1 DEVICE TYPE disk maxpiecesize=50m;
          ALLOCATE CHANNEL c2 DEVICE TYPE disk maxpiecesize=60m;
          ALLOCATE CHANNEL c3 DEVICE TYPE disk maxpiecesize=70m;
          BACKUP
        INCREMENTAL LEVEL = 0
        FORMAT '/u01/oracle/df_%d_%s_%p.bak'
        (DATAFILE 1,4,5 CHANNEL c1)
        (DATAFILE 2,3 CHANNEL c2)
        (DATAFILE 6 CHANNEL c3);
        SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
       }
      
      
      
--Duplicating a Database using RMAN
By Michael Ritacco, Oraclenotes.com

Run the script below on the database in which you plan to duplicate to generate the new paths for the data files. This example assumes you have enough disk space on one mount point. However, you can easily change some of the mount points in VI to point another location or modify the script to suit your specific needs.
select 'set auxname for datafile ' || file# || ' to ' || '''/ora<XXX>/oradata/<SID>' ||
substr(name, instr(name, '/', -1)) || ''';'
from v$datafile
/

Create the RMAN script to perform the duplicate. The number of log groups must match the source database. You may increase or decrease the number of log members as needed. You must also insert your auxname commands before the rman run block. If you are not doing a point in time dupilcate you can remove the optional line "set until time ...".

----------------------------------------------------------------------------------------------------------
connect target sys/<password>@<sid>
connect auxiliary /
connect catalog rman/<password>@<sid>

<Insert data file rename commands from step 1>

run {
-- Optional Line -- set until time '2001-12-18:08:30:00';
allocate auxiliary channel a0 type <DISK/SBT_TAPE>;
allocate auxiliary channel a1 type <DISK/SBT_TAPE>;
allocate auxiliary channel a2 type <DISK/SBT_TAPE>;
allocate auxiliary channel a3 type <DISK/SBT_TAPE>;
allocate auxiliary channel a4 type <DISK/SBT_TAPE>;
allocate auxiliary channel a5 type <DISK/SBT_TAPE>;
allocate auxiliary channel a6 type <DISK/SBT_TAPE>;
allocate auxiliary channel a7 type <DISK/SBT_TAPE>;
allocate auxiliary channel a8 type <DISK/SBT_TAPE>;
allocate auxiliary channel a9 type <DISK/SBT_TAPE>;
allocate auxiliary channel a10 type <DISK/SBT_TAPE>;
allocate auxiliary channel a11 type <DISK/SBT_TAPE>;
allocate auxiliary channel a12 type <DISK/SBT_TAPE>;
allocate auxiliary channel a13 type <DISK/SBT_TAPE>;
allocate auxiliary channel a14 type <DISK/SBT_TAPE>;
allocate auxiliary channel a15 type <DISK/SBT_TAPE>;
duplicate target database to <NEW_SID>
logfile
group 1 ('/ora<XXX>/oradata/<SID>/redo01_01.rdo') size 200M reuse,
group 2 ('/ora<XXX>/oradata/<SID>/redo02_01.rdo') size 200M reuse,
group 3 ('/ora<XXX>/oradata/<SID>/redo03_01.rdo') size 200M reuse,
group 4 ('/ora<XXX>/oradata/<SID>/redo04_01.rdo') size 200M reuse;
}
----------------------------------------------------------------------------------------------------------

Log into the server where you will be duplicating the database.

If you are using RMAN duplicate to refresh a TEST or Development database first. Shutdown the instance if it already running.

You will need to recreate/create the password file on for the target database.
You do not have to delete the data files of the existing database if one exists (applicable to only a refresh). It would be a good idea to do so if you are not sure that the source and the target you are duplicating too has the same name and number of data files. If not you will have unused data files on the duplicate database, wasting server resources.

STARTUP NOMOUNT the Target database.
Note: You must have an adequately sized SORT_AREA_SIZE for RMAN to do its quering against the auxiliary database since it will not have any temp space available in NOMOUNT.

For the recovery part of the duplicate you will need the archive logs of the source database available. The archive logs can be copied over from the production machine to the target machine as long as the archive logs are placed in the exact path as on the production machine. Otherwise, you must do an archive log backup via Rman to either disk or tape. Remember that if you use a combination of Disk and Tape backups to allocate channels for both tape and disk in your script.

If you are doing a duplicate from a point in time you must set the NLS environmental variables. If not you can skip this step.

C- Shell
setenv NLS_LANG american
setenv NLS_DATE_FORMAT YYYY-MM-DD:HH24:MI:SS
Korn Shell
export NLS_LANG= American
export NLS_DATE_FORMAT= YYYY-MM-DD:HH24:MI:SS

Run the completed duplicate script
$ rman @runscript
Note: If for any reason the duplicate fails due to missing archive log file or any other reason, it is still possible to finish the recovery manually, however the DBID will not be reset. Also, If you are duplicating a Multimaster replicated production database be sure to set job_queue_processes=0 to avoid pushing replication transactions to your production databases.

Make sure your global name is set correctly fro your target database because RMAN does not set this for you. It is also important to note that if you change the domain you must rebuild any database links.
SQL> select * from global_name;
SQL> alter database rename global_name to <new name>;

Remember to add any temporary files for any tablespaces that are using them.
Change any passwords for the new database.

--从备份片中提取SPFILE和controlfile和datafile
declare
devtype varchar2(256);
done boolean;
begin
devtype :=dbms_backup_restore.deviceallocate(type=>'',ident=>'t1');
--extraction SPFILE和controlfile
dbms_backup_restore.restoresetdatafile;
dbms_backup_restore.restorespfileto(sfname=>'d:\spfiledemo.ora');
dbms_backup_restore.RestoreControlfileTo(cfname=>'d:\control01.ora');
dbms_backup_restore.restorebackuppiece(done=>done,handle=>'D:\RMAN\C-1330771873-20070621-23',params=>null);
--extraction datafile
dbms_backup_restore.restoresetdatafile;
dbms_backup_restore.RestoreDataFileTo(dfnumber=>9,toname=>'e:\user01.dbf');
dbms_backup_restore.restorebackuppiece(done=>done,handle=>'D:\RMAN\DEMO_48_1_20070621_625840695.BK',params=>null);
--extraction archivedlog
dbms_backup_restore.RestoreSetArchivedLog;
dbms_backup_restore.RestoreArchivedLogRange;
dbms_backup_restore.restorebackuppiece(done=>done,handle=>'D:\RMAN\DEMO_49_1_20070621_625840742.BK',params=>null);
dbms_backup_restore.devicedeallocate;
end;
/

#############################################
ERROR 位于第 1 行:
ORA-19568: 设备已配置给此会话
ORA-06512: 在"SYS.DBMS_BACKUP_RESTORE", line 137
ORA-06512: 在"SYS.DBMS_BACKUP_RESTORE", line 111
ORA-06512: 在line 5

解决方法:释放通道
execdbms_backup_restore.devicedeallocate;

SQL> exec dbms_backup_restore.devicedeallocate;
-----------------------------------------------
ERROR 位于第 1 行:
ORA-19590: 对话正在进行中
ORA-06512: 在"SYS.DBMS_BACKUP_RESTORE", line 1171
ORA-06512: 在"SYS.DBMS_BACKUP_RESTORE", line 1159
ORA-06512: 在line 6

解决方法:释放游标
SQL> conn / as sysdba
已连接。
##############################################

--test
SQL> recover tablespace tbs1 test;
ORA-00279: change 34365545655 generated at 04/07/2009 11:04:27 needed for
thread 1
ORA-00289: suggestion : C:\ORACLE\ORA92\RDBMS\ARC00075.001
ORA-00280: change 34365545655 for thread 1 is in sequence #75

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-10574: Test recovery did not corrupt any data block
ORA-10573: Test recovery tested redo from change 34365545655 to 34365545656
ORA-10572: Test recovery canceled due to errors
ORA-10585: Test recovery can not apply redo that may modify control file

RUN
{
SET ARCHIVELOG DESTINATION TO '/u02/tmp_restore';
RESTORE ARCHIVELOG ALL;
# restore datafiles as needed
}

--利用RATE参数限制RMAN备份的IO速度!收藏
利用RATE参数限制RMAN备份的IO速度!

ORACLE真是博大精深呀。只有你想不到的没有ORACLE做不到的。。比如为了减少在RMAN备份时对系统特别是OLTP系统性能的影响。我们可以利用RATE这个参数。现举一例,
RMAN> connect target
connected to target database: CPPRD (DBID=839729677)
using target database controlfile instead of recovery catalog
RMAN> show all;
RMAN configuration parameters are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/global/oracle2/orahome2/product/9.2.0/dbs/snapcf_CPPRD.f'; # default
RMAN>backup database;
another window :
vmstat 3
tin tout kps tps serv  kps tps serv  kps tps serv  kps tps serv   us sy wt id
   0   28 16948 164  142    3   0    8  17443 282   11    3   0   10    2  8 19 72
   1   80 13580 221  215    3   0    5  14659 238   11    3   0   15    2  8 17 74
   1  701 14953 194  170    3   0    6  13624 218   11    3   0    8    1  8 16 74
   0   28 17594 157  126    3   0    7  18835 310   11    3   0   33    2 10 23 66
   0   28 14591 175  163    3   0    7  14806 240   11    3   0   23    1 10 18 71
   0   28 15618 187  169    3   0    8  15256 249   10    3   0   12    2  8 17 73
   0   28 16298 176  125    3   0    8  14987 250   10    3   0    7    1  9 17 72
   0   28 14321 208  177    3   1    7  15024 243   11    3   1   59    1 11 18 69
   0   28 13044 217  179    3   0    8  13104 212    9    3   0   18    1  9 11 78
   0   28 14099 199  156    3   0    7  12992 212    9    3   0   75    2  9 15 74
   0   28 12370 201  178    3   0    8  13312 220   10    3   0   19    2  8 15 75
   1   28 13087 214  156    3   0    8  11875 212    9    3   0   14    3  9 14 74
   1  701 18475 185  151    3   0    7  18176 295    9    3   0    8    2 11 19 69
   0   28 17639 154  103    3   0    7  17119 279    9    3   0   23    2  9 16 73
   0   28 17413 160  103    3   0    7  16654 272   10    3   0   86    2 10 17 71
   0   28 13180 205  214    3   0    8  13797 224   10    3   0   81    1  9 16 74
   0   28 13663 197  180    3   0    7  14371 231   11    3   0   12    1 10 17 72
   0   28 13949 214  171    3   1    7  13440 219   10    3   1   30    1 11 16 72

RMAN>  configure channel device type disk rate 1k ;
RMAN>backup database;
$ iostat 3
   tty       2/md52        2/md62        2/md72        2/md82          cpu
tin tout kps tps serv  kps tps serv  kps tps serv  kps tps serv   us sy wt id
   0    4   8   1    2   23   1    3  158   4  106   17   1    2    8 27  2 62
   0   78   0   0    0    3   0    7    3   0    8    3   0   15    0  3  0 97
   5   27   0   0    0    3   0    8    3   0    9    3   0   16    0  3  0 97
   1   99   4   1   10    8   1    7    8   1   14    8   1   11    2  4  1 93
   0  588 809   9   65   56   7    5   91  11    6   35   4   14    0  4  4 92
   0   27 305   5   42    3   0    6   24   3    8   13   2    7    1  3  2 94
   0   27 703  12   46   35   4    4   16   2    4    8   1   10    0  3  3 94
   0   27 2758  46  101   19   2    4  195  24    4    3   0   19    2  4  3 91
   0   27 1728  29   93   35   4    5    8   1   10    5   1   14    0  3  1 96
   0   27 2773  49   97   27   3    5    5   1   13    8   1   10    0  3  1 96
   0   27 2758  46   98    5   1    6    3   0    0    5   1    7    0  4  0 96
   0   27 3105  52  107    8   1    7    3   0    7    5   1   11    0  4  0 96
   0   27 2420  41   76    5   1    6   11   1   10    5   1   11    0  3  0 96
   0   27 2423  42   84   10   4    5   12   5    7    6   2   11    0  4  1 95
   0   27 2764  47  106   11   1    5    5   1    8    3   0   15    0  4  0 96
   0   27 2804  40  119    5   1    7    3   0    9    5   1   10    0  4  1 95
   0   27 2075  19   58    5   1    6    3   0   10    8   1   10    0  4  1 95
   0   27 2289  21   67    5   1    7    5   1    8   11   1    8    0  4  0 95
   0   27 2417  22   71    8   1    5    3   0    8    3   0   16    0  4  0 96
   tty       2/md52        2/md62        2/md72        2/md82          cpu
tin tout kps tps serv  kps tps serv  kps tps serv  kps tps serv   us sy wt id
   0   27 2347  21   69    5   1    6    3   0   19    3   0    9    0  4  0 96
   0   79 2651  24   59    3   0    7    3   0    8    3   0   19    0  3  0 97
   0   27 1814  16   61    5   1    6    3   0   19    3   0   11    0  3  0 96
   0   27 2328  21   65    8   1    7    3   0    8    3   0   19    0  4  0 95
   0   27 2027  19   59    3   1    6    3   1   11    3   1   13    0  4  0 95
   0  136 1031   9   76    3   0    8    3   0    9    3   0   16    0  3  0 97
   0   27   0   0    0    3   0    6    3   0   10    3   0   16    0  2  0 98

RMAN Channels
rman通道可以手动分配和自动,在10G以前,RUN里的脚本需要手动分配通道

如果脚本里没有allocate 命令,那么服务器就会自动分配通道。。根据RMAN的配置,

如果要查看RMAN配置,可以执行SHOW ALL命令

RMAN> show all;

使用目标数据库控制文件替代恢复目录
db_unique_name 为 ORCL 的数据库的 RMAN 配置参数为:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION ON; 启动RMAN备份 优化
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default 定义默认设备为磁盘
CONFIGURE CONTROLFILE AUTOBACKUP ON;启动控制文件自动备份
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F’;定义控制文件备份格式
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COPY PARALLELISM 1;定义BACKUP的并行度
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default定义备份数据文件设备类型为DISK
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default定义归档日志设备类型为DISK
CONFIGURE MAXSETSIZE TO UNLIMITED; # default备份文件大小不限制
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128′; # default
CONFIGURE COMPRESSION ALGORITHM 'BZIP2′; # default默认压缩类型BZIP2
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'F:\APP\BOSON.SUN\PRODUCT\11.1.0\DB_1\DATABASE\SNCFORCL.ORA’;

一、分配通道:

CONFIGURE DEVICE TYPE  DISK|SBT PARALLELISM N
CONFIGURE DEFAULT DEVICE TYPE DISK|SBT
CONFIGURE CHANNEL
二、定义通道的并行度

CONFIGURE DEVICE TYPE DISK PARALLELISM 2;
三、定义通道缺省的设备类型:

CONFIGURE DEFAULT DEVICE TYPE TO DISK|sbt;

四、自动分配通道的一般配置:

CONFIGURE CHANNEL DEVICE TYPE sbt PARMS='ENV=(NSR_SERVER=bksvr1)';
CONFIGURE CHANNEL DEVICE TYPE DISK RATE 5M(定义磁盘速度) FORMAT="?/oradata/%U";备份格式

五、自动分配通道的一些特殊设置:

CONFIGURE DEVICE TYPE DISK PARALLELISM 3;
CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE = 2M;其他通道最大备份片为2M
CONFIGURE CHANNEL 3 DEVICE TYPE DISK MAXPIECESIZE = 900K; 如果分配通道3,则最大备份片为900K
六、清除通道设置

CONFIGURE DEVICE TYPE DISK CLEAR;     # returns DISK to default PARALLELISM 1
                                      # and backup type to BACKUPSET
CONFIGURE DEFAULT DEVICE TYPE CLEAR;    # returns to default device type of DISK
CONFIGURE CHANNEL DEVICE TYPE sbt CLEAR; # removes all options for sbt channel
CONFIGURE CHANNEL 3 DEVICE TYPE DISK CLEAR; # removes configurations for 3rd ch.
七、分配的并行度和硬件匹配:

RUN
{
  ALLOCATE CHANNEL c1 DEVICE TYPE sbt;
  ALLOCATE CHANNEL c2 DEVICE TYPE sbt;
  ALLOCATE CHANNEL c3 DEVICE TYPE sbt;
  BACKUP DATAFILE 5;
  BACKUP DATAFILE 6;
  BACKUP DATAFILE 7;
}
这个脚本其实只是使用了通道C1,

RUN {   ALLOCATE CHANNEL c1 DEVICE TYPE sbt;   ALLOCATE CHANNEL c2 DEVICE TYPE sbt;   ALLOCATE CHANNEL c3 DEVICE TYPE sbt;   BACKUP DATAFILE 5,6,7; }这个才会同时启用三个通道备份

When all three datafiles are backed up in one command, RMAN recognizes the opportunity for parallelism and can use multiple channels to do the I/O in parallel. When three separate commands are used, RMAN can only perform the backups one at a time, regardless of available channels and I/O devices.

八、手动或自动分配通道一些控制选项:

Control the operating system resources RMAN uses when performing RMAN operations
Affect the degree of parallelism for a backup or restore command
Set limits on I/O bandwidth consumption in kilobytes, megabytes, or gigabytes (ALLOCATE CHANNEL ... RATE, CONFIGURE CHANNEL ... RATE)控制备份磁盘速率
Set limits on the size of backup pieces (the MAXPIECESIZE parameter specified on the CONFIGURE CHANNEL and ALLOCATE CHANNEL commands)控制备份片的大小
Set limits on the size of backup sets (the MAXSETSIZE parameter specified on the BACKUP and CONFIGURE commands)控制备份集大小
Send vendor-specific commands to the media manager (SEND)
Specify vendor-specific parameters for the media manager (ALLOCATE CHANNEL ... PARMS, CONFIGURE CHANNEL ... PARMS)
Specify which instance performs the operation (ALLOCATE CHANNEL ... CONNECT, CONFIGURE CHANNEL ... CONNECT)
九、映像的复制

如果是使用RMAN的映像拷贝,那么如果遇到使用RESTORE恢复文件,并且磁盘上有一份可用的映像拷贝时,可以不必把映像拷贝到源位置,可以使用命令alter database rename datafile 和switch命令,切换到映像的位置上

如果是用户的映像拷贝,那么在拷贝后需要使用CHANGE UNCATALOG

十、分配不同的通道给不同数据文件:

RUN
{
  ALLOCATE CHANNEL c1 DEVICE TYPE sbt PARMS=”ENV=(BACKUP_SERVER=tape_server1)”;
  ALLOCATE CHANNEL c2 DEVICE TYPE sbt PARMS=”ENV=(BACKUP_SERVER=tape_server2)”;
  ALLOCATE CHANNEL c3 DEVICE TYPE sbt PARMS=”ENV=(BACKUP_SERVER=tape_server3)”;
  BACKUP
   (DATAFILE 1,2,3
    CHANNEL c1)
   (DATAFILECOPY '/tmp/system01.dbf’, '/tmp/tools01.dbf’
     CHANNEL c2)
   (ARCHIVELOG FROM SEQUENCE 100 UNTIL SEQUENCE 102 THREAD 1
     CHANNEL c3);
}

shi

十一:多备份集的设置

BACKUP DEVICE TYPE DISK AS BACKUPSET DATABASE PLUS ARCHIVELOG;
BACKUP DEVICE TYPE sbt BACKUPSET ALL; # copies backup sets on disk to tape

BACKUP COPIES 2 DEVICE TYPE sbt BACKUPSET ALL;

BACKUP DEVICE TYPE sbt BACKUPSET COMPLETED BEFORE 'SYSDATE-7′ DELETE INPUT;

This command backs up backup sets that were created more than a week ago from disk to tape, and then deletes them from disk. Note that DELETE INPUT here is equivalent to DELETE ALL INPUT;RMAN deletes all existing copies of the backup set. If you duplexed a backup to four locations, then RMAN deletes all four copies of the pieces in the backup set.

十二、Backups of Image Copies映像的备份

BACKUP AS COPY COPY OF DATABASE
BACKUP AS BACKUPSET COPY OF TABLESPACE tablespace_name
BACKUP AS BACKUPSET COPY OF DATAFILE datafile

十三、RMAN Backup Options: Naming, Sizing, and Speed

名字:

BACKUP TABLESPACE users FORMAT = '/tmp/users_%u%p%c’; 想启动自己的备份名用FORMAT指定

映像备份的名字一般是FORMAT或者DB_FILE_NAME_CONVERT

复制的:

Type of File Meaning of                       %U
Datafile                             data-D-%d_id-%I_TS-%N_FNO-%f_%u
Archived log                          arch-D_%d-id-%I_S-%e_T-%h_A-%a_%u
Control file                          cf-D_%d-id-%I_%u

Using DB_FILE_NAME_CONVERT With BACKUP AS COPY

BACKUP AS COPY TABLESPACE users   DB_FILE_NAME_CONVERT=('/maindisk/oradata/users','/backups/users_ts');还可以使用TAG做备注:# Back up as image copies the datafiles of tablespaces users and tools

# all copies get the TAG 'users_tools'

BACKUP AS COPY TAG users_tools TABLESPACE users, tools;   # Create new copies of all image copies of the database that have the tag  # 'full_cold_copy', and give the new copies the tag 'new_full_cold_copy' BACKUP AS COPY    COPY OF DATABASE      FROM TAG=full_cold_copy      TAG=new_full_cold_copy;备份片的大小:

For example, if datafile 1 is 6GB, you can still restrict the backup piece size for disk backups to 2 GB by configuring an automatic disk channel, and then run a backup as follows:

CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE = 2G; BACKUP AS BACKUPSET DATAFILE 1;IO带宽:CONFIGURE DEVICE TYPE sbt PARALLELISM 2; CONFIGURE DEFAULT DEVICE TYPE TO sbt; CONFIGURE CHANNEL DEVICE TYPE sbt RATE 1M; 十四、备份策略CONFIGURE RETENTION POLICY  TO REDUNDANCY 1; # default obsolete 过期 report obsolete delete obsoletecrosscheckexpired  不可用 report expired  delete expired To configure a retention policy based on a recovery window, use the following command:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;保留距离当前时间7天的备份

To configure a retention policy based on redundancy, use the following command:

CONFIGURE RETENTION POLICY TO REDUNDANCY
 CONFIGURE RETENTION POLICY TO REDUNDANCY 2;

You can also disable the retention policy completely, meaning that RMAN does not consider any backup to be obsolete. To do so, use the following command:

CONFIGURE RETENTION POLICY TO NONE; CHANGE... KEEP and CHANGE... NOKEEP 是否保留过期的备份
# Creates a backup and exempts it from retention policy until last day of 2007 BACKUP DATABASE KEEP UNTIL TIME "TO_DATE('31-DEC-2007' 'dd-mon-yyyy')" NOLOGS;  # Specifies that backupset 2 is no longer exempt from the retention policy CHANGE BACKUPSET 2 NOKEEP;  # Creates a backup that is indefinitely exempt from the retention policy BACKUP TABLESPACE users KEEP FOREVER NOLOGS;

(0)

相关推荐