ITPub博客

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

数据库备份与恢复测试 2

原创 数据库开发技术 作者:scoreking 时间:2006-02-15 18:17:05 0 删除 编辑
#######################################################
# [测试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:ORACLEORADATATESTDBREDO01.LOG' SIZE 100M,

10 GROUP 2 'C:ORACLEORADATATESTDBREDO02.LOG' SIZE 100M,

11 GROUP 3 'C:ORACLEORADATATESTDBREDO03.LOG' SIZE 100M

12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATATESTDBSYSTEM01.DBF',

15 'C:ORACLEORADATATESTDBUNDOTBS01.DBF',

16 'C:ORACLEORADATATESTDBINDX01.DBF',

17 'C:ORACLEORADATATESTDBTOOLS01.DBF',

18 'C:ORACLEORADATATESTDBUSERS01.DBF'

19 CHARACTER SET ZHS16GBK
20 ;

控制文件已创建

SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 位于第 1 行:
ORA-01113: ?? 5 ??????
ORA-01110: ???? 5: 'C:ORACLEORADATATESTDBUSERS01.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 Settingslifeng.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:ORACLEORADATAPDFCONTROL01.CTL
输出文件名=C:ORACLEORADATAPDFCONTROL02.CTL
输出文件名=C:ORACLEORADATAPDFCONTROL03.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:oracleora92DATABASEPWDtestdb.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:ORACLEORADATATESTDBREDO01.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:ORACLEORADATATESTDBREDO01.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:ORACLEORADATATESTDBREDO03.LOG'


SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00338: ?? 3 (?? 1) ???????
ORA-00312: ???? 3 ?? 1: 'C:ORACLEORADATATESTDBREDO03.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:ORACLEORADATATESTDBREDO03.LOG'

方法1
SQL> recover database using backup controlfile;
ORA-00279: ?? 48540 (? 02/28/2005 10:06:38 ??) ???? 1 ????
ORA-00289: ??: C:ORACLEORADATATESTDBARCHIVE1_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:ORACLEORADATATESTDBARCHIVE1_4.DBF
ORA-00280: ?? 68658 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:ORACLEORADATATESTDBARCHIVE1_3.DBF'


ORA-00308: ???????? 'C:ORACLEORADATATESTDBARCHIVE1_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:ORACLEORADATATESTDBSYSTEM01.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:ORACLEORADATATESTDBARCHIVE1_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:ORACLEORADATATESTDBREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATATESTDBREDO02.LOG' SIZE 100M,
11 GROUP 3 'C:ORACLEORADATATESTDBREDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATATESTDBSYSTEM01.DBF',
15 'C:ORACLEORADATATESTDBUNDOTBS01.DBF',
16 'C:ORACLEORADATATESTDBINDX01.DBF',
17 'C:ORACLEORADATATESTDBTOOLS01.DBF',
18 'C:ORACLEORADATATESTDBUSERS01.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: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;

数据库已更改。
#############################################
# [方法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:oracleoradatatestdbarchive
最早的概要日志序列 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:oracleoradatatestdbbak2controlfile.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:ORACLEORADATATESTDBARCHIVE1_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:ORACLEORADATATESTDBARCHIVE1_4.DBF
ORA-00280: 更改 69776 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'C:ORACLEORADATATESTDBARCHIVE1_3.DBF


ORA-00308: 无法打开存档日志 'C:ORACLEORADATATESTDBARCHIVE1_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:ORACLEORADATATESTDBSYSTEM01.DBF'


SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69776 (在 02/28/2005 11:23:24 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:ORACLEORADATATESTDBARCHIVE1_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:oracleoradatatestdbarchive
最早的概要日志序列 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:oracleoradatatestdbarchive
最早的概要日志序列 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:ORACLEORADATATESTDBREDO03.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:ORACLEORADATATESTDBREDO03.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:oracleoradatatestdbarchive
最早的概要日志序列 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:oracleoradatatestdbarchive
最早的概要日志序列 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:ORACLEORADATAtestdbREDO01.LOG' SIZE 10
10 GROUP 2 'C:ORACLEORADATAtestdbREDO02.LOG' SIZE 10
11 GROUP 3 'C:ORACLEORADATAtestdbREDO03.LOG' SIZE 10
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATAtestdbSYSTEM01.DBF',
15 'C:ORACLEORADATAtestdbUNDOTBS01.DBF',
16 'C:ORACLEORADATAtestdbINDX01.DBF',
17 'C:ORACLEORADATAtestdbTOOLS01.DBF',
18 'C:ORACLEORADATAtestdbUSERS01.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:oracleora92DATABASEPWDtestdb.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:ORACLEORADATAtestdbREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATAtestdbREDO02.LOG' SIZE 100M,
11 GROUP 3 'C:ORACLEORADATAtestdbREDO03.LOG' SIZE 100M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATAtestdbSYSTEM01.DBF',
15 'C:ORACLEORADATAtestdbUNDOTBS01.DBF',
16 'C:ORACLEORADATAtestdbINDX01.DBF',
17 'C:ORACLEORADATAtestdbTOOLS01.DBF',
18 'C:ORACLEORADATAtestdbUSERS01.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:ORACLEORADATATESTDBARCHIVE1_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:oracleora92DATABASEPWDtestdb.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:oracleora92DATABASEPWDtestdb.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 Settingslifeng.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:ORACLEORADATAtestdbREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATAtestdbREDO02.LOG' SIZE 100M,
11 GROUP 3 'C:ORACLEORADATAtestdbREDO03.LOG' SIZE 100M --这个非在线日志丢了
12 -- STANDBY LOGFILE
13 DATAFILE
14 'C:ORACLEORADATAtestdbSYSTEM01.DBF',
15 'C:ORACLEORADATAtestdbUNDOTBS01.DBF',
16 'C:ORACLEORADATAtestdbINDX01.DBF',
17 'C:ORACLEORADATAtestdbTOOLS01.DBF',
18 'C:ORACLEORADATAtestdbUSERS01.DBF'
19 CHARACTER SET ZHS16GBK
20 ;
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'C:ORACLEORADATAtestdbREDO03.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:ORACLEORADATAtestdbREDO01.LOG' SIZE 100M,
10 GROUP 2 'C:ORACLEORADATAtestdbREDO02.LOG' SIZE 100M --删除日志3
11 -- STANDBY LOGFILE
12 DATAFILE
13 'C:ORACLEORADATAtestdbSYSTEM01.DBF',
14 'C:ORACLEORADATAtestdbUNDOTBS01.DBF',
15 'C:ORACLEORADATAtestdbINDX01.DBF',
16 'C:ORACLEORADATAtestdbTOOLS01.DBF',
17 'C:ORACLEORADATAtestdbUSERS01.DBF'
18 CHARACTER SET ZHS16GBK
19 ;

控制文件已创建

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


SQL> recover database ;
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}
auto
ORA-00279: ?? 69594 (? 03/02/2005 16:27:24 ??) ???? 1 ????
ORA-00289: ??: C:ORACLEORADATATESTDBARCHIVE1_4.DBF
ORA-00280: ?? 69594 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:ORACLEORADATATESTDBARCHIVE1_3.DBF'


已应用的日志。
完成介质恢复。
SQL> alter database open;

数据库已更改。

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

COUNT(*) ST
---------- --
6166 af
6166 no
98656 ok
这种情况配合noresetlogs可以完全恢复.



[@more@]

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

请登录后发表评论 登录
全部评论

注册时间:2008-11-04

  • 博文量
    40
  • 访问量
    209274