rman test

= 备份与恢复测试 =
=================================================================================

[1] 控制文件损坏(rman和常规恢复)
[1.1] 有老的备份数据备份和控制文件trace
[测试1] --使用trace恢复 shutdown abort
[测试2] --使用trace恢复 正常shutdown

[@more@]

=================================================================================
= 备份与恢复测试 =
=================================================================================

[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] 分区表空间数据文件基于时间点的恢复测试: 数据文件损坏的恢复




######################################################################################################
# [1] 控制文件损坏(rman和常规恢复) #
######################################################################################################

准备工作
~~~~~~~~
备份
~~~~
C:Documents and Settingslifeng.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:ORACLEORADATAPDFUNDOTBS01.DBF
输入数据文件 fno=00003 name=C:ORACLEORADATAPDFINDX01.DBF
输入数据文件 fno=00005 name=C:ORACLEORADATAPDFUSERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 25-2月 -05
通道 ORA_DISK_2: 正在启动 full 数据文件备份集
通道 ORA_DISK_2: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=C:ORACLEORADATAPDFSYSTEM01.DBF
输入数据文件 fno=00004 name=C:ORACLEORADATAPDFTOOLS01.DBF
通道 ORA_DISK_2: 正在启动段 1 于 25-2月 -05
通道 ORA_DISK_1: 已完成段 1 于 25-2月 -05
段 handle=C:ORACLEORA92DATABASE7GDKT8C_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:56
通道 ORA_DISK_2: 已完成段 1 于 25-2月 -05
段 handle=C:ORACLEORA92DATABASE8GDKT8C_1_1 comment=NONE
通道 ORA_DISK_2: 备份集已完成, 经过时间:00:00:57
完成 backup 于 25-2月 -05

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

RMAN>

~~~~~~~~~~~
常规备份
~~~~~~~~~~~
备份数据文件cp C:ORACLEORADATAPDF* C:ORACLEORADATAbak
备份控制文件
###################################################
# [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:tempcontrolfile.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:ORACLEORADATAPDFCONTROL01.CTL
C:ORACLEORADATAPDFCONTROL02.CTL
C:ORACLEORADATAPDFCONTROL03.CTL <~~~~~~~~~~~~~~~~
模拟控制文件损坏
~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用ULTRAEDIT编辑CONTROL01.CTL部分数据
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select * from v$controlfile;

