Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1210441
  • 博文数量: 1211
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 14340
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-09 11:20
文章分类

全部博文(1211)

文章存档

2011年(1)

2008年(1210)

我的朋友

分类: 服务器与存储

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


指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 68658 (? 02/28/2005 10:22:51 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 68658 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'


ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#


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


SQL> recover database using backup controlfile using cancel;
ORA-01906: ?? BACKUP ???


SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 68658 (? 02/28/2005 10:22:51 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 68658 ???? 1 ???? # 4 ???


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

数据库已更改。


####################################################
# [方法2] --使用带resetlogs的创建控制文件trace
####################################################
SQL> startup nomount
ORACLE 例程已经启动。

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

控制文件已创建

SQL> alter database open resetlogs;

数据库已更改。
~~~~~~~~~~~~~~~
这将丢失部分数据
~~~~~~~~~~~~~~~

#############################################
# [方法3] 使用noresetlog的trace来恢复
#############################################
SQL> shutdown abort 
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。

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


SQL> CREATE CONTROLFILE REUSE DATABASE "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 进行的


指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 69776 (在 02/28/2005 11:23:24 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69776 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF


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


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


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


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


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

数据库已更改。

SQL> select count(*) from arch;

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

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~成功了,结果是有表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 进行的


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


指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 69594 (? 03/02/2005 16:27:24 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69594 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'


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

数据库已更改。

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

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

阅读(544) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~