Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1087942
  • 博文数量: 227
  • 博客积分: 6860
  • 博客等级: 准将
  • 技术积分: 2688
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-02 16:06
文章分类

全部博文(227)

文章存档

2015年(7)

2014年(8)

2012年(5)

2011年(62)

2010年(145)

分类: Oracle

2010-09-09 23:04:58

数据库备份与恢复测试
为了提高各位ORACLE爱好着数据库备份与恢复实践能力,我把以前做过的备份与恢复测试共享给大家。希望大家能够补充,我也能从中提高自己,如有错误的地方也望大家指出,谢谢!
这个案例有1万多行,所以我也列了个目录



#########################################################
#[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 "DF" 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 "DF" 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 进行的


指定日志: {=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 进行的


指定日志: {=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 进行的


指定日志: {=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的恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


指定日志: {=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 进行的


指定日志: {=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 进行的


指定日志: {=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'


指定日志: {=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'


指定日志: {=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 进行的


指定日志: {=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 进行的


指定日志: {=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 进行的


指定日志: {=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 进行的


指定日志: {=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


指定日志: {=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


指定日志: {=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 进行的


指定日志: {=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 进行的


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

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


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

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

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

SQL> alter database open resetlogs;

数据库已更改。

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

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

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

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

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

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


[ Last edited by fly115 on 2005-3-21 at 19:37 ]
  
UID393 帖子3566 精华23 积分3803 流通积分3803 点 金钱0 O元 阅读权限225 在线时间173 小时 注册时间2003-1-21 最后登录2008-8-27 查看详细资料
 TOP
 

fly115
超级版主



个人空间 发短消息 加为好友 当前离线  3楼 大 中 小 发表于 2005-3-19 17:58  只看该作者


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

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

                 

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

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

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

表已创建。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

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

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

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

已创建6166行。

SQL> commit;

提交完成。

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

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

SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG

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

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

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

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

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

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

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

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

19  CHARACTER SET ZHS16GBK
20  ;

控制文件已创建

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


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

数据库已更改。

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

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







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

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

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

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

恢复管理器: 版本9.2.0.1.0 - Production

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

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

RMAN> restore controlfile from autobackup;

启动 restore 于 25-2月 -05

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

RMAN> exit

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

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

正在执行命令: SET DBID

RMAN> restore controlfile from autobackup;

启动 restore 于 25-2月 -05

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

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

正在执行命令: SET CONTROLFILE AUTOBACKUP FORMAT

RMAN> restore controlfile from autobackup ;

启动 restore 于 25-2月 -05

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



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


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

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


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


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


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


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


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


SQL>  alter database clear logfile group 1;

数据库已更改。

SQL>  alter database clear logfile group 2;

数据库已更改。

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


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


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

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


指定日志: {=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 ???


指定日志: {=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 "DF" 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 进行的


指定日志: {=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 进行的


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

数据库已更改。

SQL> select count(*) from arch;

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

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

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







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

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

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

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

表已创建。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

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

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

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

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

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

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

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

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

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


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

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

数据库已更改。             

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

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

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

表已创建。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL>  commit;

提交完成。

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

已创建6166行。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

提交完成。

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

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

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

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

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

控制文件已创建

SQL> alter database open resetlogs;

数据库已更改。

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

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

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

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

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

表已创建。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

提交完成。

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

已创建6166行。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

提交完成。

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

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

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

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

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


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


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

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

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

控制文件已创建

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


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


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

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


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


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

数据库已更改。

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


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


SQL> select count(*) from test;

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


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

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


SQL> alter database open;

数据库已更改。

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

表已创建。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

提交完成。

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

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

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

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

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

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


SQL> alter database open;

数据库已更改。

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

已创建6166行。

SQL> commit;

提交完成。

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

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

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

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

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

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

已连接到空闲例程。

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

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

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


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

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

控制文件已创建

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


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


指定日志: {=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可以完全恢复.   
      

                  




[ Last edited by fly115 on 2005-3-21 at 19:56 ]
  
UID393 帖子3566 精华23 积分3803 流通积分3803 点 金钱0 O元 阅读权限225 在线时间173 小时 注册时间2003-1-21 最后登录2008-8-27 查看详细资料
 TOP
 

fly115
超级版主



个人空间 发短消息 加为好友 当前离线  4楼 大 中 小 发表于 2005-3-19 18:00  只看该作者


################################                                                                     
# [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 ???


指定日志: {=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) >\>7CNJ!#


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 ???


指定日志: {=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'


指定日志: {=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'


指定日志: {=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 ???


指定日志: {=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 ???


指定日志: {=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'


指定日志: {=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'


指定日志: {=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 ???


指定日志: {=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
阅读(2038) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~