<%@ page contentType="text/html; charset=gb2312"%> resetlogs后没有备份情况下的数据恢复
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
resetlogs后没有备份情况下的数据恢复
     发布者: 发布时间:2006-05-07
媒体恢复分完全恢复和不完全恢复。不完全恢复可以恢复到指定的时刻或系统更改号,但不完全恢复之后剩余日志文件就不可用,必须重置日志序列号,用resetlogs选项打开数据库,此后数据库变成一个新形体,为了将来的恢复,必须重做一致备份。而且,resetlogs之前的备份已不可用。但是,很可能在resetlogs后没有做数据库的一致备份,而数据库又不认识resetlogs之前的备份,此时该如何恢复resetlogs后的数据呢?

虽说本文提供的技术能实现用resetlogs之前的备份恢复到resetlogs之后某一时刻的数据,但这也是挽救措施,笔者强烈建议读者要做resetlogs之后的一致数据库备份。

本文技术的理论基础


oracle仅根据系统更改号(scn)进行恢复操作,所有数据文件必须恢复到同一时间点,并在该点后未作任何改动,才能打开数据库。数据库的scn是唯一的,并随着数据库生存期间的操作事务增加而增加(可能不连续)。scn的值永远不会为0,除非重新创建数据库。scn的序列的递增性不随数据库的任何操作而改变,即使是resetlogs也如此。resetlogs清除所有联机日志文件中未应用的重做记录,resetlogs只重置日志文件的序列号为1,但对scn无影响,scn仍按原序列递增。

在控制文件中保存resetlogs scn和计数器,以便唯一地标识用resetlogs选项执行的每一次打开数据库的操作。这个值被写进每个数据文件头以及重做日志文件。如果重做日志文件的日志序列号与oracle的要求值不相符,则在恢复中不能应用重做日志文件。执行不完全恢复后,数据库要求日志序列号为1的日志文件,所以原来的日志序列中剩余的日志文件将不可用。resetlogs操作创建数据库的新形体,即一个拥有从1开始的新的日志序列号流的数据库。

根据以上理论,scn为顺序数据流,在数据库存在期间始终递增,而日志文件序列流也是递增序列,只不过会因resetlogs而重置,但日志文件序列流中的scn序列流却保持递增不便。因此可以用resetlogs之前的归档日志流和resetlogs之后的归档日志流来连接和延续scn序列流,这样就实现了用resetlogs之前的备份恢复resetlogs之后的数据。前提是保证两股日志流(resetlogs之前的归档日志流和resetlogs之后的归档日志流)完整,并且有相应两股日志流的控制文件。

即使能够挽救数据,也要满足下列条件

(1)oracle版本等于或高于7.3.3。

(2)能够成功实现resetlogs之前的不完全媒体恢复。

(3)resetlogs后没有提供一致备份。

(4)resetlogs之前提供一致性备份(冷或热)。

(5)必须备份resetlogs之前和之后的控制文件。

(6)分别保存resetlogs之前和之后的归档日志文件到不同位置,提供用于恢复的所有归档日志,并保证日志可用。

建议


(一)强烈建议resetlogs之后要备份数据库。

(二)在resetlogs前保证数据库以前备份的数据安全,在创建resetlogs之后的一个一致性备份之前,一定不可删掉在resetlogs前创建的一致数据库备份。如不是为了空间需要,建议永久保留resetlogs前创建的一致数据库备份,包括数据文件、控制文件和归档日志。

(三)在resetlogs之后立即创建控制文件备份,并把归档日志单独存放。

(四)在以resetlogs方式打开数据库前,备份在恢复中用过的所有归档日志和联机重做日志。

(五)进行resetlogs后,备份alter.log文件,因为该文件保存着point-in-time恢复后记录的change#(系统更改号scn)。

(六)把resetlogs之前和之后的归档日志文件保存到不同位置,用于恢复。因为可能存在如下情形:如果resetlogs之前和之后的归档日志文件保存到相同位置,而resetlogs之后的归档日志文件序列号从1开始,随着日志切换的不断发生,新的日志序列号要增长到与resetlogs之前日志序列号相同的时候,那时resetlogs之前的归档日志文件将被新日志文件覆盖,从而使resetlogs之前的日志序列出现空洞。

实例演示的详细过程


系统环境

● 软件环境:windows server 2000、oracle enterprise edition 9.0.1、数据库sid:test

● 数据库文件的目录(文件)及意义:

f:\test 在线数据文件和归档日志文件

f:\test1、f:\test2、f:\test3 联机重做日志和在线控制文件

f:\cool\coola 时刻a点的一致性冷备份数据文件目录

f:\cool\archa_b 时刻a、b两点间的归档日志备份目录

f:\cool\archb_c 时刻b、c两点间的归档日志备份目录

f:\cool\ctl_a\ctl.ctl 时刻a点的控制文件备份

f:\cool\ctl_c\ctl.ctl 时刻c点的控制文件备份


操作过程

