欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

通过日志恢复MS SQL数据案例备份恢复

时间:2022-05-20 14:09:01 其他范文 收藏本文 下载本文

【导语】以下是小编为大家整理的通过日志恢复MS SQL数据案例备份恢复(共10篇),仅供参考,欢迎大家阅读。

通过日志恢复MS SQL数据案例备份恢复

篇1:通过日志恢复MS SQL数据案例备份恢复

本文介绍通过日志恢复MS SQL数据案例,以数据库的故障恢复改为非简单模式,去掉自动关闭和自动收缩两个选项为前提,

前提条件是数据库的故障恢复改为非简单模式,去掉自动关闭和自动收缩两个选项。

1、创建一个数据库test 创建时间为-11-18 09:40

2、对数据库进行备份,备份时间为2006-11-18 09:42

语句如下:

backup database test to disk='d:database est.bak' with init

提示:

已处理 216 页,这些页属于数据库 'test' 的文件 'test'(位于文件 1 上)。

已处理 1 页,这些页属于数据库 'test' 的文件 'test_log'(位于文件 1 上)。

BACKUP DATABASE 操作成功地处理了 217 页,花费了 0.191 秒(9.269 MB/秒)。

3、2006-11-18 09:44 对数据库进行操作删除和新增,我这边对客户资料进行删除和新增操作

原始的记录为

修改完后的记录为

下面开始还原操作

4、备分日志:现在时间是2006-11-18 09:47

语句如下:

BACKUP LOG test TO DISK='d:database611180947.logs' WITH INIT

提示:

已处理 4 页,这些页属于数据库 'test' 的文件 'test_log'(位于文件 1 上)。

BACKUP LOG 操作成功地处理了 4 页,花费了 0.104 秒(0.275 MB/秒),

5、恢复之前数据库备份文件test.bak,使用WITH NORECOVERY参数:

RESTORE DATABASE test from disk='d:database est.bak' WITH NORECOVERY

提示:

已处理 216 页,这些页属于数据库 'test' 的文件 'test'(位于文件 1 上)。

已处理 1 页,这些页属于数据库 'test' 的文件 'test_log'(位于文件 1 上)。

RESTORE DATABASE 操作成功地处理了 217 页,花费了 0.352 秒(5.029 MB/秒)。

6、使用日志恢复数据库到时间为2006-11-18 09:43,即恢复09:44分的删除和新增操作

RESTORE LOG test FROM disk='d:database611180947.logs' WITH RECOVERY,STOPAT='11/18/2006 09:43'

提示:

已处理 4 页,这些页属于数据库 'test' 的文件 'test_log'(位于文件 1 上)。

RESTORE LOG 操作成功地处理了 4 页,花费了 0.016 秒(1.792 MB/秒)。

至此,再进入到软件中,可以看到,数据已经还原到原来的状态了

关 键 字:MYSQL

篇2:postgres 数据备份与恢复

PostgreSQL自带一个客户端pgAdmin,里面有个备份,恢复选项,也能对数据库进行备份 恢复(还原),但最近发现数据库慢慢庞大的时候,经常出错,备份的文件过程中出错的几率那是相当大,手动调节灰常有限,所以一直寻找完美的备份恢复方案。

梦里寻他千百度,伊人却在灯火阑珊处...其实PostgreSQL内置不少的工具,寻找的备份恢复方案就在其中:pg_dump,psql。这两个指令在数据库的安装目录下,比如我自己本地安装的,路径形如:C:Program FilesPostgreSQL9.0;然后进入到bin文件夹,会看到不少的exe文件,这就是PostgreSQL内置的工具了。里面会找到pg_dump.exe,psql.exe两个文件。我们怎么用他们?

用法:

备份数据库,指令如下:

pg_dump -h 164.82.233.54 -U postgres databasename > C:databasename.bak

开始-运行-cmd 弹出dos控制台;然后 在控制台里,进入PostgreSQL安装目录bin下:

cd C:Program FilesPostgreSQL9.0bin

最后执行备份指令:

pg_dump -h 164.82.233.54 -U postgres databasename > C:databasename.bak

指令解释:如上命令,pg_dump 是备份数据库指令,164.82.233.54是数据库的ip地址(必须保证数据库允许外部访问的权限哦~),当然本地的数据库ip写 localhost;postgres 是数据库的用户名;databasename 是数据库名,

> 意思是导出到C:databasename.bak文件里,如果没有写路径,单单写databasename.bak文件名,那么备份文件会保存在C:Program FilesPostgreSQL9.0bin 文件夹里。

恢复数据库,指令如下:

psql -h localhost -U postgres -d databasename < C:databasename.bak

指令解释:如上命令,psql是恢复数据库命令,localhost是要恢复到哪个数据库的地址,当然你可以写上ip地址,也就是说能远程恢复(必须保证数据库允许外部访问的权限哦~);postgres 就是要恢复到哪个数据库的用户;databasename 是要恢复到哪个数据库。< 的意思是把C:databasename.bak文件导入到指定的数据库里。

以上所有的是针对windows而言的,如果在linux下,会不会有效?

在linux里依然有效。有一个值得注意的是:如果直接进入PostgreSQL的安装目录bin下,执行命令,可能会出现 找不到pg_dump,psql的现象,我们在可以这样:

备份:

/opt/PostgreSQL/9.0/bin/pg_dump -h 164.82.233.54 -U postgres databasename > databasename.bak

恢复:

/opt/PostgreSQL/9.0/bin/psql -h localhost -U postgres -d databasename < databasename.bak

原文地址:2goo.info/blog/detail/516/

篇3:程控交换机的数据备份和恢复论文

(1) 数据备份:

即从交换机当前激活的公共设备机架把数据库、杂项文件或ACD统计表拷贝到其他存储介质上。其中的杂项文件包括:专用缩位拨号码,人工呼叫转移,激活的呼叫转移组等。

使用系统维护终端执行联机操作,并输入用户名、密码后,选择当前所用的数据库,并进入EDT(Configuration Editor)程序,在该程序下输入UTI(Utility)命令,此时即可使用BAC命令来备份数据了。具体的操作如下:

键入“CTRL+C”命令;开启维护终端并联机。用户名…?ADMIN,回车;输入用户名“ADMIN”。口令…?*****,回车;输入口令。ADMIN…?EDT,回车;进入数据库编辑程序。EDT…?UTI,回车;进入UTI编辑程序。UTI…?BAC,回车;进入备存程序。备存[DB]…?DB,回车;指示系统备存数据库。此时有三个选项:DB(数据库),MIS(杂项文文件)与ACD(ACD统计),本例选择了备存数据库。

