分类: 服务器与存储
2008-06-16 19:13:59
#######################################################
# [测试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:\\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 ???
指定日志: {
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 ???
指定日志: {
cancel
介质恢复已取消。
SQL>
SQL> alter database open resetlogs;
数据库已更改。
####################################################
# [方法2] --使用带resetlogs的创建控制文件trace
####################################################
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS ARCHIVELOG --这里我们用了resetlogs
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 226
8 LOGFILE
9 GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG' SIZE 100M,
10 GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG' SIZE 100M,
11 GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15 'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16 'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
19 CHARACTER SET ZHS16GBK
20 ;
控制文件已创建
SQL> alter database open resetlogs;
数据库已更改。
~~~~~~~~~~~~~~~
这将丢失部分数据
~~~~~~~~~~~~~~~
#############################################
# [方法3] 使用noresetlog的trace来恢复
#############################################
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL>
SQL> CREATE CONTROLFILE REUSE DATABASE "PDF" NORESETLOGS ARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 226
8 LOGFILE
9 GROUP 1 'C:\ORACLE\ORADATA\PDF\REDO01.LOG' SIZE 100M,
10 GROUP 2 'C:\ORACLE\ORADATA\PDF\REDO02.LOG' SIZE 100M,
11 GROUP 3 'C:\ORACLE\ORADATA\PDF\REDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF',
15 'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF',
16 'C:\ORACLE\ORADATA\PDF\INDX01.DBF',
17 'C:\ORACLE\ORADATA\PDF\TOOLS01.DBF',
18 'C:\ORACLE\ORADATA\PDF\USERS01.DBF'
19 CHARACTER SET ZHS16GBK
20 ;
控制文件已创建
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'
SQL> recover database ; --因为是shutdown abort关闭,所以需要恢复
完成介质恢复。
SQL> alter database open;
数据库已更改。
#############################################
# [方法4] 那我们对数据库的数据文件控制文件和
# 在线日志文件都做备份会需要恢复吗?
#############################################
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
将控制文件,数据文件,在线日志文件都进行备份
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from test;
COUNT(*)
----------
12330
SQL> create table arch (status varchar(2));
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'ok' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
将控制文件,数据文件,在线日志文件都进行还原
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from test;
COUNT(*)
----------
12330
SQL> select count(*) from arch;
select count(*) from arch
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 C:\\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:\\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 进行的
指定日志: {
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 进行的
指定日志: {
cancel
介质恢复已取消。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select count(*) from arch;
COUNT(*)
----------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~成功了,结果是有表arch,但没有数据,也就是没有应用在线日志,其实这里如果不还原在线日志(反而来搅乱),
我们是可以recover database 进行完全恢复的,因为控制文件其实也是当前的,如果使用后面备份的控制文件,
因为该控制文件已经在建arch表之后,也能进行恢复
上面的方法也是在在线日志被破坏后,有原来的冷备份(或热备份时),使用当前的控制文件(其实已经不是当前的了,
我们在后面可以看到使用了using backup controlfile)可以还原到最后的归档日志,只是丢失在线日志的数据.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
################################
[1.3] 有RMAN的备份,catalog正常
################################
--需要建立一个catalog库
################################
[1.4] 控制文件损坏,有trace,非活动在
线日志损坏
################################
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 C:\\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:\\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:\\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:\\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:\\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 进行的
指定日志: {
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:\\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:\\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 ???
指定日志: {
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可以完全恢复.