本例中首先建立试验用户demo和表空间demo,当前时刻记为a点,用户demo建立表a后,插入数据1、2、3,之后的时刻记为b点,接着插入数据4、5、6后的时刻记为b''点,接着模拟丢失b''点的数据文件,从a点恢复到b点,用resetlogs选项打开数据库后,再向表a插入数据7、8、9,之后的时刻记为c点。此时模拟丢失c点的数据文件,用a点的备份和a、b之间及b、c之间的归档日志加上a、c两点的控制文件将数据库恢复到c点。下列步骤中的第17步最为关键,详细步骤如下:

(1)准备工作:建立表空间demo和临时用户demo。

create tablespace demo datafile ''f:\test\demo.dbf'' size 5m;create user demo identified by demo default tablespace demo quota unlimited on demo temporary tablespace temp;grant connect,alter system to demo;alter user demo account unlock;


(2)以sysdba身份查看归档日志并关闭数据库。

sql> archive log listdatabase log mode              archive modeautomatic archival             enabledarchive destination            f:\testoldest online log sequence     18next log sequence to archive   19current log sequence           19sql> shutdown;


(3)当前时刻记为a点,做数据库的一致冷备份。

copy  f:\test\*.dbf  f:\cool\coolacopy  f:\test1\ctl.ctl  f:\cool\ctl_a


(4)以试验用户demo登录,并插入数据到表a中。

create table a (i number);commit;insert into a values(1);commit;alter system switch logfile;insert into a values(2);commit;alter system switch logfile;insert into a values(3);commit;alter system switch logfile;


(5)记录当前时刻为b点。

sql> select to_char(sysdate,''dd-month-yyyy hh24:mi:ss'') "date" from dual;date--------------------------04-october  -2002 09:18:52


(6)继续由用户demo向表a插入数据。

insert into a values(4);commit;alter system switch logfile;insert into a values(5);commit;alter system switch logfile;insert into a values(6);commit;alter system switch logfile;alter system switch logfile;alter system switch logfile;


(7)记录当前时刻为b''点。

sql>  select to_char(sysdate,''dd-month-yyyy hh24:mi:ss'') "date" from dual;date--------------------------04-october  -2002 09:21:13


(8)以sysdba身份查看归档日志并关闭数据库。

sql> archive log listdatabase log mode              archive modeautomatic archival             enabledarchive destination            f:\testoldest online log sequence     27next log sequence to archive   28current log sequence           28sql> shutdown


(9)模拟丢失所有当前(b''点)数据文件和控制文件。首先保存归档日志文,再把点a的数据文件和控制文件恢复到在线数据文件的目录。

del  f:\test\*.dbfcopy  f:\test\*.arc  f:\cool\archa_bcopy  f:\cool\coola\*.dbf  f:\testcopy  f:\cool\ctl_a\ctl.ctl  f:\test1copy  f:\cool\ctl_a\ctl.ctl  f:\test2copy  f:\cool\ctl_a\ctl.ctl  f:\test3


(10)以sysdba身份登录,执行从时刻a到时刻b的基于时间点的不完全媒体恢复,因为媒体恢复过程使用时刻a的控制文件,所以要加上using backup controlfile子句。

conn /@test as sysdbastartup mountsql> recover database until time ''2002-10-04:09:18:52'' using backup controlfile;ora-00279: change 690619 generated at 10/04/2002 08:56:01 needed for thread 1ora-00289: suggestion : f:\test\arch19.arcora-00280: change 690619 for thread 1 is in sequence #19specify log: {<ret&gt;=suggested | filename | auto | cancel}f:\cool\archa_b\arch19.arcora-00279: change 690763 generated at 10/04/2002 09:18:21 needed for thread 1ora-00289: suggestion : f:\test\arch20.arcora-00280: change 690763 for thread 1 is in sequence #20ora-00278: log file ''f:\cool\archa_b\arch19.arc'' no longer needed for thisrecovery……  ……


接下来顺序应用归档日志文件直到日志序列号为22的日志文件f:\cool\archa_b\arch22.arc,注意归档日志文件的目录为f:\cool\archa_b。

(11)以sysdba身份打开数据库,因为是不完全媒体恢复,所以要使用resetlogs选项。查看表demo.a,证实时刻b之前插入的数据已被恢复。

sql> alter database open resetlogs;sql> select * from demo.a;         i----------         1         2         3


(12)以demo用户登录数据库,接着向表a插入数据。

insert into a values(7);commit;alter system switch logfile;insert into a values(8);commit;alter system switch logfile;insert into a values(9);commit;alter system switch logfile;alter system switch logfile;alter system switch logfile;alter system switch logfile;


(13)记录当前时刻为c点。

sql> select to_char(sysdate,''dd-month-yyyy hh24:mi:ss'') "date" from dual;date--------------------------04-october  -2002 10:04:46


(14)以sysdba身份查看归档日志并关闭数据库。