STATUS NAME
------- ------------------------------------------------
C:ORACLEORADATAPDFCONTROL01.CTL
C:ORACLEORADATAPDFCONTROL02.CTL
C:ORACLEORADATAPDFCONTROL03.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:oracleadminpdfbdumppdf_ckpt_2556.trc:
ORA-00227: corrupt block detected in controlfile: (block 1, # blocks 1)
ORA-00202: controlfile: 'C:ORACLEORADATAPDFCONTROL01.CTL'

CKPT: terminating instance due to error 227
Fri Feb 25 11:51:58 2005
Errors in file c:oracleadminpdfbdumppdf_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:ORACLEORADATAPDFCONTROL01.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:ORACLEORADATAPDFREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATAPDFREDO02.LOG' SIZE 100M,
11 GROUP 3 'C:ORACLEORADATAPDFREDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATAPDFSYSTEM01.DBF',
15 'C:ORACLEORADATAPDFUNDOTBS01.DBF',
16 'C:ORACLEORADATAPDFINDX01.DBF',
17 'C:ORACLEORADATAPDFTOOLS01.DBF',
18 'C:ORACLEORADATAPDFUSERS01.DBF'
19 CHARACTER SET ZHS16GBK
20 ;

控制文件已创建
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:ORACLEORADATAPDFSYSTEM01.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:ORACLEORADATAPDFSYSTEM01.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:ORACLEORADATAPDFREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATAPDFREDO02.LOG' SIZE 100M,
11 GROUP 3 'C:ORACLEORADATAPDFREDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATAPDFSYSTEM01.DBF',
15 'C:ORACLEORADATAPDFUNDOTBS01.DBF',
16 'C:ORACLEORADATAPDFINDX01.DBF',
17 'C:ORACLEORADATAPDFTOOLS01.DBF',
18 'C:ORACLEORADATAPDFUSERS01.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 Settingslifeng.fang>copy c:tempcontrolfile.bak
C:oracleoradatapdfCONTROL01.CTL
已复制 1 个文件。

C:Documents and Settingslifeng.fang>copy c:tempcontrolfile.bak
C:oracleoradatapdfCONTROL02.CTL
已复制 1 个文件。

C:Documents and Settingslifeng.fang>copy c:tempcontrolfile.bak
C:oracleoradatapdfCONTROL03.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:oracleora92DATABASEPWDpdf.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:ORACLEORADATAPDFSYSTEM01.DBF'

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


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

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

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

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
C:Documents and Settingslifeng.fang>copy c:tempcontrolfile1.bak C:oracleor
adatapdfCONTROL01.CTL
已复制 1 个文件。

C:Documents and Settingslifeng.fang>copy c:tempcontrolfile1.bak C:oracleor
adatapdfCONTROL02.CTL
已复制 1 个文件。

C:Documents and Settingslifeng.fang>copy c:tempcontrolfile1.bak C:oracleor
adatapdfCONTROL03.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:ORACLEORA92RDBMSARC00012.001
ORA-00280: 更改 1069041 对于线程 1 是按序列 # 12 进行的


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


ORA-00308: 无法打开存档日志 'C:ORACLEORA92RDBMSARC00012.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:ORACLEORADATAPDFSYSTEM01.DBF'


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


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


ORA-01112: 未启动介质恢复


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01152: 文件 2 没有从完备的旧备份中恢复
ORA-01110: 数据文件 2: 'C:ORACLEORADATAPDFUNDOTBS01.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:tempcontrolfile2.bak';

数据库已更改。

替换老的控制文件

SQL> insert into test select * from test;

已创建24660行。

SQL> commit;

提交完成。

SQL> select count(*) from test;

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

copy c:tempcontrolfile2.bak C:oracleoradatapdfCONTROL01.CTL
copy c:tempcontrolfile2.bak C:oracleoradatapdfCONTROL02.CTL
copy c:tempcontrolfile2.bak C:oracleoradatapdfCONTROL03.CTL

rename SYSTEM01.DBF 复件 SYSTEM01.DBF SYSTEM01.DBF --&gt>临时文件可以不要
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:ORACLEORA92RDBMSARC00013.001
ORA-00280: 更改 1069386 对于线程 1 是按序列 # 13 进行的


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


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


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

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


指定日志: {=suggested | filename | AUTO | CANCEL}
cancel --输入cancel恢复成功 --&gt>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:ORACLEORADATATESTDBREDO01.LOG'


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


指定日志: {=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:ORACLEORADATATESTDBARCHIVE1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的


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

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


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

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


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

ORA-00308: 无法打开存档日志 'C:ORACLEORADATATESTDBARCHIVE1_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:oracleoradatatestdbREDO02.LOG
C:oracleoradatatestdbREDO03.LOG
我们可以看到恢复时这个文件不需要
~~~~~~~~~~~~~~~

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


指定日志: {=suggested | filename | AUTO | CANCEL}
C:oracleoradatatestdbREDO02.LOG
ORA-00310: 存档日志包含序列 3;要求序列 5
ORA-00334: 归档日志: 'C:ORACLEORADATATESTDBREDO02.LOG'


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


指定日志: {=suggested | filename | AUTO | CANCEL}
C:oracleoradatatestdbREDO03.LOG
ORA-00310: 存档日志包含序列 4;要求序列 5
ORA-00334: 归档日志: 'C:ORACLEORADATATESTDBREDO03.LOG'


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

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

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


指定日志: {=suggested | filename | AUTO | CANCEL}
C:oracleoradatatestdbREDO01.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
--&gt>完全恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~
这里主要是由于应用了活动在线日志
C:oracleoradatatestdbREDO01.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 Settingslifeng.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:ORACLEORADATATESTDBARCHIVE1_3.DBF
ORA-00280: 更改 69456 对于线程 1 是按序列 # 3 进行的


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

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


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

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


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

ORA-00308: 无法打开存档日志 'C:ORACLEORADATATESTDBARCHIVE1_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:ORACLEORADATATESTDBARCHIVE1_5.DBF
ORA-00280: 更改 69610 对于线程 1 是按序列 # 5 进行的


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

ORA-00308: 无法打开存档日志 'C:ORACLEORADATATESTDBARCHIVE1_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:ORACLEORADATATESTDBARCHIVE1_5.DBF
ORA-00280: 更改 69610 对于线程 1 是按序列 # 5 进行的


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

ORA-00308: 无法打开存档日志 'C:ORACLEORADATATESTDBARCHIVE1_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 --&gt>不能恢复status = no ,这部分数据在在线日志中的,但是until cancel+ backup controlfile不前滚在线日志文件

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

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

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

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

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

测试结果同上.
只有通过create controlfile方法才能完全恢复 --&gt>需要测试


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以我们看到使用backup controlfile
不能使用在线日志进行恢复了
所以我们可以用alter system switch logfile来做备份
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们注意到,在这里仍然可以用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:ORACLEORADATATESTDBREDO01.LOG' SIZE 100M,

10 GROUP 2 'C:ORACLEORADATATESTDBREDO02.LOG' SIZE 100M,

11 GROUP 3 'C:ORACLEORADATATESTDBREDO03.LOG' SIZE 100M

12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATATESTDBSYSTEM01.DBF',

15 'C:ORACLEORADATATESTDBUNDOTBS01.DBF',

16 'C:ORACLEORADATATESTDBINDX01.DBF',

17 'C:ORACLEORADATATESTDBTOOLS01.DBF',

18 'C:ORACLEORADATATESTDBUSERS01.DBF'

19 CHARACTER SET ZHS16GBK
20 ;

控制文件已创建

SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 位于第 1 行:
ORA-01113: ?? 5 ??????
ORA-01110: ???? 5: 'C:ORACLEORADATATESTDBUSERS01.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 Settingslifeng.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 --&gt>注意如果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'; --&gt>通过指定的路径就可以恢复了

正在执行命令: 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:ORACLEORADATAPDFCONTROL01.CTL
输出文件名=C:ORACLEORADATAPDFCONTROL02.CTL
输出文件名=C:ORACLEORADATAPDFCONTROL03.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:oracleora92DATABASEPWDtestdb.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:ORACLEORADATATESTDBREDO01.LOG' --&gt>这里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:ORACLEORADATATESTDBREDO01.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:ORACLEORADATATESTDBREDO03.LOG'


SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00338: ?? 3 (?? 1) ???????
ORA-00312: ???? 3 ?? 1: 'C:ORACLEORADATATESTDBREDO03.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:ORACLEORADATATESTDBREDO03.LOG'

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


指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 68658 (? 02/28/2005 10:22:51 ??) ???? 1 ????
ORA-00289: ??: C:ORACLEORADATATESTDBARCHIVE1_4.DBF
ORA-00280: ?? 68658 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:ORACLEORADATATESTDBARCHIVE1_3.DBF'


ORA-00308: ???????? 'C:ORACLEORADATATESTDBARCHIVE1_4.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*NDO/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:ORACLEORADATATESTDBSYSTEM01.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:ORACLEORADATATESTDBARCHIVE1_4.DBF
ORA-00280: ?? 68658 ???? 1 ???? # 4 ???


指定日志: {=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:ORACLEORADATATESTDBREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATATESTDBREDO02.LOG' SIZE 100M,
11 GROUP 3 'C:ORACLEORADATATESTDBREDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATATESTDBSYSTEM01.DBF',
15 'C:ORACLEORADATATESTDBUNDOTBS01.DBF',
16 'C:ORACLEORADATATESTDBINDX01.DBF',
17 'C:ORACLEORADATATESTDBTOOLS01.DBF',
18 'C:ORACLEORADATATESTDBUSERS01.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:ORACLEORADATAPDFREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATAPDFREDO02.LOG' SIZE 100M,
11 GROUP 3 'C:ORACLEORADATAPDFREDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATAPDFSYSTEM01.DBF',
15 'C:ORACLEORADATAPDFUNDOTBS01.DBF',
16 'C:ORACLEORADATAPDFINDX01.DBF',
17 'C:ORACLEORADATAPDFTOOLS01.DBF',
18 'C:ORACLEORADATAPDFUSERS01.DBF'
19 CHARACTER SET ZHS16GBK
20 ;

控制文件已创建
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:ORACLEORADATAPDFSYSTEM01.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:ORACLEORADATAPDFSYSTEM01.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:oracleoradatatestdbarchive
最早的概要日志序列 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:oracleoradatatestdbbak2controlfile.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:ORACLEORADATATESTDBARCHIVE1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的


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


ORA-00308: 无法打开存档日志 'C:ORACLEORADATATESTDBARCHIVE1_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:ORACLEORADATATESTDBSYSTEM01.DBF'


SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69776 (在 02/28/2005 11:23:24 生成) 对于

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/330796/viewspace-974040/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/330796/viewspace-974040/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值