ITPub博客

首页 > 数据库 > 数据库开发技术 > 数据库备份与恢复测试 1

数据库备份与恢复测试 1

原创 数据库开发技术 作者:scoreking 时间:2006-02-15 18:16:04 0 删除 编辑
#########################################################
# [1] 控制文件损坏(rman和常规恢复) #
#########################################################

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

恢复管理器: 版本9.2.0.1.0 - Production

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

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

RMAN> configure controlfile autobackup on;

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

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

RMAN>

RMAN> backup database;

启动 backup 于 25-2月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=12 devtype=DISK
分配的通道: ORA_DISK_2
通道 ORA_DISK_2: sid=13 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00002 name=C:ORACLEORADATAPDFUNDOTBS01.DBF
输入数据文件 fno=00003 name=C:ORACLEORADATAPDFINDX01.DBF
输入数据文件 fno=00005 name=C:ORACLEORADATAPDFUSERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 25-2月 -05
通道 ORA_DISK_2: 正在启动 full 数据文件备份集
通道 ORA_DISK_2: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=C:ORACLEORADATAPDFSYSTEM01.DBF
输入数据文件 fno=00004 name=C:ORACLEORADATAPDFTOOLS01.DBF
通道 ORA_DISK_2: 正在启动段 1 于 25-2月 -05
通道 ORA_DISK_1: 已完成段 1 于 25-2月 -05
段 handle=C:ORACLEORA92DATABASE7GDKT8C_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:56
通道 ORA_DISK_2: 已完成段 1 于 25-2月 -05
段 handle=C:ORACLEORA92DATABASE8GDKT8C_1_1 comment=NONE
通道 ORA_DISK_2: 备份集已完成, 经过时间:00:00:57
完成 backup 于 25-2月 -05

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

RMAN>

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

会话已更改。

SQL> alter database backup controlfile to trace;

数据库已更改。

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

数据库已更改。

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

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


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

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

STATUS NAME
------- ------------------------------------------------
C:ORACLEORADATAPDFCONTROL01.CTL
C:ORACLEORADATAPDFCONTROL02.CTL
C:ORACLEORADATAPDFCONTROL03.CTL

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

使用ULTRAEDIT编辑清空CONTROL01.CTL大部分数据
SQL> select * from v$controlfile; <<-出现异常
select * from v$controlfile
*
ERROR 位于第 1 行:
ORA-12571: TNS: 包写入程序失败

~~~~~~~~~~~~~~~~
在alert中显示
~~~~~~~~~~~~~~~~
Fri Feb 25 11:51:56 2005
Errors in file c:oracleadminpdfbdumppdf_ckpt_2556.trc:
ORA-00227: corrupt block detected in controlfile: (block 1, # blocks 1)
ORA-00202: controlfile: 'C:ORACLEORADATAPDFCONTROL01.CTL'

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

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

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

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

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

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

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

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


SQL> CREATE CONTROLFILE REUSE DATABASE "PDF" NORESETLOGS ARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 226
8 LOGFILE
9 GROUP 1 'C:ORACLEORADATAPDFREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATAPDFREDO02.LOG' SIZE 100M,
11 GROUP 3 'C:ORACLEORADATAPDFREDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATAPDFSYSTEM01.DBF',
15 'C:ORACLEORADATAPDFUNDOTBS01.DBF',
16 'C:ORACLEORADATAPDFINDX01.DBF',
17 'C:ORACLEORADATAPDFTOOLS01.DBF',
18 'C:ORACLEORADATAPDFUSERS01.DBF'
19 CHARACTER SET ZHS16GBK
20 ;

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

SQL> startup
ORACLE 例程已经启动。

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


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

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

已创建6165行。

SQL> /

已创建6165行。

SQL> insert into test select * from test;

已创建12330行。

SQL> commit;

提交完成。

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

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

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


SQL> CREATE CONTROLFILE REUSE DATABASE "PDF" NORESETLOGS ARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 226
8 LOGFILE
9 GROUP 1 'C:ORACLEORADATAPDFREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATAPDFREDO02.LOG' SIZE 100M,
11 GROUP 3 'C:ORACLEORADATAPDFREDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATAPDFSYSTEM01.DBF',
15 'C:ORACLEORADATAPDFUNDOTBS01.DBF',
16 'C:ORACLEORADATAPDFINDX01.DBF',
17 'C:ORACLEORADATAPDFTOOLS01.DBF',
18 'C:ORACLEORADATAPDFUSERS01.DBF'
19 CHARACTER SET ZHS16GBK
20 ;

控制文件已创建
SQL> alter database open;

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

COUNT(*)
----------
24660

用trace完成了数据库的完全恢复

SQL> select * from v$tempfile;

未选定行

SQL> select name from v$tablespace;

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

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

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

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

SQL> startup
ORACLE 例程已经启动。

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

SQL> recover database;
ORA-00283: ??????????
ORA-01610: ?? BACKUP CONTROLFILE ??????????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
数据文件头中原有检查点计数器决不会大于
当前控制文件中的检查点计数器,所以必须在
恢复时指定USING BACKUP CONTROLFILE,
这样就会基于备份控制文件的信息
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

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


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

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

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

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

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

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

SQL> startup
ORACLE 例程已经启动。

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

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

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


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


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


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


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


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


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


ORA-01112: 未启动介质恢复


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

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

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

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

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

数据库已更改。

替换老的控制文件

SQL> insert into test select * from test;

已创建24660行。

SQL> commit;

提交完成。

SQL> select count(*) from test;

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

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

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

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

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

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


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


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


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

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


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

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

CHECKPOINT_CHANGE#
------------------
1069388

SQL> select count(*) from test;

COUNT(*)
----------
24660 --丢失了数据
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
那我们使用备份控制文件恢复,是不是一定恢复不了在线日志中的数据吗?
答案是错误的,其实也能完全恢复(当然我们用trace更好)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#######################################################
# [测试5.1]我们现在模拟控制文件损坏,有控制文件备份,先于控制文件备份的所有数据文件备份
# 使用在线日志进行完全恢复
#######################################################
SQL> startup
ORACLE 例程已经启动。

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

表已创建。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

提交完成。

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

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

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

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

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

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

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


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


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

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

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


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

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


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

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


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

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


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

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

~~~~~~~~~~~~~~
到此是不完全恢复
那我们是不是可以
应用在线日志呢,那
我们先应用SEQUENCE=3和4
的日志C:oracleoradatatestdbREDO02.LOG
C:oracleoradatatestdbREDO03.LOG
我们可以看到恢复时这个文件不需要
~~~~~~~~~~~~~~~

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


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


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


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


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

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

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


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

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

SQL> alter database open resetlogs;

数据库已更改。

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

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

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

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

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

表已创建。

SQL> alter system switch logfile;

系统已更改。

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

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

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

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

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

已创建6166行。

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

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

SQL> commit;

提交完成。

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

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

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

C:Documents and Settingslifeng.fang>sqlplus "sys/sunsdl as sysdba"

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

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

已连接到空闲例程。

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

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

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

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


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

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


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

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


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

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


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

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

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


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

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


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

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

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


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

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


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

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

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

SQL> alter database open resetlogs;

数据库已更改。

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

COUNT(*) ST
---------- --
98656 ok -->>不能恢复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
[@more@]

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

上一篇: statspack分析
请登录后发表评论 登录
全部评论

注册时间:2008-11-04

  • 博文量
    40
  • 访问量
    209278