sql> conn /@test as sysdbaconnected.sql> archive log listdatabase log mode              archive modeautomatic archival             enabledarchive destination            f:\testoldest online log sequence     6next log sequence to archive   7current log sequence           7sql> shutdown


由此可见,resetlogs后日志序列号从1重新开始。

(15)不备份c点的数据文件,但要备份c点的控制文件和时刻b和时刻c之间的归档日志。删除当前(时刻c)数据文件,从a点复制数据文件和控制文件到当前位置。

del  f:\test\*.dbfcopy  f:\test\*.arc  f:\cool\archb_ccopy  f:\test1\ctl.ctl  f:\cool\ctl_ccopy  f:\cool\coola\*.dbf  f:\testcopy  f:\cool\ctl_a\ctl.ctl  f:\test1copy  f:\cool\ctl_a\ctl.ctl  f:\test2copy  f:\cool\ctl_a\ctl.ctl  f:\test3


(16)以sysdba身份登录,执行从时刻a到时刻b的基于时间点的不完全媒体恢复,因为媒体恢复过程使用时刻a的控制文件,所以要加上using backup controlfile子句。该步骤类似于步骤(10)。

conn /@test as sysdbastartup mountrecover database until time ''2002-10-04:09:18:52'' using backup controlfile;


(17)该步骤最为关键!!不要打开数据库。首先关闭数据库,然后把c点的控制文件恢复到在线控制文件的位置,然后用c点的控制文件恢复步骤(16)结束之后的数据文件,恢复进程会自动应用时刻b和时刻c之间的归档日志文件,从序列号为1的归档日志arch1.arc开始。注意:本例执行的是完全媒体恢复,必须在不丢失联机重做日志文件的情况下。否则,要恢复联机重做日志文件。当然,也可执行不完全媒体恢复,恢复到时刻b和时刻c之间的任一时刻。本步骤的关键技术在于要备份时刻c的控制文件,并用它实现跨越时刻b的媒体恢复。

sql> shutdowncopy  f:\cool\ctl_c\ctl.ctl  f:\test1copy  f:\cool\ctl_c\ctl.ctl  f:\test2copy  f:\cool\ctl_c\ctl.ctl  f:\test3sql&gt; conn /@test as sysdbaconnected to an idle instance.sql&gt; startup mountsql&gt; recover database;ora-00279: change 690773 generated at 10/04/2002 09:59:31 needed for thread 1ora-00289: suggestion : f:\test\arch1.arcora-00280: change 690773 for thread 1 is in sequence #1specify log: {&lt;ret&gt;=suggested | filename | auto | cancel}f:\cool\archb_c\arch1.arcora-00279: change 690989 generated at 10/04/2002 10:04:11 needed for thread 1ora-00289: suggestion : f:\test\arch2.arcora-00280: change 690989 for thread 1 is in sequence #2ora-00278: log file ''f:\cool\archb_c\arch1.arc'' no longer needed for thisrecovery……  ……log applied.media recovery complete.


(18)打开数据库,查看表demo.a,结果显示没有丢失时刻b和时刻c之间插入的数据7、8、9。

sql> alter database open;database altered.sql> select * from demo.a;         i----------         1         2         3         7         8         96 rows selected.


(19)马上做数据库的一致备份(冷备份或热备份)。

附加说明


另外要指出,如果忘记或不能提供时刻b的准确时间,可以查看报警日志文件,搜索"change",找到系统更改号(scn),也可在步骤(10)和步骤(16)中指定基于改变的恢复。命令格式如下:

recover database until change integer_scn [using backup controlfile]


注:integer_scn要用整数scn替换。

本例中,数据库test的报警日志文件为f:\test\bdump\testalrt.log,在其中找到以下片段:

fri oct 04 09:57:15 2002alter database recover    logfile ''f:\cool\archa_b\arch22.arc''  media recovery log f:\cool\archa_b\arch22.arcincomplete recovery done until change 690772media recovery completecompleted: alter database recover    logfile ''f:\cool\archa_bfri oct 04 09:59:31 2002alter database open resetlogsfri oct 04 09:59:31 2002resetlogs after incomplete recovery until change 690772resetting resetlogs activation id 1770840999 (0x698ce3a7)


由此可发现恢复到时刻b(2002-10-04:09:18:52)的scn为690772,可以在不完全恢复中指定恢复到更改号690772,如下语句所示:

recover database until change 690773 using backup controlfile;


数据库执行过不完全恢复后,并在以resetlogs选项打开之前,scn已经记录在报警日志文件中,也可以通过查询

select  resetlogs_change#-1  from  v$database;


找到scn,这个结果与报警日志中的scn相同,这样就可以恢复到该scn。

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
在unix下让oracle定时执行*.sql文件
如何在oems中成功提交作业
oracleweb应用开发之apache架设与pl/sql页面设计(2)
oracleweb应用开发之apache架设与pl/sql页面设计(3)
oraclee-business套件rra/fndfs泄露任意文件漏洞的修补
如何学习oracle?
 
最近评论:
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(9313)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(2007)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号