备存的数据库…?A,回车;输入备存数据库名称A。…将标有(1/*)的空盘插入机架并回车…;系统提示用户放入磁盘,“*”表示此次备份操作过程总共需要的磁盘数。需要指出的是:若磁盘上存有其它内容,系统会在向磁盘拷贝文件的过程中抹去磁盘上的信息。…备存数据库A…;备存过程的提示。系统会在磁盘满时提示用户插入下一张盘,直至备存完毕。UTI…?EXI,回车;返回上一级程序。EDT…?EXI,回车;返回最高一级程序,系统会提示“您已脱机”。

备存操作完毕。

(2) 备存数据的恢复:

使用RES(Restore)命令将数据库、杂项文件或ACD统计从备份的软盘拷贝到激活的公共设备机架的硬盘中。具体操作如下:

联机后进入UTI程序(进入步骤同“数据备份”)。

系统提示:UTI…?RES,回车;输入恢复数据命令RES(restore)。

恢复[DB]…?DB,回车;仍以恢复DB为例。

将标有(1/*)的空盘插入机架并回车。

此后,依次放入磁盘直至恢复完毕。然后退出。

篇4:程控交换机的数据备份和恢复论文

(1) 数据备份:MD110型交换机的数据做了改动以后,不会立即写入硬盘,而是由存储单元

MEU存储。因此,在做此种型号交换机的数据备份时,应遵循以下3个步骤:

MEU数据→交换机硬盘单元QDLU→维护终端硬盘→软盘

? 下面分别加以说明:

第一步,转储操作。

交换机的转储操作有2种,可根据需要分别执行。这里需要指出的是:交换机的QDLU硬盘单元上有原始程序文件“LOVOL”和包含程序代码与用户数据的后援加载文件“RELVOL”。

①系统转储:交换机MEU中正在运行的所有程序单元和所有数据转存到交换机硬盘。过程如下:

-执行EQ硬盘维护程序;

-将QDLU硬盘单元中的文件指针指向relvol文件,此文件应是新的或可以删除的;

-退出EQ程序,执行FIOL联机操作程序,输入指令;

-FAVOE:VOL=RELVOL;

-FATAE:CTU=0;

-FASTI:CTU=0;(用命令删除旧的文件)

-FATAL:VOL=RELVOL,TAPE=0,CTU=0;

-FAVOI:VOL=RELVOL,TAPE=0;(建立新的后备文件)

-CATII:DATE=-5-28,TIME=6-23;

-CASII:STN=SUN(建立时钟日期与工作站标志);

-ALREI;

-FTREI(清除告警标志);

-DUSYI(输入命令进行转储);

此后,系统将把新的系统文件转存入交换机的.硬盘单元中。

②数据转储:维护人员修改交换机数据以后,将修改内容转存入交换机硬盘单元。过程如下:

-ALREI;

-FTREI(清除告警标志);

-DUUDI:DUMP=ALL;或DUMP=CHANGES{输入命令与参数进行转储。前者(ALL)为转储全部的数据,后者(CHANGES)为转储改变了的数据)}。

第二步,运行EQ转存数据。

即把转储操作中存入交换机硬盘单元的文件转存到维护终端的硬盘。首先运行EQ软件,进入交换机硬盘维护界面,并找到上一步所创立保存的文件。

-在此文件上,按下字母C,选定做为要保存的源文件。

-在维护终端目录上选定目标文件,回车,系统开始根据设定速率转存数据。

此过程把交换机上的数据导入了维护终端。

第三步,将数据存入软盘,保存。

可以运行维护终端的WINDOWS操作系统,用压缩软件将其转换为压缩文件,拷贝入软盘保存。

(2) 备存数据的恢复:

若需以备份的文件为源文件恢复交换机系统的数据,首先将软盘的文件拷贝入维护终端的硬盘(或利用维护终端上已有的备份文件)。之后运行交换机的硬盘维护程序EQ,选定维护终端上的备份文件为源文件,并且在交换机硬盘目录上选定目标文件的位置,回车,开始拷贝。拷贝完毕后,将此文件激活,作为当前文件。

此后,需将交换机中央处理单元复位,使之执行加载过程,即将硬盘单元的数据重新读入MEU存储单元,从而使系统恢复到从前(数据丢失前)的运行状态。

3 结束语

要想使丢失数据尽快恢复,交换网络

维护管理人员就必须有一套严格的备份方案。业务数据的完整备份和科学的恢复方案可使交换设备在出现故障后迅速恢复。合理的备份策略应该容易操作并对各种重文秘站-中国最强免费!要业务的影响降至最低,这样才能最大限度地减少电力通信交换网络系统的风险。

篇5:备份重要性 数据灾难恢复五大问题

一直以来,提起数据安全,人们想到的是网络安全,如何防止 攻击等方面,而对于数据的完整性、可用性的重视不足。所谓数据安全,就是这些在企业中简单做了数据备份,就认为数据安全得到很好的保证,企业的系统完全有保障。其实这些都是最简单的想法,数据备份并不等于数据容灾,有了备份不等于万事大吉。因为备份的数据可以还会有其他因素造成的数据损坏,如地震、火灾等,对于这些企业应该在数据容灾方面提升能力,来进一步应对数据抵抗潜在不安全因素的能力。

这样来说,会有人问何为“容灾”?其实简单的说就是尽量减少和避免灾难发生所造成的数据损失。备份和恢复是这个“容灾”中最重要的部分,提供数据的恢复和保管能力。另外,还要有提高数据可用性的能力,以及预防自然灾难所造成的对系统存储数据的影响和损失。

提到容灾,首先想到数据备份,到底数据备份和容灾是怎样的关系?对于企业来说,这种关系体现在什么方面才是最关心的。企业关键数据的丢失会很大程度上影响业务发展,同时造成严重经济损失。但是很多企业至今都没有理解容灾,认为简单的建立备份系统之后就认为高枕无忧,其实容灾系统也是不可缺少的一环,其相互关系可以说明容灾系统的重要 性。

备份是容灾的基础

数据备份可以说是企业数据可用性的最后一道防线,其目的为了在系统崩溃时能够快速的恢复数据。尽管这也是体现容灾的一种形式,但是能力有限。因为如今传统的备份还是采用数据内外磁带机进行冷备份,备份机制也统一在机房中管理,一旦机房陷入灾难,备份磁带上的数据也将毁坏,起不到有效保护数据安全作用。

容灾非简单数据备份

数据备份还是最基础的形式,没有数据备份任何容灾都没有现实意义。但是光有备份是不够,真正的数据容灾就是能够弥补传统备份不足,在灾难发生时可以及时恢复整个系统。所以,容灾对于IT而言就是提供一个能够防止各种灾难的计算机信息系统。

可见,了解到容灾真正目的后,对于企业来说,如何在数据备份上避免在容灾恢复所出现的问题,就需要企业明确数据容灾的真正意义和相关手段。

对于一个企业来说,数据进行备份仅仅是整个容灾工作的开始,备份目的就是为了能在系统故障的时候进行有效恢复,

但对于很多企业来讲,特别是中小企业,数据备份只是一项简单的工作,对于容灾计划方面没有弄清楚真正的意义,根本没有把数据容灾放在首要位置,所以会导致在容灾恢复上出现问题。

1、不清楚容灾意义

企业对于容灾没有进行效果方面的评估,认为花费巨大的精力和财力在数据备份方面,最终在问题出现时候就是简单的覆盖恢复,没有真正的感受到效果方面的实际意义。甚至缺乏完全的文档化恢复计划和措施。

2、容灾计划可行性

许多企业在弄清楚容灾意义,并不是有效的进行计划,导致很多容灾计划只是在想当然的情况下进行的编写,没有进行过任何的模拟演练,缺乏真正的可行性。最终一旦灾难发生,根本就起不到足够的容灾作用,数据根本没有办法有效恢复。

3、容灾没有可用配置文档

对于大型企业而言,在容灾备份方面有着专业的IT人才,并不缺乏相关的经验和手段。但是,对于一些企业,特别是中小企业没有对于当前系统配置和相关文件的必要存档。在进行容灾恢复时,找不到相应的原始系统配置文档,导致给灾难恢复带来不必要的困难。

4、数据文档保存不当

许多企业的IT人员通常对于数据存放介质和配置系统文档简单的存放,如柜子中、书架上,忽略这些数据所需的存放条件和所需要的安全防范保障措施,直接导致的后果是数据文档会因潮湿变质,配置文档丢失等情况,让企业在数据方面受到损失。

5、无多备份手段

对于容灾备份,许多企业仅仅对于一些需要长期保存的数据进行简单的季度备份、年度备份,特别是一些文档资料。由于时间过长,难免会出现数据文档因潮湿变质不能使用,而企业这个时候没有对这类文档进行有效的多份备用策略,致使一旦出现类似问题数据造成丢失。所以,对于这类需要长期保存的关键备份,可以采用不同地方保存至少2个以上的备份应用。

由此可知,容灾恢复工作中应注意的问题十分关键,对于有效避免问题的产生,企业才可能在未来数据安全方面得到保证,进一步用核心数据应对市场的竞争。

篇6:对硬盘重要数据进行备份和恢复

凡是用过一次KV3000.EXE杀毒软件的用户,会发现在C盘根目录下产生了两个隐含文件,即DISKC.DAT和ROOTC.DAT,这两个文件内保存了硬盘最为关健的“硬盘分区表”、“硬盘进出(I/O)表”、“C盘根目录表”等关键数据。它们是KV3000运行后自动产生的。不要小看这两个文件,一旦灾难降临,依靠它们可以使您的硬盘起死回生。

当“硬盘分区表”日后被病毒破坏或是系统突然崩溃,或是“硬盘进出(I/O)表”损坏,造成硬盘进不去了。原先备份的两个文件的数据还存放在硬盘内的某个扇区中,只要我们在硬盘的扇区内找到备份的这些重要数据,就可以使硬盘死而复生。

方法一:利用KV3000硬盘救护箱F6功能内的F4“磁盘扇区字符串搜索”功能,搜索“DISKC:[BACKUP]”字符串,注意:该字符串中间没有空格。找到后记下所在位置的扇区值,再向后翻一页,就是硬盘分区表(主引导扇区),再向后翻一页,就是“硬盘进出(I/O)表”。将这两个表用KV3000移写扇区功能,分别写到硬盘0扇区(硬盘主引导扇区)与63扇区(硬盘系统引导扇区,既进出(I/O)表),这样,再重新引导机器,硬盘上您宝贵的重要数据就可以神奇的恢复,

方法二:进入KV3000硬盘救护箱F6功能内,按下“END”键,进入硬盘最后一扇区,再向前倒回4个扇区,就会发现这是一个表,在表的第一行上有“FILEC:[BACKUP]”字样,在表的第二行的前4字节记录了DISKC.DAT文件备份的日期,在表的第17-20字节记录了备份文件DISKC.DAT数据存放的首扇区数值。记下这个数值,注意:表上的数值是高位在后,低位在前,做记录时颠倒过来,高位在前,低位在后。

再按下F7键,这是KV3000为方便用户进行十进制数与十六进值数相互换算的一个功能,换算功能可达12位数,能换算达到这样高位的软件几乎很少见。我们将记录下的十六进制数换算成十进制数,再记录下这个十进制数,按下F3功能键,输入换算出的十进数,再回车,即显示出原备份文件的首扇区数,再向后翻一页,就是“硬盘进出(I/O)表”。将这两个表用KV3000移写扇区功能,分别写到硬盘0扇区与63扇区即可。

如果C盘的根目录也全丢了,按照第一种方法,搜索“COMMAND.COM”字符串,注意:也可搜索您自己所熟悉的是英文字母的子目录名字,找到后,按回车键查看,如不对,可再按回车键,继续搜索。找到后,记下所在位置的扇区数值,再将这个保存的目录表用KV3000移写扇区功能,写到硬盘原目录区内。这样,再重新引导机器就OK了。

篇7:教你巧用数据库日志恢复数据到时间点备份恢复

问题:update或delete语句忘带了where子句,或where子句精度不够,执行之后造成了严重的后果,这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份或不能备份日志(truncate log on checkpoint选项为1),那么就无法进行数据的恢复了,或者只能恢复到最近一次的备份的数据了,

恢复数据的方法:

1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进进行一次日志备份(如果为了不让日志文件变大而置trunc. log on chkpt.选项为不能是1)

backup log dbName to disk='fileName'

2,恢复一个全库备份,注意需要使用with norecovery,如果还有其他差异或增量备份,则逐个恢复

restore database dbName from disk='fileName' with norecovery

3,恢复最后一个日志备份即刚做的日志备份,指定恢复时间点到误操作之前的时刻

restore log dbName from disk='fileName'

with stopat='date_time'

以上这些操作都可以在SQL SERVER企业管理器里完成,难度不大,

当然,如果误操作是一些不记日志的操作比如truncate table,select into等操作,那么是无法利用上述方法来恢复数据的。

关 键 字:MYSQL

篇8:NTFS格式大硬盘数据恢复特殊案例

公司一块80G 迈拓金九硬盘,某天突然进不了分区,提示为“无法访问X: 参数错误”,硬盘上为该公司为本市摄制和编辑的运动会视频和音频文件,摄录磁带中已清除,运动会也不可能再开一次。先前到某电脑公司去试过,结果没能解决问题。广告公司经理和我的一个朋友是朋友,知道此事后就转来我处。

修复过程:该硬盘为只有一个NTFS分区的数据盘,先在DOS下用扇区编辑软件查看LBA0--63扇区,结果发现分区表和63扇区都有错误,1―62扇区间有大量扇区被写上不明代码,87-102扇区不正常,先手工修复分区表,恢复63引导扇区,删除1―62扇区间的代码。87-102扇区之间暂不处理,到WINDOWS下检查,结果还是出现同样的提示,试用恢复软件1,可以看到目录结构,再试FINALDATE,这个软件此时太不尽人意;用恢复软件1选择某目录进行试恢复,结果28个试恢复文件只恢复2个,其余的全部为0字节,恢复工作陷入困境。再次对79-102扇区进行分析,79扇区面目全非,被严重篡改破坏,80-86扇区被清空,87-102扇区的内容也不正常。经过一番苦思冥想,对某些扇区进行备份后做清除,备份被放到1-62扇区之间,以备不测时改回原样。

再次在WINDOWS下用恢复软件1进行恢复,让其读该盘约10秒钟,停止扫描,看到的内容和前面提到的相同,试恢复一个文件夹,从恢复过程能看到这时恢复动作正常了,随后对其余的文件和文件夹进行恢复,近3个多小时后,63.9G资料全部恢复,文件中几乎就AVI、WAV、PSD和其它格式的图形文件,逐个打开完全正常,

恢复工作顺利结束,大功告成。

后来一个朋友说这个分区应该是格式化出来的,mft在分区的前面,很容易被破坏,象此案里里面87-102扇区里大约有6个左右的用户文件/文件夹是恢复不出来的,但102~~以后的文件应该能完全恢复的。在ntfs里面,一般90扇区以后的mft才是用户的文件信息,前面的是系统的一些元文件,对数据恢复影响不大的。

个人觉得ntfs还是比较先进的,文件碎片都放在一个mft里面,只要这个扇区没有被破坏,就可以恢复。

NTFS的结构确实比较复杂,正常情况下所有的操作MFT中有记录。但是,那些扇区被使用,那些没被使用,这些概念还是很有用的。

实验盘被删除79-102扇区内容后,开机后不需要第三方软件,文件和目录直接可以读出拷贝到其它地方。查看被删除扇区内容,95扇区后的内容都自动修复了,80-94嘛。。。。看来MFT中应该还有一个备份,或是具有自动修复功能。

故障盘为何就不能自动修复?且不让访问。故障盘中某些扇区看来是被利用了。它的数据恢复是通过第三方软件得到的,对第三方软件来讲,就算格式化了,绝大部分数据还是能找回来的。

篇9:Oracle备份与恢复案例数据库教程

oracle|备份|恢复

一. 理解什么是数据库恢复

当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失,因此当发生上述故障后,希望能重构这个完整的数据库,该处理称为数据库恢复。恢复过程大致可以分为复原(Restore)与恢复(Recover)过程。

数据库恢复可以分为以下两类:

1.1实例故障的一致性恢复

当实例意外地(如掉电、后台进程故障等)或预料地(发出SHUTDOUM ABORT语句)中止时出现实例故障,此时需要实例恢复。实例恢复将数据库恢复到故障之前的事务一致状态。如果在在线后备发现实例故障,则需介质恢复。在其它情况Oracle在下次数据库起动时(对新实例装配和打开),自动地执行实例恢复。如果需要,从装配状态变为打开状态,自动地激发实例恢复,由下列处理:

1) 为了解恢复数据文件中没有记录的数据,进行向前滚。该数据记录在在线日志,

包括对回滚段的内容恢复。

2) 回滚未提交的事务,按步1重新生成回滚段所指定的操作。

3) 释放在故障时正在处理事务所持有的资源。

4) 解决在故障时正经历一阶段提交的任何悬而未决的分布事务。

1.2介质故障或文件错误的不一致恢复

介质故障是当一个文件、一个文件的部分或磁盘不能读或不能写时出现的故障。文件错误一般指意外的错误导致文件被删除或意外事故导致文件的不一致。这种状态下的数据库都是不一致的,需要DBA手工来进行数据库的恢复,这种恢复有两种形式,决定于数据库运行的归档方式和备份方式。

(1) 完全介质恢复可恢复全部丢失的修改。一般情况下需要有数据库的备份且数据库运行在归档状态下并且有可用归档日志时才可能。对于不同类型的错误,有不同类型的完全恢复可使用,其决定于毁坏文件和数据库的可用性。

(2) 不完全介质恢复是在完全介质恢复不可能或不要求时进行的介质恢复。重构受损的数据库,使其恢复介质故障前或用户出错之前的一个事务一致性状态。不完全介质恢复有不同类型的使用,决定于需要不完全介质恢复的情况,有下列类型:基于撤消、基于时间和基于修改的不完全恢复。

挥诔废(CANCEL)恢复:在某种情况,不完全介质恢复必须被控制,DBA可撤消在指定点的操作。基于撤消的恢复地在一个或多个日志组(在线的或归档的)已被介质故障所破坏,不能用于恢复过程时使用,所以介质恢复必须控制,以致在使用最近的、未损的日志组于数据文件后中止恢复操作。

挥谑奔(TIME)和基于修改(SCN)的恢复:如果DBA希望恢复到过去的某个指定点,是一种理想的不完全介质恢复,一般发生在恢复到某个特定操作之前,恢复到如意外删除某个数据表之前。

第二章. 数据库恢复案例测试环境

2.1 数据库环境

以下的所有案例都是通过测试经过,环境为:

OS:Windows 2000 Server

DB:Oracle 816

DBNAME:TEST

数据文件:

SQL> select file#,status,enabled,name from v$datafile;

FILE# STATUS ENABLED    NAME

----------------------------------------------------------------

1 SYSTEM READ WRITE D:OracleORADATATEST YSTEM01.DBF

2 ONLINE READ WRITE D:OracleORADATATESTRBS01.DBF

3 ONLINE READ WRITE D:OracleORADATATESTUSERS01.DBF

4 ONLINE READ WRITE D:OracleORADATATESTTEMP01.DBF

5 ONLINE READ WRITE D:OracleORADATATESTTOOLS01.DBF

6 ONLINE READ WRITE D:OracleORADATATESTINDX01.DBF

控制文件:

SQL> select * from v$controlfile;

STATUS NAME

---------------------------------------------------------------------

D:OracleORADATATESTCONTROL01.CTL

D:OracleORADATATESTCONTROL02.CTL

D:OracleORADATATESTCONTROL03.CTL

联机日志:

SQL> select * from v$logfile;

GROUP# STATUS    MEMBER

---------------------------------------------------------------------

1   STALE    D:OracleORADATATESTREDO01.LOG

2             D:OracleORADATATESTREDO02.LOG

3   STALE    D:OracleORADATATESTREDO03.LOG

2.2 数据库备份脚本

冷备份脚本:

rem    script.:coldbak.sql

rem    creater:chenjiping

rem    date:5.8.

rem    desc:offline full backup database

--connect database

connect internal/password;

--shutdown database

shutdown immediate;

--Copy Data file

!xcopy d:Oracleoradatatest*.dbf d:database/H/R;

--Copy Control file

!xcopy d:Oracleoradatatest*.ctl d:database/H/R;

--Copy Log file

!xcopy d:Oracleoradatatest*.log d:database/H/R;

--startup database

startup;

说明:

1、以上脚本在数据库关闭状态下备份数据库所有的数据文件,联机日志,控制文件(在一个目

录下),如果成功备份,所有文件是一致的;

2、没有备份参数文件,参数文件可以另外备份,没有必要每次都备份,只需要在改变设置后备份一次;

3、如果以上命令没有成功依次执行,那么备份将是无效的,如连接数据库不成功,那么肯定关闭数据库也不成功,那么备份则无效;

4、冷备份建议下人工干预下执行。

数据库OS热全备份脚本

rem    script.:hotbak.sql

rem    creater:chenjiping

rem    date:5.8.2003

rem    desc:backup all database datafile in archive

--connect database

connect internal/password;

--archive

alter system archive log current;

--start

alter tablespace system begin backup;

!xcopy d:Oracleoradatatest ystem01.dbf d:databak/H/R;

alter tablespace system end backup;

alter tablespace rbs begin backup;

!xcopy d:Oracleoradatatestrbs01.dbf d:databak/H/R;

alter tablespace rbs end backup;

alter tablespace users begin backup;

!xcopy d:Oracleoradatatestusers01.dbf d:databak/H/R;

alter tablespace users end backup;

alter tablespace tools begin backup;

!xcopy d:Oracleoradatatesttools01.dbf d:databak/H/R;

alter tablespace tools end backup;

alter tablespace indx begin backup;

!xcopy d:Oracleoradatatestindx01.dbf d:databak/H/R;

alter tablespace indx end backup;

--end

--bak control file

--binary

alter database backup controlfile to 'd:databakcontrolbinbak.000';

--ascii

alter database backup controlfile to trace;

alter system archive log current;

说明:

1、热备份必须在数据库归档方式下才可以运行;

2、以上脚本可以在数据库运行状态下备份数据库所有的数据文件(除了临时数据文件),没有必要备份联机日志;

3、归档日志至少需要一次完整备份之后的所有日志;

4、如果以上命令没有成功依次执行,那么备份也是无效的,如连接数据库不成功,那么备份则无效。

RMAN备份只讲叙有恢复目录的情况,如果没有恢复目录,情形大致相似。以下是RMAN的热备份全备份的脚本:

#  script.:bakup.rcv

#  creater:chenjiping

#  date:5.8.2003

#  desc:backup all database datafile in archive with rman

# connect database

connect rcvcat rman/rman@back;

connect target internal/virpure;

# start backup database

run{

allocate channel c1 type disk;

backup full tag 'dbfull' format 'd:backupfull%u_%s_%p' database

include current controlfile;

sql 'alter system archive log current';

release channel c1;

}

# end

说明:

1、 数据库必须运行在归档模式下;

2、 RMAN将自动备份数据文件,运行可靠;

3、 归档日志另外备份处理,但至少需要保存一次备份来的日志;

4、 没有必要用RMAN做冷备份,效果不好。

以上举例说明了数据库的恢复案例的测试环境与部分备份测试脚本,其它的备份脚本可以根据以上脚本演变而来或在案例中加以说明。

数据库的自动实例将不加以说明,这里只举例说明媒体错误或人为错误造成的恢复可能。

以上包括以下案例都是在WINDOWS+Oracle816上测试验证的,在不同的操作系统与不同的数据库版本中略有差别。

第三章. 了解与恢复相关的信息

1、 理解报警日志文件

报警日志文件一般记载了数据库的启动/关闭信息,归档信息,备份信息,恢复信息,常见错误信息,部分数据库修改记录等。一般令名规则为Alrt.log或Alrt.log,如我的测试数据库的报警日志文件的名称为testalrt.log。

报警日志文件的路径是根据初始化参数background_dump_dest来决定的,如在我的机器上,该参数值为 D:Oracleadmintestbdump,那么,你就可以在该路径下找到该文件。

2、 后台进程跟踪文件

后台进程跟踪文件的路径与报警日志文件的路径一致,在某些情况下,你可以通过后台跟踪文件的信息了解更多的需要恢复的信息。如在数据库需要恢复的时候,报警日志文件中常有这样的语句:

Errors in file D:OracleadmintestbdumptestDBW0.TRC:

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

通过提示的DBWR跟踪文件,可以查询到更详细的信息。

3、 v$recover_file与v$recovery_log

这是两个动态性能视图,可以在mount下查看,通过这两个视图,你可以了解详细的需要恢复的数据文件与需要使用到的归档日志。

第四章. 数据库恢复案例

4.1非归档模式下的备份与恢复

备份方案:采用OS冷备份

1. 连接数据库并创建测试表

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int);

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

2. 备份数据库

SQL> @coldbak.sql 或在DOS下 svrmgrl @coldbak.sql

3. 再插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

A

-------------------

1

2

4. 关闭数据库

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down.

5. 毁坏一个或多个数据文件,如删除user01.dbf

C:>del D:OracleORADATATESTUSERS01.DBF

模拟媒体毁坏。

6. 重新启动数据库,会发现如下错误

SQL> startup

Oracle instance started.

Total System Global Area 10364 bytes

Fixed Size                   70924 bytes

Variable Size             85487616 bytes

Database Buffers          16384000 bytes

Redo Buffers                 77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: 'D:OracleORADATATESTUSERS01.DBF'

在报警文件中,会有更详细的信息

Errors in file D:OracleadmintestbdumptestDBW0.TRC:

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: 'D:OracleORADATATESTUSERS01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

7. 拷贝备份复原到原来位置(restore过程)

C:>xcopy d:database*.* d:Oracleoradatatest/H/R/S

8. 打开数据库,检查数据

SQL> alter database open;

Database altered.

SQL> select * from test;

A

---------------------------------------

1

这里可以发现,数据库恢复成功,但在备份之后与崩溃之前的数据丢失了。

说明:

1、非归档模式下的恢复方案可选性很小,一般情况下只能有一种恢复方式,就是数据库的冷备

份的完全恢复,仅仅需要拷贝原来的备份就可以(restore),不需要recover;

2、这种情况下的恢复,可以完全恢复到备份的点上,但是可能是丢失数据的,在备份之后与崩溃之前的数据将全部丢失;

3、不管毁坏了多少数据文件或是联机日志或是控制文件,都可以通过这个办法恢复,因为这个恢复过程是Restore所有的冷备份文件,而这个备份点上的所有文件是一致的,与最新的数据库没有关系,就好比把数据库又放到了一个以前的“点”上;

4、对于非归档模式下,最好的办法就是采用OS的冷备份,建议不要用RMAN来作冷备份,效果不好,因为RMAN不备份联机日志,restore不能根本解决问题;

5、如果没有备份联机日志,如RMAN的备份,就需要利用不完全恢复(until cancel)的方法来重新创建联机日志文件。

4.2归档模式下丢失或损坏一个数据文件

4.2.1 OS备份方案

在归档方式下损坏或丢失一个数据文件,如果存在相应的备份与该备份以来的归档日志,恢复还是比较简单的,可以作到尽量少的Down机时间,并能作到数据库的完全恢复。

1、 连接数据库,创建测试表并插入记录

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int) tablespace users;

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

2、 备份数据库

SQL> @hotbak.sql 或在DOS下 svrmgrl @hotbak.sql

3、 继续在测试表中插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

A

--------------------------------------

1

2

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

4、 关闭数据库,模拟丢失数据文件

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down

C:>del D:OracleORADATATESTUSERS01.DBF

模拟媒体毁坏。

5、 启动数据库错误,脱机该数据文件:

SQL> startup

Oracle instance started.

Total System Global Area 102020364 bytes

Fixed Size                   70924 bytes

Variable Size             85487616 bytes

Database Buffers          16384000 bytes

Redo Buffers                 77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: 'D:OracleORADATATESTUSERS01.DBF'

还可以查看报警文件(见上一个恢复案例)或动态视图v$recover_file

如SQL> select * from v$recover_file;

FILE# ONLINE ERROR                  CHANGE#   TIME

---------- ------- ------------------ ---------- -----------

3 ONLINE                       1013500  2003-05-07

脱机数据文件

SQL> alter database datafile 3 offline drop;

Database altered.

6、 打开数据库,拷贝备份回来(restore),恢复(recover)该数据文件,并联机:

SQL> alter database open;

Database altered.

拷贝备份从备份处

copy d:databak users01.dbf d:Oracleoradatatest;

恢复该数据文件

SQL> recover datafile 3;

ORA-00279: change 1053698 generated at 05/07/2003 17:51:26 needed for

thread 1

ORA-00289: suggestion :

D:OracleORADATATESTARCHIVETESTT001S00304.ARC

ORA-00280: change 1053698 for thread 1 is in sequence #304

Specify log: {=suggested | filename | AUTO | CANCEL}

AUTO

ORA-00279: change 1053701 generated at 05/07/2003 17:51:39 needed for

thread 1

ORA-00289: suggestion : D:OracleORADATATESTARCHIVETESTT001S00305.ARC

ORA-00280: change 1053701 for thread 1 is in sequence #305

ORA-00278: log file 'D:OracleORADATATESTARCHIVETESTT001S00304.ARC' no longer needed for this recovery Log applied.

Media recovery complete.

恢复成功,联机该数据文件

SQL> alter database datafile 3 online;

Database altered.

7、 检查数据库的数据(完全恢复)

SQL> select * from test;

A

--------------------------------

1

2

说明:

1、采用热备份,需要运行在归档模式下,可以实现数据库的完全恢复,也就是说,从备份后到数据库崩溃时的数据都不会丢失;

2、可以采用全备份数据库的方式备份,对于特殊情况,也可以只备份特定的数据文件,如只备份用户表空间(一般情况下对于某些写特别频繁的数据文件,可以单独加大备份频率);

3、如果在恢复过程中,发现损坏的是多个数据文件,即可以采用一个一个数据文件的恢复方法(第5步中需要对数据文件一一脱机,第6步中需要对数据文件分别恢复),也可以采用整个数据库的恢复方法;

4、如果是系统表空间的损坏,不能采用此方法。

4.2.2 RMAN备份方案

RMAN也可以进行联机备份,而且备份与恢复方法将比OS备份更简单可靠。

1、连接数据库,创建测试表并插入记录

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int) tablespace users;

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

2、 备份数据库表空间users

C:>rman

Recovery Manager: Release 8.1.6.0.0 - Production

RMAN> connect rcvcat rman/rman@back

RMAN-06008: connected to recovery catalog database

RMAN> connect target internal/virpure

RMAN-06005: connected to target database: TEST (DBID=1788174720)

RMAN> run{

2> allocate channel c1 type disk;

3> backup tag 'tsuser' format 'd:backuptsuser_%u_%s_%p'

4> tablespace users;

5> release channel c1;

6> }

RMAN-03022: compiling command: allocate

RMAN-03023: executing command: allocate

RMAN-08030: allocated channel: c1

RMAN-08500: channel c1: sid=16 devtype=DISK

RMAN-03022: compiling command: backup

RMAN-03025: performing implicit partial resync of recovery catalog

RMAN-03023: executing command: partial resync

RMAN-08003: starting partial resync of recovery catalog

RMAN-08005: partial resync complete

RMAN-03023: executing command: backup

RMAN-08008: channel c1: starting full datafile backupset

RMAN-08502: set_count=5 set_stamp=494177612 creation_time=16-MAY-03

RMAN-08010: channel c1: specifying datafile(s) in backupset

RMAN-08522: input datafile fno=00003 name=D:OracleORADATATESTUSER01.DBF

RMAN-08013: channel c1: piece 1 created

RMAN-08503: piece handle=D:BACKUPTSUSER_05EN93AC_5_1 comment=NONE

RMAN-08525: backup set complete, elapsed time: 00:00:01

RMAN-03023: executing command: partial resync

RMAN-08003: starting partial resync of recovery catalog

RMAN-08005: partial resync complete

RMAN-03022: compiling command: release

RMAN-03023: executing command: release

RMAN-08031: released channel: c1

RMAN>

3、 继续在测试表中插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

A

---------------------------------------

1

2

SQL> alter system switch logfile;

System altered.

SQL>r

1* alter system switch logfile;

System altered.

4、 关闭数据库,模拟丢失数据文件

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down

C:>del D:OracleORADATATESTUSER01.DBF

5、 启动数据库,检查错误

SQL> startup

Oracle instance started.

Total System Global Area 102020364 bytes

Fixed Size                   70924 bytes

Variable Size             85487616 bytes

Database Buffers          16384000 bytes

Redo Buffers                 77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: 'D:OracleORADATATESTUSER01.DBF'

6、 先打开数据库

SQL> alter database datafile 3 offline drop;

Database altered.

SQL> alter database open;

Database altered.

7、 恢复该表空间

恢复脚本可以是恢复单个数据文件

run{

allocate channel c1 type disk;

restore datafile 3;

recover datafile 3;

sql 'alter database datafile 3 online';

release channel c1;

}

也可以是,恢复表空间

run{

allocate channel c1 type disk;

restore tablespace users;

recover tablespace users;

sql 'alter database datafile 3 online';

release channel c1;

}

过程如下:

C:>rman

Recovery Manager: Release 8.1.6.0.0 - Production

RMAN> connect rcvcat rman/rman@back

RMAN-06008: connected to recovery catalog database

RMAN> connect target internal/virpure

RMAN-06005: connected to target database: TEST (DBID=1788174720)

RMAN> run{

2> allocate channel c1 type disk;

3> restore datafile 3;

4> recover datafile 3;

5> sql 'alter database datafile 3 online';

6> release channel c1;

7> }

//输出内容冗长,省略--编者

RMAN>

8、 检查数据是否完整

SQL> alter database open;

Database altered.

SQL> select * from test;

A

---------------------------------------

1

2

说明:

1、RMAN也可以实现单个表空间或数据文件的恢复,恢复过程可以在mount下或open方式下,如果在open方式下恢复,可以减少down机时间;

2、如果损坏的是一个数据文件,建议offline并在open方式下恢复;

3、这里可以看到,RMAN进行数据文件与表空间恢复的时候,代码都比较简单,而且能保证备份与恢复的可靠性,所以建议采用RMAN的备份与恢复.

4.3丢失多个数据文件,实现整个数据库的恢复.

4.3.1 OS备份方案

OS备份归档模式下损坏(丢失)多个数据文件,进行整个数据库的恢复

1、 连接数据库,创建测试表并插入记录

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int);

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

2、 备份数据库,备份除临时数据文件后的所数据文件

SQL> @hotbak.sql 或在DOS下 svrmgrl @hotbak.sql

3、 继续在测试表中插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

A

---------------------------------------

1

2

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

4、 关闭数据库,模拟丢失数据文件

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down

C:>del D:OracleORADATATEST YSTEM01.DBF

C:>del D:OracleORADATATESTINDX01.DBF

C:>del D:OracleORADATATESTTOOLS01.DBF

C:>del D:OracleORADATATESTRBS01.DBF

模拟媒体毁坏(这里删除多个数据文件)

5、 启动数据库,检查错误

SQL> STARTUP

Oracle instance started.

Total System Global Area 102020364 bytes

Fixed Size                   70924 bytes

Variable Size             85487616 bytes

Database Buffers          16384000 bytes

Redo Buffers                 77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: 'D:OracleORADATATEST YSTEM01.DBF'

详细信息可以查看报警文件

ORA-1157 signalled during: ALTER DATABASE OPEN...

Thu May 08 09:39:36 2003

Errors in file D:OracleadmintestbdumptestDBW0.TRC:

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: 'D:OracleORADATATEST YSTEM01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

Thu May 08 09:39:36 2003

Errors in file D:OracleadmintestbdumptestDBW0.TRC:

ORA-01157: cannot identify/lock data file 2 - see DBWR trace file

ORA-01110: data file 2: 'D:OracleORADATATESTRBS01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

Thu May 08 09:39:36 2003

Errors in file D:OracleadmintestbdumptestDBW0.TRC:

ORA-01157: cannot identify/lock data file 5 - see DBWR trace file

ORA-01110: data file 5: 'D:OracleORADATATESTTOOLS01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

Thu May 08 09:39:36 2003

Errors in file D:OracleadmintestbdumptestDBW0.TRC:

ORA-01157: cannot identify/lock data file 6 - see DBWR trace file

ORA-01110: data file 6: 'D:OracleORADATATESTINDX01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

通过查询v$recover_file可以看到

SQL> select * from v$recover_file;

FILE# ONLINE ERROR                CHANGE# TIME

---------- ------- ------------------ ---------- -----------

1 ONLINE FILE NOT FOUND             0

2 ONLINE FILE NOT FOUND             0

5 ONLINE FILE NOT FOUND             0

6 ONLINE FILE NOT FOUND             0

有四个数据文件需要恢复

6、 拷贝备份回到原地点(restore),开始恢复数据库(recover)

restore过程:

C:>copy D:DATABAK YSTEM01.DBF D:OracleORADATATEST

C:>copy D:DATABAKTESTINDX01.DBF D:OracleORADATATEST

C:>copy D:DATABAKTESTTOOLS01.DBF D:OracleORADATATEST

C:>copy D:DATABAKTESTRBS01.DBF.DBF D:OracleORADATATEST

Recover过程:

SQL> recover database;

ORA-00279: change 1073849 generated at 05/08/2003 08:58:35 needed for thread 1

ORA-00289: suggestion : D:OracleORADATATESTARCHIVETESTT001S00311.ARC

ORA-00280: change 1073849 for thread 1 is in sequence #311

Specify log: {=suggested | filename | AUTO | CANCEL}

auto

ORA-00279: change 1073856 generated at 05/08/2003 09:03:27 needed for thread 1

ORA-00289: suggestion : D:OracleORADATATESTARCHIVETESTT001S00312.ARC

ORA-00280: change 1073856 for thread 1 is in sequence #312

ORA-00278: log file 'D:OracleORADATATESTARCHIVETESTT001S00311.ARC' no

longer needed for this recovery

ORA-00279: change 1073858 generated at 05/08/2003 09:11:43 needed for thread 1

ORA-00289: suggestion : D:OracleORADATATESTARCHIVETESTT001S00313.ARC

ORA-00280: change 1073858 for thread 1 is in sequence #313

ORA-00278: log file 'D:OracleORADATATESTARCHIVETESTT001S00312.ARC' no

longer needed for this recovery

ORA-00279: change 1073870 generated at 05/08/2003 09:11:46 needed for thread 1

ORA-00289: suggestion : D:OracleORADATATESTARCHIVETESTT001S00314.ARC

ORA-00280: change 1073870 for thread 1 is in sequence #314

ORA-00278: log file 'D:OracleORADATATESTARCHIVETESTT001S00313.ARC' no

longer needed for this recovery

Log applied.

Media recovery complete.

7、 打开数据库,检查数据库的数据(完全恢复)

SQL> alter database open;

Database altered.

SQL> select * from test;

A

---------------------------------------

1

2

说明:

1、只要有备份与归档存在,就可以实现数据库的完全恢复(不丢失数据);

2、适合于丢失大量数据文件,或包含系统数据文件在内的数据库的恢复;

3、恢复过程在mount下进行,如果恢复成功,再打开数据库,down机时间可能比较长一些。

4.3.2 RMAN备份方案

RMAN备份归档模式下损坏(丢失)多个数据文件,进行整个数据库的恢复

1、连接数据库,创建测试表并插入记录

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int);

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

2、备份数据库

DOS下 C:> rman cmdfile=bakup.rcv msglog=backup.log;

以下是backup.log内容。

Recovery Manager: Release 8.1.6.0.0 - Production

RMAN> #    script.:bakup.rcv

2> #    creater:chenjiping

3> #    date:5.8.2003

4> #    desc:backup all database datafile in archive with rman

5>

6> #connect database

7> connect rcvcat rman/rman@back;

8> connect target internal/virpure;

9>

10> #start backup database

11> run{

12> allocate channel c1 type disk;

13> backup full tag 'dbfull' format 'd:backupfull%u_%s_%p' database

14> include current controlfile;

15> sql 'alter system archive log current';

16> release channel c1;

17> }

18> #end

19>

RMAN-06008: connected to recovery catalog database

RMAN-06005: connected to target database: TEST (DBID=1788174720)

RMAN-03022: compiling command: allocate

RMAN-03023: executing command: allocate

RMAN-08030: allocated channel: c1

RMAN-08500: channel c1: sid=15 devtype=DISK

RMAN-03022: compiling command: backup

RMAN-03023: executing command: backup

RMAN-08008: channel c1: starting full datafile backupset

RMAN-08502: set_count=4 set_stamp=494074368 creation_time=15-MAY-03

RMAN-08010: channel c1: specifying datafile(s) in backupset

RMAN-08522: input datafile fno=00002 name=D:OracleORADATATESTRBS01.DBF

RMAN-08522: input datafile fno=00001 name=D:OracleORADATATEST YSTEM01.DBF

RMAN-08011: including current controlfile in backupset

RMAN-08522: input datafile fno=00005 name=D:OracleORADATATESTTOOLS01.DBF

RMAN-08522: input datafile fno=00004 name=D:OracleORADATATESTTEMP01.DBF

RMAN-08522: input datafile fno=00006 name=D:OracleORADATATESTINDX01.DBF

RMAN-08522: input datafile fno=00003 name=D:OracleORADATATESTUSER01.DBF

RMAN-08013: channel c1: piece 1 created

RMAN-08503: piece handle=D:BACKUPFULL04EN5UG0_4_1 comment=NONE

RMAN-08525: backup set complete, elapsed time: 00:01:16

RMAN-03023: executing command: partial resync

RMAN-08003: starting partial resync of recovery catalog

RMAN-08005: partial resync complete

RMAN-03022: compiling command: sql

RMAN-06162: sql statement: alter system archive log current

RMAN-03023: executing command: sql

RMAN-03022: compiling command: release

RMAN-03023: executing command: release

RMAN-08031: released channel: c1

Recovery Manager complete.

到这里表示备份成功。

3、 继续在测试表中插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

A

---------------------------------------

1

2

SQL>alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

4、 关闭数据库,模拟丢失数据文件

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down

C:>del D:OracleORADATATEST YSTEM01.DBF

C:>del D:OracleORADATATESTINDX01.DBF

C:>del D:OracleORADATATESTTOOLS01.DBF

C:>del D:OracleORADATATESTRBS01.DBF

5、启动数据库,检查错误

SQL> STARTUP

Oracle instance started.

Total System Global Area 102020364 bytes

Fixed Size                   70924 bytes

Variable Size             85487616 bytes

Database Buffers          16384000 bytes

Redo Buffers                 77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: 'D:OracleORADATATEST YSTEM01.DBF'

查询v$recover_file

SQL> select * from v$recover_file;

FILE# ONLINE ERROR                CHANGE# TIME

---------- ------- ------------------ ---------- -----------

1 ONLINE FILE NOT FOUND             0

2 ONLINE FILE NOT FOUND             0

5 ONLINE FILE NOT FOUND             0

6 ONLINE FILE NOT FOUND             0

可以知道有四个数据文件需要恢复.

6、利用RMAN进行恢复

C:>rman

Recovery Manager: Release 8.1.6.0.0 - Production

RMAN> connect rcvcat rman/rman@back

RMAN-06008: connected to recovery catalog database

RMAN> connect target internal/virpure

RMAN-06005: connected to target database: TEST (DBID=1788174720)

RMAN> run{

2> allocate channel c1 type disk;

3> restore database;

4> recover database;

5> sql 'alter database open';

6> release channel c1;

7> }

RMAN-03022: compiling command: allocate

RMAN-03023: executing command: allocate

RMAN-08030: allocated channel: c1

RMAN-08500: channel c1: sid=17 devtype=DISK

RMAN-03022: compiling command: restore

RMAN-03025: performing implicit partial resync of recovery catalog

RMAN-03023: executing command: partial resync

RMAN-08003: starting partial resync of recovery catalog

RMAN-08005: partial resync complete

RMAN-03022: compiling command: IRESTORE

RMAN-03023: executing command: IRESTORE

RMAN-08016: channel c1: starting datafile backupset restore

RMAN-08502: set_count=4 set_stamp=494074368 creation_time=15-MAY-03

RMAN-08089: channel c1: specifying datafile(s) to restore from backup set

RMAN-08523: restoring datafile 00001 to D:OracleORADATATEST YSTEM01.DBF

RMAN-08523: restoring datafile 00002 to D:OracleORADATATESTRBS01.DBF

RMAN-08523: restoring datafile 00003 to D:OracleORADATATESTUSER01.DBF

RMAN-08523: restoring datafile 00004 to D:OracleORADATATESTTEMP01.DBF

RMAN-08523: restoring datafile 00005 to D:OracleORADATATESTTOOLS01.DBF

RMAN-08523: restoring datafile 00006 to D:OracleORADATATESTINDX01.DBF

RMAN-08023: channel c1: restored backup piece 1

RMAN-08511: piece handle=D:BACKUPFULL04EN5UG0_4_1 tag=DBFULL params=NULL

RMAN-08024: channel c1: restore complete

RMAN-03023: executing command: partial resync

RMAN-08003: starting partial resync of recovery catalog

RMAN-08005: partial resync complete

RMAN-03022: compiling command: recover

RMAN-03022: compiling command: recover(1)

RMAN-03022: compiling command: recover(2)

RMAN-03022: compiling command: recover(3)

RMAN-03023: executing command: recover(3)

RMAN-08054: starting media recovery

RMAN-03022: compiling command: recover(4)

RMAN-06050: archivelog thread 1 sequence 327 is already on disk as file D:OracleORADATATESTARCHIVETESTT001S00327.ARC

RMAN-06050: archivelog thread 1 sequence 328 is already on disk as file D:OracleORADATATESTARCHIVETESTT001S00328.ARC

RMAN-06050: archivelog thread 1 sequence 329 is already on disk as file D:OracleORADATATESTARCHIVETESTT001S00329.ARC

RMAN-06050: archivelog thread 1 sequence 330 is already on disk as file D:OracleORADATATESTARCHIVETESTT001S00330.ARC

RMAN-03023: executing command: recover(4)

RMAN-08515: archivelog filename=D:OracleORADATATESTARCHIVETESTT001S00327.ARC thread=1 sequence=327

RMAN-08515: archivelog filename=D:OracleORADATATESTARCHIVETESTT001S00328.ARC thread=1 sequence=328

RMAN-08055: media recovery complete

RMAN-03022: compiling command: sql

RMAN-06162: sql statement: alter database open

RMAN-03023: executing command: sql

RMAN-03022: compiling command: release

RMAN-03023: executing command: release

RMAN-08031: released channel: c1

RMAN>

7、 检查数据库的数据(完全恢复)

SQL> select * from test;

A

---------------------------------------

1

2

说明:

1、只要有备份与归档存在,RMAN也可以实现数据库的完全恢复(不丢失数据);

2、同OS备份数据库恢复,适合于丢失大量数据文件,或包含系统数据文件在内的数据库的恢复;

3、目标数据库在mount下进行,如果恢复成功,再打开数据库;

4、RMAN的备份与恢复命令相对比较简单并可靠,建议有条件的话,都采用RMAN进行数据库的备份,

4.4 不完全恢复案例

4.4.1 OS备份下的基于时间的恢复

不完全恢复可以分为基于时间的恢复,基于改变的恢复与基于撤消的恢复,这里已基于时间的恢复为例子来说明不完全恢复过程。

基于时间的恢复可以不完全恢复到现在时间之前的某一个时间,对于某些误操作,如删除了一个数据表,可以在备用恢复环境上恢复到表的删除时间之前,然后把该表导出到正式环境,避免一个人为的错误。

1、 连接数据库,创建测试表并插入记录:

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int);

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

2、 备份数据库,这里最好备份所有的数据文件,包括临时数据文件:

SQL> @hotbak.sql 或在DOS下 svrmgrl @hotbak.sql

或冷备份也可以

3、 删除测试表,假定删除前的时间为T1,在删除之前,便于测试,继续插入数据并应用到归

档。

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

A

---------------------------------------

1

2

SQL> alter system switch logfile;

Statement processed.

SQL> alter system switch logfile;

Statement processed.

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY

-------------------

2003-05-21 14:43:01

SQL> drop table test;

Table dropped.

4、 准备恢复到时间点T1,找回删除的表,先关闭数据库:

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down.

5、 拷贝刚才备份的所有数据文件回来

C:>copy D:DATABAK*.DBF D:OracleORADATATEST

6、 启动到mount下

SQL> startup mount;

Oracle instance started.

Total System Global Area 102020364 bytes

Fixed Size                   70924 bytes

Variable Size             85487616 bytes

Database Buffers          16384000 bytes

Redo Buffers                 77824 bytes

Database mounted.

7、 开始不完全恢复数据库到T1时间

SQL> recover database until time '2003-05-21:14:43:01';

ORA-00279: change 30944 generated at 05/21/2003 14:40:06 needed for thread 1

ORA-00289: suggestion : D:OracleORADATATESTARCHIVETESTT001S00191.ARC

ORA-00280: change 30944 for thread 1 is in sequence #191

Specify log: {=suggested | filename | AUTO | CANCEL}

auto

Log applied.

Media recovery complete.

8、 打开数据库,检查数据

SQL> alter database open resetlogs;

Database altered.

SQL> select * from test;

A

---------------------------------------

1

2

说明:

1、不完全恢复最好备份所有的数据,冷备份亦可,因为恢复过程是从备份点往后恢复的,如果因为其中一个数据文件的时间戳(SCN)大于要恢复的时间点,那么恢复都是不可能成功的;

2、不完全恢复有三种方式,过程都一样,仅仅是recover命令有所不一样,这里用基于时间的恢复作为示例;

3、不完全恢复之后,都必须用resetlogs的方式打开数据库,建议马上再做一次全备份,因为resetlogs之后再用以前的备份恢复是很难了;

4、以上是在删除之前获得时间,但是实际应用中,很难知道删除之前的实际时间,但可以采用大致时间即可,或可以采用分析日志文件(logmnr),取得精确的需要恢复的时间;

5、一般都是在测试机后备用机器上采用这种不完全恢复,恢复之后导出/导入被误删的表回生产系统.

4.4.2 RMAN备份下的基于改变的恢复

以上用OS备份说明了一个基于时间的恢复,现在用RMAN说明一个基于改变的恢复

1、 连接数据库,创建测试表并插入记录

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int);

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

2、 备份数据库

C:>rman

Recovery Manager: Release 8.1.6.0.0 - Production

RMAN> connect rcvcat rman/rman@back

RMAN-06008: connected to recovery catalog database

RMAN> connect target internal/virpure

RMAN-06005: connected to target database: TEST (DBID=874705288)

RMAN> run{

2> allocate channel c1 type disk;

3> backup full tag 'dbfull' format 'd:backupfull%u_%s_%p' database

4> include current controlfile;

5> sql 'alter system archive log current';

6> release channel c1;

7> }

//屏幕输出内容冗长,省略--编辑

RMAN>

3、 删除测试表,在删除之前,便于测试,继续插入数据并应用到归档,并获取删除前的scn号。

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

A

---------------------------------------

1

2

SQL> alter system switch logfile;

Statement processed.

SQL> alter system switch logfile;

Statement processed.

SQL> select max(ktuxescnw * power(2, 32) + ktuxescnb) scn from x$ktuxe;

SCN

----------

31014

SQL> drop table test;

Table dropped.

4、 准备恢复到SCN 31014,先关闭数据库,然后启动到mount下

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down.

SQL> startup mount;

5、 开始恢复到改变点SCN 31014

RMAN> run{

2>     allocate channel c1 type disk;

3>     restore database;

4>     recover database until scn 31014;

5>     sql 'ALTER DATABASE OPEN RESETLOGS';

6>     release channel c1;

7> }

RMAN-03022: compiling command: allocate

RMAN-03023: executing command: allocate

RMAN-08030: allocated channel: c1

RMAN-08500: channel c1: sid=10 devtype=DISK

RMAN-03022: compiling command: restore

RMAN-03022: compiling command: IRESTORE

RMAN-03023: executing command: IRESTORE

RMAN-08016: channel c1: starting datafile backupset restore

RMAN-08502: set_count=1 set_stamp=494613682 creation_time=21-MAY-03

RMAN-08089: channel c1: specifying datafile(s) to restore from backup set

RMAN-08523: restoring datafile 00001 to D:OracleORADATATEST YSTEM01.DBF

RMAN-08523: restoring datafile 00002 to D:OracleORADATATESTRBS01.DBF

RMAN-08523: restoring datafile 00003 to D:OracleORADATATESTUSERS01.DBF

RMAN-08523: restoring datafile 00004 to D:OracleORADATATESTTEMP01.DBF

RMAN-08523: restoring datafile 00005 to D:OracleORADATATESTTOOLS01.DBF

RMAN-08523: restoring datafile 00006 to D:OracleORADATATESTINDX01.DBF

RMAN-08023: channel c1: restored backup piece 1

RMAN-08511: piece handle=D:BACKUPFULL01ENMD5I_1_1 tag=DBFULL params=NULL

RMAN-08024: channel c1: restore complete

RMAN-03023: executing command: partial resync

RMAN-08003: starting partial resync of recovery catalog

RMAN-08005: partial resync complete

RMAN-03022: compiling command: recover

RMAN-03022: compiling command: recover(1)

RMAN-03022: compiling command: recover(2)

RMAN-03022: compiling command: recover(3)

RMAN-03023: executing command: recover(3)

RMAN-08054: starting media recovery

RMAN-03022: compiling command: recover(4)

RMAN-06050: archivelog thread 1 sequence 191 is already on disk as file D:ORACL

EORADATATESTARCHIVETESTT001S00191.ARC

RMAN-06050: archivelog thread 1 sequence 192 is already on disk as file D:ORACL

EORADATATESTARCHIVETESTT001S00192.ARC

RMAN-03023: executing command: recover(4)

RMAN-08515: archivelog filename=D:OracleORADATATESTARCHIVETESTT001S00191.AR

C thread=1 sequence=191

RMAN-08515:archivelog filename=D:OracleORADATATESTARCHIVETESTT001S00192.ARC

Thread=1 sequence=192

RMAN-08055: media recovery complete

RMAN-03022: compiling command: sql

RMAN-06162: sql statement: ALTER DATABASE OPEN RESETLOGS

RMAN-03023: executing command: sql

RMAN-03022: compiling command: release

RMAN-03023: executing command: release

RMAN-08031: released channel: c1

6、 检查数据

Database altered.

SQL> select * from test;

A

---------------------------------------

1

2

可以看到,表依然存在。

说明:

1、 RMAN也可以实现不完全恢复,方法比OS备份恢复的方法更简单可靠;

2、 RMAN可以基于时间,基于改变与基于日志序列的不完全恢复,基于日志序列的恢复可以指定恢复到哪个日志序列,如

run {

allocate channel ch1 type disk;

allocate channel ch2 type 'sbt_tape';

set until logseq 1234 thread 1;

restore controlfile to '$Oracle_HOME/dbs/cf1.f' ;

replicate controlfile from '$Oracle_HOME/dbs/cf1.f';

alter database mount;

restore database;

recover database;

sql “ALTER DATABASE OPEN RESETLOGS”;

}

3、 与所有的不完全恢复一样,必须在mount下,restore所有备份数据文件,需要resetlogs;

4、 基于改变的恢复比基于时间的恢复更可靠,但是可能也更复杂,需要知道需要恢复到哪一个改变号(SCN),在正常生产中,获取SCN的办法其实也有很多,如查询数据库字典表(V$archived_log or v$log_history),或分析归档与联机日志(logmnr)等。

第五章 其它恢复案例

5.1 损坏联机日志的恢复方法

5.1.1 损坏非当前联机日志

大家都清楚,联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。

1、启动数据库,遇到ORA-00312 or ORA-00313错误,如

ORA-00313: open failed for members of log group 1 of thread 1

ORA-00312: online log 1 thread 1: 'D:OracleORADATATESTREDO01.LOG'

从这里我们知道日志组1的数据文件损坏了

从报警文件可以看到更详细的信息

2、 查看V$log视图

SQL> select group#,sequence#,archived,status from v$log;

GROUP#    SEQUENCE# ARCHIVED STATUS

---------- ---------- -------- ----------------

1         1   YES     INACTIVE

2         2   YES     INACTIVE

3         3   NO      CURRENT

可以知道,该组是非当前状态,而且已经归档。

3、 用CLEAR命令重建该日志文件

SQL>alter database clear logfile group 1;

如果是该日志组还没有归档,则需要用

SQL>alter database clear unarchived logfile group 1;

4、 打开数据库,重新备份数据库

SQL>alter database open;

说明:

1、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear;

2、建议clear,特别是强行clear后作一次数据库的全备份;

3、此方法适用于归档与非归档数据库。

5.1.2 损坏当前联机日志

归档模式下当前日志的损坏有两种情况,

一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损 坏就可以直接用alter database clear unarchived logfile group n来重建。

二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法:

A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份

B. 通过强制性恢复,但是可能导致数据库不一致。

下面分别用来说明这两种恢复方法:

5.1.2.1 通过备份来恢复

1、 打开数据库,会遇到一个类似的错误

ORA-00313: open failed for members of log group 1 of thread 1

ORA-00312: online log 1 thread 1: 'D:OracleORADATATESTREDO01.LOG'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件

2、 查看V$log,发现是当前日志

SQL> select group#,sequence#,archived,status from v$log;

GROUP#    SEQUENCE# ARCHIVED STATUS

--------- ---------- -------- ----------------

1         1   NO      CURRENT

2         2   YES     INACTIVE

3         3   YES     INACTIVE

3、 发现clear不成功

SQL> alter database clear unarchived logfile group 1;

alter database clear unarchived logfile group 1

*

ERROR at line 1:

ORA-01624: log 1 needed for crash recovery of thread 1

ORA-00312: online log 1 thread 1: 'D:OracleORADATATESTREDO01.LOG'

4、 拷贝有效的数据库的全备份,并不完全恢复数据库:

可以采用获取最近的SCN的办法用until scn恢复或用until cnacel恢复

recover database until cancel

先选择auto,尽量恢复可以利用的归档日志,然后重新

recover database until cancel

这次输入cancel,完成不完全恢复,也就是说恢复两次。

如:

SQL> recover database until cancel;

Auto

……

SQL> recover database until cancel;

Cancel;

5、 利用alter database open resetlogs打开数据库.

说明:

1、这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据;

2、这种方法适合于归档数据库并且有可用的数据库全备份;

3、恢复成功之后,记得再做一次数据库的全备份;

4、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

5.1.2.2 如果没有备份,进行强制性恢复

1、 打开数据库,会遇到一个类似的错误

ORA-00313: open failed for members of log group 1 of thread 1

ORA-00312: online log 1 thread 1: 'D:OracleORADATATESTREDO01.LOG'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件

2、 查看V$log,发现是当前日志

SQL> select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIVED STATUS

---------- ---------- -------- ----------------

1         1 NO      CURRENT

2         2 YES     INACTIVE

3         3 YES     INACTIVE

3、 发现clear不成功

SQL> alter database clear unarchived logfile group 1;

alter database clear unarchived logfile group 1

*

ERROR at line 1:

ORA-01624: log 1 needed for crash recovery of thread 1

ORA-00312: online log 1 thread 1: 'D:OracleORADATATESTREDO01.LOG'

4、 把数据库down掉

SQL>shutdown immediate

5、 在init.ora中加入如下参数

_allow_resetlogs_corruption=TRUE

6、 重新启动数据库,利用until cancel恢复

SQL>recover database until cancel;

Cancel

如果出错,不再理会,发出

SQL>alter database open resetlogs;

7、 数据库被打开后,马上执行一个full export

8、 shutdown数据库,去掉_all_resetlogs_corrupt参数

9、 重建库

10、import并完成恢复

11、建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;

说明:

1、该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致;

2、该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据;

3、建议成功后严格执行以上的7到11步,完成数据库的检查与分析;

4、全部完成后做一次数据库的全备份;

5、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

5.2 损坏控制文件的恢复方法

5.2.1 损坏单个控制文件

损坏单个控制文件是比较容易恢复的,因为一般的数据库系统,控制文件都不是一个,而且所有的控制文件都互为镜相,只要拷贝一个好的控制文件替换坏的控制文件就可以了。

1、 控制文件损坏,最典型的就是启动数据库出错,不能mount数据库

SQL>startup

ORA-00205: error in identifying controlfile, check alert log for more info

查看报警日志文件,有如下信息

alter database mount

Mon May 26 11:59:52 2003

ORA-00202: controlfile: 'D:Oracleoradatachencontrol01.ctl'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

2、 停止数据库:

SQL>shutdown immediate

3、 拷贝一个好的控制文件替换坏的控制文件或修改init.ora中的控制文件参数,取消这个坏的控制文件。

4、 重新启动数据:

SQL>startup

说明:

1、损失单个控制文件是比较简单的,因为数据库中所有的控制文件都是镜相的,只需要简单的

拷贝一个好的就可以了;

2、建议镜相控制文件在不同的磁盘上;

3、建议多做控制文件的备份,长期保留一份由alter database backup control file to trace产生的控制文件的文本备份。

5.2.2 损坏全部控制文件

损坏多个控制文件,或者人为的删除了所有的控制文件,通过控制文件的复制已经不能解决问题,这个时候需要重新建立控制文件。

同时注意,alter database backup control file to trace可以产生一个控制文件的文本备份。

以下是详细重新创建控制文件的步骤:

1、 关闭数据库

SQL>shutdown immediate;

2、 删除所有控制文件,模拟控制文件的丢失

3、 启动数据库,出现错误,并不能启动到mount下

SQL>startup

ORA-00205: error in identifying controlfile, check alert log for more info

查看报警日志文件,有如下信息

alter database mount

Mon May 26 11:53:15 2003

ORA-00202: controlfile: 'D:Oracleoradatachencontrol01.ctl'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

4、 关闭数据库

SQL>shutdown immediate;

5、 在internal或sys下运行如下创建控制文件的脚本,注意完整列出联机日志或数据文件的路径,或修改由alter database backup control file to trace备份控制文件时产生的脚本,去掉多余的注释即可。

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE “TEST” NORESETLOGS NOARCHIVELOG

MAXLOGFILES 32

MAXLOGMEMBERS 2

MAXDATAFILES 254

MAXINSTANCES 1

MAXLOGHISTORY 226

LOGFILE

GROUP 1 'D:OracleORADATATESTREDO01.LOG' SIZE 1M,

GROUP 2 'D:OracleORADATATESTREDO02.LOG' SIZE 1M,

GROUP 3 'D:OracleORADATATESTREDO03.LOG' SIZE 1M

DATAFILE

'D:OracleORADATATEST YSTEM01.DBF',

'D:OracleORADATATESTRBS01.DBF',

'D:OracleORADATATESTUSERS01.DBF',

'D:OracleORADATATESTTEMP01.DBF',

'D:OracleORADATATESTTOOLS01.DBF',

'D:OracleORADATATESTINDX01.DBF'

CHARACTER SET ZHS16GBK;

-- Recovery is required if any of the datafiles are restored backups,

-- or if the last shutdown was not normal or immediate.

RECOVER DATABASE

--if the last shutdown was not normal or immediate

--noarchive

-- RECOVER DATABASE UNTIL CANCELUSING BACKUP CONTROLFILE

--archive

-- RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL

-- Database can now be opened normally.

ALTER DATABASE OPEN;

--if recover database until cancel

--ALTER DATABASE OPEN RESETLOGS;

6、 如果没有错误,数据库将启动到open状态下。

说明:

1、重建控制文件用于恢复全部数据文件的损坏,需要注意其书写的正确性,保证包含了所有的数据文件与联机日志;

2、经常有这样一种情况,因为一个磁盘损坏,我们不能再恢复(store)数据文件到这个磁盘,因此在store到另外一个盘的时候,我们就必须重新创建控制文件,用于识别这个新的数据文件,这里也可以用这种方法用于恢复。

5.3 损坏回滚数据文件的恢复方法

回滚段表空间中的一个数据文件丢失或者损坏导致数据库无法识别它,在启动数据库的时候会出现ORA-1157, ORA-1110的错误,或者操作系统级别的错误,例如ORA-7360。在关闭数据库的时候(normal或者immediate)会出现ORA-1116, ORA-1110的错误,或者操作系统级别的错误,例如ORA-7368。

感谢Coolyl的辛勤工作,关于回滚段的大部分内容都是摘自他在itpub的文章。

5.3.1 损坏数据文件,但数据库处于Open状态

如果你发现有回滚段的数据文件丢失或者损坏了,而此时的数据库是处于打开的状态下并且在运行,就千万不要关闭数据库了,因为在大多数的情况下打开的时候比关闭的时候好解决问题一些。

一般也是存在有两种情况:

A、是offline丢失或损坏的数据文件,然后从一个备份中恢复,执行介质恢复以保持一致性。但是这种情况要求数据库是归档方式下才可以采用的。

B、是offline那个存在丢失或损坏的数据文件所在的整个回滚段表空间,然后删除整个回滚段表空间并重建,但是你必须要杀掉那些在回滚段中已经激活的用户进程才可以offline的。

通常第一种情况就比较简单实现,但是更多的用户事务将会出错并且回滚。

A的具体步骤:

1、 offline丢失或损坏的数据文件

ALTER DATABASE DATAFILE '' OFFLINE;

2、 从一个有效的备份中恢复。

3、 执行以下查询:

SELECT V1.GROUP#, MEMBER, SEQUENCE#

FROM V$LOG V1, V$LOGFILE V2

WHERE V1.GROUP# = V2.GROUP# ;

这个将列出你的所有redolog文件以及它们所代表的sequence numbers。

4、 恢复数据文件。

RECOVER DATAFILE ''

5、 确信你应用了所有的redolog文件,直至出现提示信息“Media recovery complete”。

6、 online那个数据文件。

ALTER DATABASE DATAFILE '' ONLINE;

B的具体步骤:

1、 offline存在丢失或损坏的数据文件的回滚段表空间中的所有回滚段。

ALTER ROLLBACK SEGMENT OFFLINE;

2、 检测当然回滚段的状态。

SELECT SEGMENT_NAME, STATUS FROM DBA_ROLLBACK_SEGS

WHERE TABLESPACE_NAME = '';

3、 删除所有offline的回滚段

DROP ROLLBACK SEGMENT ;

4、 处理那些online状态的回滚段。

重新执行第二步的查询

如果你已经执行过offline操作的回滚段状态仍然是online,则说明这个回滚段内有活动的事务。你要接着查询

SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS

FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS

WHERE TABLESPACE_NAME = '' AND SEGMENT_ID = USN;

如果没有返回结果,则证明存在丢失或损坏的数据文件的回滚段表空间中的所有回滚段都已经被offline了,然后重新执行第二步,第三步。如果查询有结果返回,则状态应该是“PENDING OFFLINE”.接着查看ACTIVE_TX列,如果值为0,则表明此回滚段中已经没有未处理的事务了,很快就会被offline的,然后等它offline后重新执行2,3步后跳至第六步。如果值大于0,则继续到第五步。

5、 强制那些包含活动事务的回滚段offline。

活动的事务应该被提交或者回滚,执行下面的查询看看哪些用户占用了回滚段:

SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME “ROLLBACK”

FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R

WHERE R.NAME IN ('

', ... ,

'

')

AND S.TADDR = T.ADDR AND T.XIDUSN = R.USN;

最好能直接联系到那些user让他们自己去回滚或者提交事务,如果不能做到的话,那就只能强制性的杀掉进程了。

ALTER SYSTEM KILL SESSION ', ';

杀掉进程后再过一段时间后回滚段会自动清除那些事务,然后就可以回到第二步继续查询了。

6、 删除回滚段。

DROP TABLESPACE INCLUDING CONTENTS;

7、 重建回滚段并online它们。

说明:

1、数据库如果是open状态,就可以直接在open状态下解决问题,没有必要停下数据库,增加down机时间;

2、不管上上面那种恢复方法都是正常性的恢复,不会引起数据的不一致或错误。

5.3.2数据库关闭,但是数据文件中没有活动事务

这种情况下最简单的方法就是offline drop掉这个坏了的或者丢失的数据文件,然后以restricted模式打开数据库然后删除并且重建包含损坏文件的回滚段表空间。

具体步骤如下:

1、 确定数据库是正常的关闭的。方法是可以去查看alert文件,到最后看是否有如下信息:

“alter database dismount

Completed: alter database dismount”

如果有的话,就证明数据库是正常关闭的,否则就不能用这个方法去恢复。

2、 修改init参数文件,移去ROLLBACK_SEGMENTS中包含的损坏数据文件的回滚段表空间的回滚段,如果你不能确定哪些回滚段是坏的,简单的方法是你可以注释掉整个ROLLBACK_SEGMENTS。

3、 以restricted模式去mount数据库。

STARTUP RESTRICT MOUNT

4、 offline drop掉那个坏的数据文件

ALTER DATABASE DATAFILE '' OFFLINE DROP;

5、 打开数据库

ALTER DATABASE OPEN

如果你看到如下信息“Statement processed”,则跳到第7步,如果你看到ORA-604, ORA-376, and ORA-1110的错误信息,继续第6步。

6、   正常的关闭数据库,然后在init文件中注释掉ROLLBACK_SEGMENTS,并加入隐含参数

_corrupted_rollback_segments = ( ,...., )

然后以restricted模式打开数据库

STARTUP RESTRICT

7、 删除掉那个包含损坏文件的回滚段表空间。

DROP TABLESPACE INCLUDING CONTENTS;

8、 重建回滚段表空间,记得创建后要把回滚段都online。

9、 重新使数据库对所有用户可用。

ALTER SYSTEM DISABLE RESTRICTED SESSION;

10、然后正常关闭数据库,修改init文件,如果开始只是注释掉了ROLLBACK_SEGMENTS的,就去掉注释即可,如果加了隐含参数的,注释掉它,并在ROLLBACK_SEGMENTS加入所有的回滚段。

11、正常启动数据库:

Startup

说明:

1、这种方法的前提条件是数据库是正常关闭(不是abort)可用;

2、这种方法是正常方法,不会引起数据错误。

5.3.3 数据库关闭,数据文件中有活动事务,没有可用备份。

一般造成这种原因的情况是采用了shutdown abort或其它原因异常关机(如断电)导致的。

1、开启一个事务

SQL> set transaction use rollback segment rbs0;

Transaction set.

SQL> insert into test (a) values (1);

1 row created.

2、异常关闭

SQL> shutdown abort;

Oracle instance shut down.

3、删除rbs的一个数据文件

C:>del D:Oracleoradatachenrbs01.

4、修改INIT.ora :

rollback_segments=(system)

添加_corrupted_rollback_segments=(rbs0,rbs1,rbs2……)

5、SQL>Startup mount

6、SQL>alter database datafile 'd:Oracleoradatat8irbs01.dbf' offline drop;

数据库已更改。

7、SQL>recover database ;

完成介质恢复。

8、SQL>alter database open ;

数据库已更改。

9、SQL>select * from v$rollname;

USN  NAME

----  -------

0     SYSTEM

10、SQL>select segment_name,tablespace_name,status

FROM dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME    STATUS

----------- ------ ------------------------------------

SYSTEM      SYSTEM             ONLINE

RBS0        RBS                NEEDS RECOVERY

RBS1        RBS                NEEDS RECOVERY

RBS2        RBS                NEEDS RECOVERY

11、SQL>drop rollback segment rbs0;

重算段已丢弃。

SQL>drop rollback segment rbs1;

重算段已丢弃。

SQL>drop rollback segment rbs2;

重算段已丢弃。

12、SQL>select segment_name,tablespace_name,status

FROM dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS

-------------------------------------

SYSTEM      SYSTEM          ONLINE

13、SQL>drop tablespace rbs including contents;

表空间已丢弃。

14、重建新的回滚表空间及回滚段,并联机。

15、SQL>shutdown abort

16、再修改INIT.ora :

rollback_segments=(rbs0,rbs1,rbs2)

将_corrupted_rollback_segments=(rbs0,rbs1,rbs2)去掉。

17、SQL>startup

说明:

1、这种办法是万不得以的时候使用的方法,如果有备份,都建议从备份上进行恢复;

2、这种方法恢复的数据库,可能会引起数据库的数据错误;

3、恢复成功以后,建议exp/imp数据,并重新分析检查数据库。

5.3.4 数据库关闭,数据文件中有活动事务,从备份恢复

1、从一个有效的备份中恢复损坏的数据文件。

2、mount数据库。

3、执行以下查询:

SELECT FILE#, NAME, STATUS FROM V$DATAFILE;

如果发现要恢复的文件是offline状态的话,要先online它:

ALTER DATABASE DATAFILE '' ONLINE;

4、执行以下查询

SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#

FROM V$LOG V1, V$LOGFILE V2

WHERE V1.GROUP# = V2.GROUP# ;

这个将列出redlog文件所代表的sequence和first change numbers。

5、如果数据库是非归档情况下,执行以下查询:

SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;

如果CHANGE#大于最小的redolog文件的FIRST_CHANGE#,则数据文件可以被恢复,记得在应用日志的时候要把所有redolog文件全部应用一遍。

如果CHANGE#小于最小的redolog文件的FIRST_CHANGE#,则数据文件就不可以被恢复了,这时候你要从一个有效的全备份中去恢复数据库了,如果没有全备份的话,那你就只能把数据库强制打开到一个不一致的状态去exp出数据,然后重新建库导入数据,因为这种方式的恢复Oracle是不推荐用户自己做的,所以这里我就不详细说明了。

6、恢复数据文件:

RECOVER DATAFILE ''

7、确信你应用了所有的redolog文件,直至出现提示信息“Media recovery complete”。

8、打开数据库。

说明:

1、这种方法要求在归档有备份的方式下进行,而且是建议方式;

2、这种方法不会导致数据库的错误。

5.4 损坏临时数据文件的恢复方法

临时数据文件的恢复是比较简单的,因为临时文件中不涉及到其它的有用的数据,所以可以删除后重建。

1、关闭数据库:

SQL>shutdown immediate

2、删除临时数据文件,模拟媒体失败;

3、启动数据库,检测到文件错误;

4、脱机该数据文件:

SQL>alter database datafile '文件名全名' offline drop;

5、打开数据库

SQL>alter database open

6、删除该临时表空间

SQL>drop tablespace temp(或其它临时表空间名称);

7、重新创建该表空间,并重新分配给用户。

说明:

1、临时数据文件是非重要文件,不保存永久数据,可以随时删除重建,不影响数据库的数据安全;

2、如果重新建立以后,别忘了重新分配给用户。

第六章. 常见恢复误区

1、可以不需要备份,只有归档就能进行数据库的向前的恢复

答:这个在Oracle 9i以前起码是不可能的,在别的数据库我也没有听说过,不完全恢复的主要思路是利用不完全点之前的备份,加上归档日志,恢复到不完全恢复点,9i中出现了一个flashback的特性,这个特性的使用,也是有很多局限的。

2、进行不完全恢复只需要拷贝一个需要恢复的备份数据文件

答:不完全恢复需要拷贝所有的数据文件,最好包括临时数据文件在内,否则需要另外的处理,如果有一个数据文件的SCN大于不完全恢复点,那么这个恢复都将是失败的。

3、使用RMAN目录与目标数据库在同一数据库能很好进行数据库的恢复

答:使用恢复目录与目标数据库在同一个数据库中,将存在很大的恢复局限,如该数据库的系统数据文件的损害,数据库根本不能open,那么RMAN也就无法连接恢复目录,也就不存在恢复了。

第七章. 小结

这里我们反复演示了多种情况下的恢复方案,通过这些演示,我们应该掌握了如下内容:

1、利用OS与RMAN进行各种常规备份与恢复。

2、熟悉没有备份或简单的非常规备份与恢复的方法。

篇10:通过免费数据恢复误删文件网络技巧

数据恢复最好的方法是做好数据备份工作,这些数据恢复软件都无法百分百完全能把你的数据恢复回来,而且一般数据恢复软件对一些文件格式恢复得并不理想,偶使用过的数据恢复软件中就图片格式的文件能恢复得比较理想,所以平时最好养成把重要文件数据备份的习惯。小建以前推荐过几款相当牛B的数据恢复软件:FinalData,O&O FormatRecovery,BadCopy Pro 等等,不过它们大多都不是免费的,今天在akaka中发现了一篇推荐利用免费的数据恢复软件恢复误删数据的文章,当中推荐了不少软件也相当不错。

当我们误删硬盘上文件的时候,第一时间应该怎么做?

当您没有通过回收站不小心删除一个重要文件,其实您的档案仍然存在于硬盘驱动器的某处,只需要使用合适的工具,很简单的点击您的鼠标,就可以寻找和恢复已删除的档案。

首先:停止电脑上的一切操作

因为当你删除了一个文件,系统只是在这个文件上做上一个记号,表示存储这个文件的空间可以从新写入别的文件,您的计算机现在会随时写入新的资料,如果继续操作电脑,很可能会在这个文件的空间写入其他文件,这样恢复起来就很困难了。

接着:使用适当数据恢复软件

Windows:在windows系统下,有着很多免费的文件修复软件,包括Undelete Plus、PC Inspector FileRecovery、Restoration、Recuva等。Undelete Plus 是最方便普通用户的一种,它有着先进的过滤选项,这样更容易在很多文件里找到您需要恢复的文件。但在我的测试中我发现 PC Inspector File Recovery 和Restoration 能够更有效地找回文件,

(当然,你可能有自己所喜欢的软件)

Mac:如果您使用的是 Mac ,那Data Rescue II可能是比较好的选择,不过它需要 $99。

跨平台恢复软件:免费、跨平台的命令行工具PhotoRec是一个开发用来找回不小心删除的照片的工具,但它几乎可以从您的可移动媒体或硬盘驱动器找回任何其他格式的文件。

再次:开始恢复误删文件

当你选择了恢复工具后,首先要做的是使用恢复工具扫描您的硬盘驱动器,当扫描完成后,一般您将会看到一个混乱的档案大名单,您所要做的只是寻找文件类型和名称和你删除的文件相匹配的,并选择恢复后的存储位置。

如果通过以上的步骤,你还没有能找到你删除的文件,你可能需要尝试使用不同的恢复软件来试试有没有效果,因为不同的软件有着不同的运算规则。

如何恢复其他存储介质上的数据?

1、恢复闪存卡上数据:如果您需要从您数码相机损坏的闪存卡里恢复的照片,你可以将闪存卡通过读卡器连接到电脑上,再使用恢复工具,这里建议你使用Zero Assumption Digital Image Recovery,它着重于图像文件复原。

2、恢复损伤的CD或DVD恢复数据:这种的恢复文件过程可能略有不同。使用免费的CD Recovery Toolbox,它可以从损坏的光盘中恢复尽可能多的数据,如果它没有效果,你还能使用有30天试用期的CDCheck。当然小建早几天推荐的BadCopy Pro也相当不错。

网盘也好,U盘也罢,反正现在许多网盘都是免费的,例如微软老大的:SkyDrive 就相当不错,而购买一个移动硬盘也并不贵!

对硬盘重要数据进行备份和恢复

硬盘坏道修复全攻略数据恢复

Linux下备份恢复技术的应用

微信windows版聊天记录备份恢复教程

恢复执行申请书

恢复强制执行申请书

恢复审理决定书

恢复执行申请书

恢复用电申请书

几种简单的损坏控制文件的恢复方法备份恢复

《通过日志恢复MS SQL数据案例备份恢复(推荐10篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档