`

Oracle备份与恢复---学习与测试

 
阅读更多

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

[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 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不前滚在线日志文件

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方法才能完全恢复 -->>需要测试


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以我们看到使用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:/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
---------- ----------------------------------------
3C:/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; -->>用了归档1和2,为什么仍然没有arch表呢?我们看到arch表是在归档1中,而归档1是由日志文件组2生成的,但是这个归档是错误的日志文件前生成的,为什么会没有正确的前滚呢?
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.DBFREAD WRITE
C:/ORACLE/ORADATA/TESTDB/UNDOTBS01.DBFREAD WRITE
C:/ORACLE/ORADATA/TESTDB/INDX01.DBFREAD WRITE
C:/ORACLE/ORADATA/TESTDB/TOOLS01.DBFREAD ONLY
C:/ORACLE/ORADATA/TESTDB/USERS01.DBFREAD WRITE
C:/ORACLE/ORADATA/TESTDB/TOOLS02.DBFREAD 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
-------------------------------------------
1C:/ORACLE/ORADATA/TESTDB/SYSTEM01.DBF
2C:/ORACLE/ORADATA/TESTDB/UNDOTBS01.DBF
3C:/ORACLE/ORADATA/TESTDB/INDX01.DBF
4C:/ORACLE/ORADATA/TESTDB/TOOLS01.DBF
5C:/ORACLE/ORADATA/TESTDB/USERS01.DBF
6C:/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.DBFSYSTEM
C:/ORACLE/ORADATA/TESTDB/UNDOTBS01.DBFONLINE
C:/ORACLE/ORADATA/TESTDB/INDX01.DBFONLINE
C:/ORACLE/ORADATA/TESTDB/TOOLS01.DBFONLINE
C:/ORACLE/ORADATA/TESTDB/USERS01.DBFONLINE
C:/ORACLE/ORADATA/TESTDB/USERS02.DBFONLINE
已选择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 datafile方法
所以执行了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:/ORA
CLE/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

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
数据库装载完毕。
数据库已经打开。
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 #
#################################################################################


#################################################################################
# [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 type disk;
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


看看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 until time='2005-02-17 15:01:20';
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
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该表空间
exp SYS/clone TRANSPORT_TABLESPACE=y TABLESPACES=(users) TTS_FULL_CHECK=y file=expat.dmp

在主数据库中
DROP TABLESPACE users INCLUDING CONTENTS;


在主库
imp TRANSPORT_TABLESPACE=y FILE=expat.dmp
DATAFILES=('C:/ORACLE/ORADATA/CLONE/USERS01.DBF')

####################################################
[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、查看恢复后的表,恢复成功

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics