分类: 服务器与存储
2008-06-16 19:14:23
#########################################################
# [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:\\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:\\admin\pdf\bdump\pdf_pmon_3084.trc:
ORA-00227: corrupt block detected in controlfile: (block , # blocks )
Instance terminated by CKPT, pid = 2556
~~~~~~~~~~~~~~~~
在trace文件中显示
~~~~~~~~~~~~~~~~
Corrupt block relative dba: 0x00000001 (file 0, block 1)
Completely zero block found during control file header read
*** 2005-02-25 11:51:55.000
ksedmp: internal or fatal error
ORA-00202: controlfile: 'C:\ORACLE\ORADATA\PDF\CONTROL01.CTL'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这里我模拟把3个控制文件都破坏
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
启动数据库时提示
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
ORA-00205: ?????????????????????
恢复实例
###################################################
# [测试1] --使用trace恢复 shutdown abort
###################################################
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL>
SQL> CREATE CONTROLFILE REUSE DATABASE "PDF" NORESETLOGS ARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 226
8 LOGFILE
9 GROUP 1 'C:\ORACLE\ORADATA\PDF\REDO01.LOG' SIZE 100M,
10 GROUP 2 'C:\ORACLE\ORADATA\PDF\REDO02.LOG' SIZE 100M,
11 GROUP 3 'C:\ORACLE\ORADATA\PDF\REDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF',
15 'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF',
16 'C:\ORACLE\ORADATA\PDF\INDX01.DBF',
17 'C:\ORACLE\ORADATA\PDF\TOOLS01.DBF',
18 'C:\ORACLE\ORADATA\PDF\USERS01.DBF'
19 CHARACTER SET ZHS16GBK
20 ;
控制文件已创建
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'
SQL> recover database ; --因为是shutdown abort关闭,所以需要恢复
完成介质恢复。
SQL> alter database open;
数据库已更改。
###################################################
# [测试2] --使用trace恢复 正常shutdown
###################################################
SQL> insert into test select rownum,'aaaaaaaaaaaaaaaaaaaaaa' from dba_objects;
已创建6165行。
SQL> /
已创建6165行。
SQL> insert into test select * from test;
已创建12330行。
SQL> commit;
提交完成。
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL>
SQL> CREATE CONTROLFILE REUSE DATABASE "PDF" NORESETLOGS ARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 226
8 LOGFILE
9 GROUP 1 'C:\ORACLE\ORADATA\PDF\REDO01.LOG' SIZE 100M,
10 GROUP 2 'C:\ORACLE\ORADATA\PDF\REDO02.LOG' SIZE 100M,
11 GROUP 3 'C:\ORACLE\ORADATA\PDF\REDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF',
15 'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF',
16 'C:\ORACLE\ORADATA\PDF\INDX01.DBF',
17 'C:\ORACLE\ORADATA\PDF\TOOLS01.DBF',
18 'C:\ORACLE\ORADATA\PDF\USERS01.DBF'
19 CHARACTER SET ZHS16GBK
20 ;
控制文件已创建
SQL> alter database open;
数据库已更改。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们看到如果是正常数据库down机的,
那么使用noresetlog创建控制文件后
直接可以打开数据库
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select count(*) from test;
COUNT(*)
----------
24660
用trace完成了数据库的完全恢复
SQL> select * from v$tempfile;
未选定行
SQL> select name from v$tablespace;
NAME
------------------------------
SYSTEM
UNDOTBS1
INDX
TOOLS
USERS
TEMP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意我们可以看到由于重建了控制文件,
临时表空间的临时文件没有了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
###################################################
# [测试3] --使用控制文件备份来恢复
###################################################
~~~~~~~~~~~~~~~~
还原备份控制文件
~~~~~~~~~~~~~~~~
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile.bak
C:\\oradata\pdf\CONTROL01.CTL
已复制 1 个文件。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile.bak
C:\\oradata\pdf\CONTROL02.CTL
已复制 1 个文件。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile.bak
C:\\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:\\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:\\or
adata\pdf\CONTROL01.CTL
已复制 1 个文件。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile1.bak C:\\or
adata\pdf\CONTROL02.CTL
已复制 1 个文件。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile1.bak C:\\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 进行的
指定日志: {
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 进行的
指定日志: {
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:\\oradata\pdf\CONTROL01.CTL
copy c:\temp\controlfile2.bak C:\\oradata\pdf\CONTROL02.CTL
copy c:\temp\controlfile2.bak C:\\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 进行的
指定日志: {
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的恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
指定日志: {
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 进行的
指定日志: {
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 进行的
指定日志: {
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'
指定日志: {
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'
指定日志: {
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:\\oradata\testdb\REDO02.LOG
C:\\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 进行的
指定日志: {
C:\\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 进行的
指定日志: {
C:\\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:\\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 进行的
指定日志: {
C:\\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:\\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 进行的
指定日志: {
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
指定日志: {
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
指定日志: {
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 进行的
指定日志: {
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 进行的
指定日志: {
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