当前位置:文档之家› 数据库恢复

数据库恢复

Oracle数据库恢复文档:

毕照杰(广州)

2003-12-25日,客户数据库因为掉电,数据库不能正常启动。

故障现象:
进入应用程序的时候,提示:Oracle startup or shutdown in progress.....


诊断及解决过程:
1、SVRMGR> startup nomount;
没有问题

2、SVRMGR> alter database mount;
出现在以下内容,乱码:
alter database mount
*
ORA-00214: ???? 'D:\ORACLE\ORADATA\ORACLE\CONTROL02.CTL' ?? 16788 ??? 'D:\ORACLE
\ORADATA\ORACLE\CONTROL01.CTL' ?? 16780 ???

3、为了解决这个乱码,先设置字符集,然后再重新来过一次:
SVRMGR> shutdown abort;
SVRMGR> exit;
c:\set nls_lang=american_america.zhs16gbk
SVRMGR> startup nomount;

4、SVRMGR> alter database mount;
出现以下内容,诊断是几个控制文件版本不一致:
alter database mount
*
ORA-00214: controlfile 'D:\ORACLE\ORADATA\ORACLE\CONTROL02.CTL' version 16788 in
consistent with file 'D:\ORACLE\ORADATA\ORACLE\CONTROL01.CTL' version 16780

解决方法:
打开init.ora,找到
control_files = ("d:\oracle\oradata\oracle\control01.ctl", "d:\oracle\oradata\oracle\control02.ctl", "d:\oracle\oradata\oracle\control03.ctl")
把它修改为:
control_files = ("d:\oracle\oradata\oracle\control02.ctl", "d:\oracle\oradata\oracle\control03.ctl")
去掉其中的第一个控制文件。

5、
SVRMGR>shutdown abort;
SVRMGR>startup nomount;
SVRMGR>alter databse mount;
SVRMGR>alter databse open;

这时出现这样的内容:
alter database open
*
ORA-00314: log 3 of thread 1, expected sequence# 3990 doesn't match 3987
ORA-00312: online log 3 thread 1: 'D:\ORACLE\ORADATA\ORACLE\REDO01.LOG'

诊断,log日志版本不对。

尝试以下操作,均告失败:
SVRMGR> alter database open resetlogs;
出现以下错误:
alter database open resetlogs
*
ORA-01139: RESETLOGS option only valid after an incomplete database recovery

SVRMGR> alter database open noresetlogs;
出现以下错误:
alter database open noresetlogs
*
ORA-01139: RESETLOGS option only valid after an incomplete database recovery

SVRMGR> recover database until time '2003-12-24:19:19:19';
出现以下错误:
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF'

SVRMGR> alter database open resetlogs;
出现以下错误:
alter database open resetlogs
*
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF'

6、
使用ORACLE数据库的部分数据恢复方式。
它的主要做法就是不检查数据库的一致性,来打开数据库,虽然会造成数据的不准确和丢失,
但是还是可以保存在大部分数据的。

做法:

打开init.ora,添加一行文字:
_allow_resetlogs_corruption=true

然后再进行以下操作:
SVRMGR>shutdown ab

ort;
SVRMGR>startup mount;
SVRMGR>recover database until cancel
此时数据库提示
SVRMGR> recover database until cancel;
ORA-00279: change 3684318 generated at 12/30/2003 10:55:34 needed for thread 1
ORA-00289: suggestion : D:\ORACLE\ORA81\RDBMS\ARC00001.001
ORA-00280: change 3684318 for thread 1 is in sequence #1
Specify log: {=suggested | filename | AUTO | CANCEL}

输入 cancel,这时出现这样的信息:
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF'

SVRMGR>alter database open noresetlogs;

提示:
Statement processed.

这时,数据库已经起来了。
此时,要尽快把数据库导出来。

exp system/manager file=c:\oracle.dmp full=y ...


ORACLE表空间恢复方案

作者:double鱼

一)用户表空间
错误:
在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,
在关闭数据库(使用shutdown normal或shutdown immediate) 时将导致错误ORA
-01116,ORA-01110以及操作系统级错误ORA-07368
解决:
以下有两种解决方案:
1.用户的表空间可以被轻易地重建
即最近导出的对象是可用的或表空间中的对象可以被轻易地重建等.在
这种情况下,最简单的方法是offline并删除该数据文件,删除表空间并
重建表空间以及所有的对象.
svrmgrl> startup mount
svrmgrl> alter database datafile filename offline drop;
svrmgrl> alter database open;
svrmgrl> drop tablespace tablespace_name including contents;
重建表空间及所有对象.
2.用户的表空间不能够被轻易地重建
在大多数情况下,重建表空间是不可能及太辛苦的工作.方法是倒备份及做介
质恢复.如果您的系统运行在NOARCHIVELOG模式下,则只有丢失的数据
在online redo log中方可被恢复。
步骤如下:
1)Restore the lost datafile from a backup
2)svrmgrl> startup mount
3)svrmgrl> select v1.group#,member,sequence#,first_change#
> from v$log v1,v$logfile v2
> where v1.group#=v2.group#;
4)如果数据库运行在NOARCHIVELOG模式下则:
svrmgrl> select file#,change# from v$recover_file;
如果 CHANGE# 大于最小的FIRST_CHANGE#则数据文件可以被恢复。
如果 CHANGE# 小于最小的FIRST_CHANGE#则数据文件不可恢复。 恢复最近一
次的全备份或采用方案一.
5)svrmgrl> recover datafile filename;
6)确认恢复成功
7)svrmgrl> alter database open resetlogs;
3.只读表空间无需做介质恢复,只要将备份恢复即可.唯一的例外是:
表空间在最后一次备份后被改为read-write 模式
表空间在最后一次备份后被改为read-only 模式
在这种情况下,均需进行介质恢复

二)临时表空间
临时表空间并不包含真正的数据,恢复的方法是删除临时表空间并重建即可.


)系统表空间
如果备份不可用,则只能采用重建数据库的方法

四)回滚表空间
有两种情况:
1、数据库已经完全关闭(使用shutdown immediate或shutdown命令)
1) 确认数据库完全关闭
2) 修改init.ora文件,注释"rollback-segment"
3) svrmgrl> startup restrict mount
4) svrmgrl> alter database datafile filename offline drop;
5) svrmgrl> alter database open;
基于出现的结果:
"statement processed" 转(7)
"ORA-00604,ORA-00376,ORA-01110"转(6)
6) svrmgrl> shutdown immediate
修改init.ora文件,增加如下一行:
_corrupted_rollback_segments = (,...)
svrmgrl> startup restrict
7) svrmgrl> drop tablespace tablespace_name including contents;
重建表空间及回滚段
9) svrmgrl> alter system disable restricted session;
10) 修改init.ora文件
2、数据库未完全关闭(数据库崩溃或使用shutdown abort命令关闭数据库)
1) 恢复备份
2) svrmgrl> startup mount
3) svrmgrl> select file#,name,status from v$datafile;
svrmgrl> alter database datafile filename online;
4) svrmgrl> select v1.group#,member,sequence#,first_change#
> from v$log v1,v$logfile v2
> where v1.group#=v2.group#;
5) svrmgrl> select file#,change# from v$recover_file;
见一方案2-4
6) svrmgrl> recover datafile filename;
7) svrmgrl> alter database open;
3、数据库处于打开状态
1) 删除回滚段和表空间
2) 重建表空间和回滚段

五)控制文件恢复
1.所有的控制文件均被破坏
将备份的控制文件拷贝至原目录下
对于RAW DEVICE,则:
dd if='con.bak' of='/dev/rdrd/drd1' seek=128
2.并非所有的控制文件均被破坏
用其他的控制文件启动数据库



[实验-1.1] 有老的备份数据备份和控制文件trace


准备工作:模拟环境
~~~~~~~~
备份
~~~~
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 (DBID=3171861129) --新的ID2334768642
正在使用目标数据库控制文件替代恢复目录

RMAN> configure controlfile autobackup on;

新的 RMAN 配置参数:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
已成功存储新的 RMAN 配置参数
RMAN> configure controlfile autobackup format for device type disk to 'c:\temp\%
F';

新的 RMAN 配置参数:
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'c:\temp\%F';
已成功存储新的 RMAN 配置参数

RMAN>

RMAN> backup database;

启动 backup 于 25-2月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=12 devtype=DISK
分配的通道: ORA_DISK_2
通道 ORA_DISK_2: sid=13 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF
输入数据文件 fno=000

03 name=C:\ORACLE\ORADATA\PDF\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\PDF\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 25-2月 -05
通道 ORA_DISK_2: 正在启动 full 数据文件备份集
通道 ORA_DISK_2: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\PDF\TOOLS01.DBF
通道 ORA_DISK_2: 正在启动段 1 于 25-2月 -05
通道 ORA_DISK_1: 已完成段 1 于 25-2月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\07GDKT8C_1_1 comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:56
通道 ORA_DISK_2: 已完成段 1 于 25-2月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\08GDKT8C_1_1 comment=NONE
通道 ORA_DISK_2: 备份集已完成, 经过时间:00:00:57
完成 backup 于 25-2月 -05

启动 Control File and SPFILE Autobackup 于 25-2月 -05
段 handle=C:\TEMP\C-3171861129-20050225-00 comment=NONE
完成 Control File and SPFILE Autobackup 于 25-2月 -05

RMAN>

~~~~~~~~~~~
常规备份
~~~~~~~~~~~
备份数据文件cp C:\ORACLE\ORADATA\PDF\* C:\ORACLE\ORADATA\bak
备份控制文件
###################################################
# [1.1] 有老的备份数据备份和控制文件trace
###################################################
SQL> alter session set tracefile_identifier=fanglf
2 ;

会话已更改。

SQL> alter database backup controlfile to trace;

数据库已更改。

SQL> alter database backup controlfile to 'c:\temp\controlfile.bak';

数据库已更改。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们也可以使用RMAN来拷贝备份控制文件
RMAN> copy CURRENT CONTROLFILE TO 'c:\cf.cpy';

启动 copy 于 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 已复制当前的控制文件
输出文件名=C:\CF.CPY
完成 copy 于 03-3月 -05
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


SQL> col name format a50
SQL> select * from v$controlfile;

STATUS NAME
------- --------------------------------------------------
C:\ORACLE\ORADATA\PDF\CONTROL01.CTL
C:\ORACLE\ORADATA\PDF\CONTROL02.CTL
C:\ORACLE\ORADATA\PDF\CONTROL03.CTL <<-此时仍然可以使用
~~~~~~~~~~~~~~~~
模拟控制文件损坏
~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用ULTRAEDIT编辑CONTROL01.CTL部分数据
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select * from v$controlfile;

STATUS NAME
------- ------------------------------------------------
C:\ORACLE\ORADATA\PDF\CONTROL01.CTL
C:\ORACLE\ORADATA\PDF\CONTROL02.CTL
C:\ORACLE\ORADATA\PDF\CONTROL03.CTL

SQL>
SQL> create table test (a int,v varchar(200));

使用ULTRAEDIT编辑清空CONTROL01.CTL大部分数据
SQL> se

lect * from v$controlfile; <<-出现异常
select * from v$controlfile
*
ERROR 位于第 1 行:
ORA-12571: TNS: 包写入程序失败

~~~~~~~~~~~~~~~~
在alert中显示
~~~~~~~~~~~~~~~~
Fri Feb 25 11:51:56 2005
Errors in file c:\oracle\admin\pdf\bdump\pdf_ckpt_2556.trc:
ORA-00227: corrupt block detected in controlfile: (block 1, # blocks 1)
ORA-00202: controlfile: 'C:\ORACLE\ORADATA\PDF\CONTROL01.CTL'

CKPT: terminating instance due to error 227
Fri Feb 25 11:51:58 2005
Errors in file c:\oracle\admin\pdf\bdump\pdf_pmon_3084.trc:
ORA-00227: corrupt block detected in controlfile: (block , # blocks )

Instance terminated by CKPT, pid = 2556
~~~~~~~~~~~~~~~~
在trace文件中显示
~~~~~~~~~~~~~~~~

Corrupt block relative dba: 0x00000001 (file 0, block 1)
Completely zero block found during control file header read
*** 2005-02-25 11:51:55.000
ksedmp: internal or fatal error
ORA-00202: controlfile: 'C:\ORACLE\ORADATA\PDF\CONTROL01.CTL'

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这里我模拟把3个控制文件都破坏
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

启动数据库时提示
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-00205: ?????????????????????

恢复实例
###################################################
# [测试1] --使用trace恢复 shutdown abort
###################################################
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;

数据库已更改。




首先用客户端连接,用户无法登陆:
Error:ORA-01033:ORACLE initialization or shutdown in progress
查阅大量文章,说由于突然断电或者是删除表空间引起的,我隐约记起前几天的断电关机.....
重新启动服务,发现启动报错:
$lsnrctl
lsnrctl>status
lsnrctl>start
$sqlplus /nolog
SQL>connect sys/sys as sysdba
SQL>startup

ORACLE 例程成功启动


Total System Global Area 236000356 bytes
Fixed Size 451684 bytes
Variable Size 201326592 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
ORA-00214: ???? '/home/oracle/oradata/DHDB/control02.ctl' ?? 945 ???
'/home/oracle/oradata/DHDB/control01.ctl' ?? 943 ???

报错部分为红色,错误号:ORA-00214

SQL> shutdown immediate;
ORA-01507: database not mounted

ORACLE instance shut down.

SQL> host cp /home/oracle/oradata/DHDB/control03.ctl /home/oracle/oradata/DHDB/control01.ctl

SQL> host cp /home/oracle/oradata/DHDB/control03.ctl /home/oracle/oradata/DHDB/control02.ctl

SQL> startup
ORACLE 例程成功启动

Total System Global Area 236000356 bytes
Fixed Size 451684 bytes
Variable Size 201326592 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕
ORA-01113:文件1需要介质恢复
ORA-01110:数据文件 1: '/home/oracle/oradata/DHDB/system01.dbf'

错误为红色,错误号:ORA-01113;ORA-01110

SQL> archive log list;
数据库中的日志模式 非存档模式
自动存档 禁用
存档终点 /home/oracle/product/9i/dbs/arch
最早的概要日志序列 140
当前的日志序列 142

SQL>alter database backup controlfile to trace;

数据库已更改。

SQL> alter database clear unarchived logfile group 1;

数据库已更改。

SQL> recover database;
完成介质恢复

SQL> alter database open
2 ;

数据库已更改。

查阅海量资料,我容易嘛我!以后再也不断电关机了!


仅仅丢失一个普通用户数据文件的恢复A(联机恢复)

(例如,丢失D:\BACKUPDB\USERS01.DBF)
准备工作, 通过下面的工作,如果完全恢复,应该可以看到;insert into test1 values(2);

SQL> conn lunar/lunar
SQL> select * from tab;
TESTBACKUP3 TABLE
SQL> create table test1 (a number);
SQL> insert into test1 values(1);
SQL> alter system switch logfile;
SQL> commit;
SQL> alter system switch logfile;
SQL> insert into test1 values(2);
SQL> commit;
SQL> alter system switch logfile;
SQL> conn internal
SQL> archive log list
数据库日志模式 存档模


自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 3
下一个存档日志序列 5
当前日志序列 5
shutdown abort关闭例程,模拟数据文件丢失
SQL> shutdown abort
ORACLE 例程已经关闭。
Mount数据库
SQL> startup mount
数据库装载完毕。

使损坏的数据文件脱机
SQL> alter database datafile 'D:\BACKUPDB\USERS01.DBF' offline;
打开数据库
SQL> alter database open;
拷贝刚才热备的数据文件(USERS01.DBF)
恢复损坏的数据文件
SQL> recover datafile 'D:\BACKUPDB\USERS01.DBF';
ORA-00279: ?? 424116 (? 10/20/2002 20:42:04 ??) ???? 1 ????
ORA-00289: ??: D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: ?? 424116 ???? 1 ???? # 1 ???

指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 424125 (? 10/20/2002 20:44:14 ??) ???? 1 ????
ORA-00289: ??: D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: ?? 424125 ???? 1 ???? # 2 ???
ORA-00278: ??????????? 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC'
……………………..
已应用的日志。
完成介质恢复。

使恢复完成的数据文件联机
SQL> alter database datafile 'D:\BACKUPDB\USERS01.DBF' online;
验证恢复的结果:完全恢复
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
SQL> select * from test1;

说明:
1. shutdown abort关闭例程,模拟数据文件丢失
2. Mount数据库
3. 使损坏的数据文件脱机
4. 打开数据库
5. 拷贝刚才热备的数据文件(USERS01.DBF)
6. 恢复损坏的数据文件
7. 使恢复完成的数据文件联机


shutdown immedate,恢复全部数据文件(不包括control和redo)

(把热备的数据文件拷贝回来,不包括control和redo)
SQL> conn internal
SQL> shutdown immediate;

复制全部热备的数据文件过来(完全恢复成功!)
mount数据库
SQL> startup mount

完全恢复数据库
SQL> recover database;
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
……………………………………………..
Log applied.
Media recovery complete.
打开数据库
SQL> alter database open;

验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1;

完全恢复成功!
说明:
1. 复制全部热备的数据文件过来
2. mount数据库
3. 完全恢复数据库
4. 打开数据库


shutdown abort的情况

,恢复全部控制文件和数据文件(不包括redo)

准备工作 (这样,insert into test1 values(13);就是没有提交的数据了,如果完全恢复,应该一直可以看到insert into test1 values(12);)
SQL> conn lunar/lunar
SQL> select * from test1;
SQL> insert into test1 values(12);
commit;
SQL> insert into test1 values(13);

单开一个session,用来shutdow abort
E:\>sqlplus internal
SQL> shutdown abort
ORACLE 例程已经关闭。

拷贝所有的控制文件和数据文件(不包括redo)
mount数据库,按照提示重建口令文件
SQL> startup mount
ORACLE instance started.
ORA-01991: invalid password file 'd:\oracle1\ora81\DATABASE\PWDbackup.ORA'

SQL> host
E:\>cd d:\oracle1\ora81\DATABASE
D:\oracle1\ora81\database>del PWDbackup.ORA
D:\oracle1\ora81\database>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA pa
ssword=oracle entries=10
/* orapwd Usage: orapwd file= password= entries=
where
file - name of password file (mand),
password - password for SYS and INTERNAL (mand),
entries - maximum number of distinct DBAs and OPERs (opt),
There are no spaces around the equal-to (=) character. */
D:\oracle1\ora81\database>exit
这时,试图完全恢复数据库是不成功的
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
用to trace备份控制文件
SQL>alter database backup controlfile to trace;
SQL>shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
找到并且编辑控制文件
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
重建控制文件
SQL> startup nomount
SQL> @D:\BACKUPDB\udump\ORA01532.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Control file created.
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1
ORA-00308: cannot open archived log 'ALTER'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'

shutdown immediate,然后重新恢复数

据库
SQL> shutdown immediate;
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

完全恢复数据库
SQL> recover database;
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
………………………………………..
Log applied.
Media recovery complete.
打开数据库
SQL> alter database open;
SQL> conn lunar/lunar
SQL> select * from test1;

说明:
1. 拷贝所有的控制文件和数据文件(不包括redo)
2. mount数据库,按照提示重建口令文件
3. 这时,试图完全恢复数据库是不成功的
4. 用to trace备份控制文件
5. 找到并且编辑控制文件
6. 重建控制文件
7. shutdown immediate,然后重新恢复数据库
8. 完全恢复数据库
9. 打开数据库


仅仅丢失一个普通用户数据文件的恢复B(脱机恢复)

准备工作 按照下面的输入,如果全部恢复,应该可以看到insert into test1 values(13),因为insert into test1 values(14)没提交。
SQL> conn lunar/lunar
SQL> insert into test1 values(13);
SQL> insert into test1 values(14);

Shutdown immediate,然后模拟数据文件丢失
单开一个session,执行shutdown immediate(保证insert into test1 values(14);没有被隐式提交)
E:\>sqlplus internal
SQL>shutdown immediate
ORACLE 例程已经关闭。
模拟数据文件丢失,然后用热备覆盖这个文件
mount数据库
E:\>sqlplus internal
SQL>shutdown immediate
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist

SQL> startup mount
使损坏的数据文件脱机
SQL>alter database datafile 'D:\BACKUPDB\USERS01.DBF' offline;
Database altered.
恢复数据文件
SQL> recover datafile 'D:\BACKUPDB\USERS01.DBF';
ORA-00279: change 424116 generated at 10/20/2002 20:42:04 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424116 for thread 1 is in sequence #1

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
………………………………………

…………………
Log applied.
Media recovery complete.
使恢复的数据文件联机
SQL>alter database datafile 'D:\BACKUPDB\USERS01.DBF' online;
打开数据库
SQL>alter database open;
Database altered.

这时需要重新启动数据库,并完全恢复数据库
SQL> conn lunar/lunar
SQL> select count(*) from test;
select count(*) from test
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> conn internal
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
重新启动数据库,
SQL> startup
ORACLE instance started.

用recover database再次恢复数据库
SQL> conn internal
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01124: cannot recover data file 1 - file is in use or recovery
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'

重新使恢复的表空间联机
SQL> alter database datafile 'D:\BACKUPDB\USERS01.DBF' online;
SQL> conn lunar/lunar
SQL> select * from test1; ok.

验证恢复结果:完全恢复
说明:
1. 用热备覆盖这个文件
2. mount数据库
3. 使损坏的数据文件脱机
4. 恢复数据文件
5. 使恢复的数据文件联机
6. 打开数据库
7. 这时需要重新启动数据库,并完全恢复数据库
8. 重新启动数据库,
9. 用recover database再次恢复数据库
10. 重新使恢复的表空间联机


shutdown abort后,丢失全部文件(除了archive log和init.ora)

即,丢失了全部:数据文件、控制文件和redo log file
准备工作 下面的信息说明了如果是完全恢复,可以看到insert into test1 values(16);,否则可以看到15,就是被归档的那个。17因为没有提交,是不会被恢复的。

SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 14
Next log sequence to archive 16
Current log sequence 16
SQL> conn lunar/lunar
SQL> select * from test1 where a>10;
SQL> insert into test1 values(15);
SQL> alter system switch logfile;
System altered.
SQL> insert into test1 values(16);
SQL> insert into test1 values(17);
新开一个session,进行shutdown abort

E:\>sqlplus internal
SQL> shutdown abort
ORACLE 例程已经关闭。

把热备的数据文件和控制文件拷贝过来
mount数据库
E:\>sqlplus internal
SQL> startup mount
ORACLE instance started.

ORA-01991: invalid password file 'd:\oracle1\ora81\DATABASE\PWDbackup.ORA'

根据提示重建口令文件
SQL> host
E:\>del d:\oracle1\ora81\DATABASE\PWDbackup.ORA
E:\>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA password=oracle entries=
10

用to trace备份控制文件
SQL> alter database backup controlfile to trace;
Database altered.
找到这个跟踪文件并编辑它
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATA

BASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;

重建控制文件(这种丢失的状态重建控制文件是错误的)
SQL> shutdown immediate
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.

Total System Global Area 25856028 bytes
Fixed Size 75804 bytes
Variable Size 8925184 bytes
Database Buffers 16777216 bytes
Redo Buffers 77824 bytes

SQL> @D:\BACKUPDB\udump\ORA02176.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file 'D:\BACKUPDB\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-01507: database not mounted
ALTER SYSTEM ARCHIVE LOG ALL
*
ERROR at line 1:
ORA-01507: database not mounted
ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-01507: database not mounted

可见,因为缺少所有的redo,重建控制文件是行不通的。
Mount数据库
SQL> alter database mount;
Database altered.
用using backup controlfile进行恢复
SQL> alter database mount;
Database altered.
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
……………………………………………………

ORA-00308: cannot open archived log 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00017.ARC'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

用Open Resetlog 打开数据库
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open RESETLOGS;
Database altered.

验证恢复结果:不完全恢

复,redo里面的数据丢失了
SQL> conn lunar/lunar
SQL> select * from test1 where a>10;
SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 0
Next log sequence to archive 1
Current log sequence 1
说明:
1. 把热备的数据文件和控制文件拷贝过来
2. mount数据库
3. 根据提示重建口令文件
4. 用using backup controlfile进行恢复
5. 用Open Resetlog 打开数据库



丢失非系统非当前活动回滚段表空间中的一个数据文件

首先是做一次热备份(因为上次已经做了不完全恢复resetlogs)
Microsoft Windows 2000 [Version 5.00.2195]

E:\>sqlplus internal
SQL>archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 0
下一个存档日志序列 1
当前日志序列 1
SQL> @e:\backupdb\other\aa
TO_CHAR(SYSDATE,'' ………………..YY'2002-10-21 08:10:22'
SQL> @e:\backupdb\other\backup_ts.sql
SQL> set echo off head off feedback off pagesize 0;
21-10月-02

BEGINING ARCHIVE LOG NUMBER IS :
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 0
下一个存档日志序列 1
当前日志序列 1

Begin Backup Tablespace SYSTEM.'D:\BACKUPDB\SYSTEM01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace RBS.'D:\BACKUPDB\RBS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace USERS.'D:\BACKUPDB\USERS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TEMP.'D:\BACKUPDB\TEMP01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TOOLS.'D:\BACKUPDB\TOOLS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .

Begin Backup Tablespace INDX.'D:\BACKUPDB\INDX01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .

Begin Backup CONTROLFILE 'D:\BACKUPDB\CONTROL01.CTL' ...
Successed End Backup The CONTROLFILE .

Begin Backup CONTROLFILE To Trace ...
Successed End Backup The CONTROLFILE .

Before Switch Log, The Current Log is:
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 0
下一个存档日志序列 1
当前日志序列 1

Begin Backup Switch Current Log ...
Successed End Switch Log .

After Switch Log, The Ending Archive Log Number Is :
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 1
下一个存档日志序列 2
当前日志序列 2
21-10月-02
SQL> --set termout on;
SQL> select to_char(sysdate,'''yyyy-mm-dd hh:mm:ss''') from dual;
'20

02-10-21 08:10:54'

数据准备工作1
从下面的情况看,因为改变了数据库的结构,所以,首先需要一个热备或者冷备才能进行恢复。如果已经备份,可以找回数据insert into test2 values(2);,因为2是几经commit;的,3是没有commit的,所以能找会到2。3则会丢失。

SQL> alter tablespace system add datafile 'D:\BACKUPDB\SYSTEM02.DBF' size 10M;
表空间已更改。
SQL> alter tablespace users add datafile 'D:\BACKUPDB\USERS02.DBF' size 10M;
表空间已更改。
SQL> create tablespace test datafile 'D:\BACKUPDB\test01.dbf' size 10M;
表空间已创建。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 1
下一个存档日志序列 2
当前日志序列 2
SQL> alter user lunar quota 10m on test;
SQL> create table test2(a number) tablespace test;
SQL> insert into test2 values(1);
SQL> alter system switch logfile;
系统已更改。
SQL> conn lunar/lunar
SQL> select * from tab;
TESTBACKUP3 TABLE

SQL> insert into test2 values(2);
SQL> insert into test2 values(3);
以上改动后需要作一次热备或者冷备,否则数据文件丢失后不能恢复(增加表空间,数据文件都要备份数据库)
SQL> conn internal
SQL> @e:\backupdb\other\aa
SQL> select to_char(sysdate,'''yyyy-mm-dd hh:mm:ss''') from dual;
'2002-10-21 08:10:05'
SQL> set termout off
SQL> @e:\backupdb\other\backup_ts.sql
SQL> --set termout off;
SQL> set echo off head off feedback off pagesize 0;
21-OCT-02
BEGINING ARCHIVE LOG NUMBER IS :
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5

Begin Backup Tablespace SYSTEM.'D:\BACKUPDB\SYSTEM01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace RBS.'D:\BACKUPDB\RBS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace USERS.'D:\BACKUPDB\USERS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TEMP.'D:\BACKUPDB\TEMP01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TOOLS.'D:\BACKUPDB\TOOLS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace INDX.'D:\BACKUPDB\INDX01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace SYSTEM.'D:\BACKUPDB\SYSTEM02.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace USERS.'D:\BACKUPDB\USERS02.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TEST.'D:\BACKUPDB\TEST01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup CONTROLFILE 'D

:\BACKUPDB\CONTROL01.CTL' ...
Successed End Backup The CONTROLFILE .
Begin Backup CONTROLFILE To Trace ...
Successed End Backup The CONTROLFILE .
Before Switch Log, The Current Log is:
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5

Begin Backup Switch Current Log ...
Successed End Switch Log .

After Switch Log, The Ending Archive Log Number Is :
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 4
Next log sequence to archive 6
Current log sequence 6
21-OCT-02

SQL> --set termout on;
SQL> select to_char(sysdate,'''yyyy-mm-dd hh:mm:ss''') from dual;
'2002-10-21 08:10:31'
1 row selected.

数据准备工作2
可以找回数据insert into test2 values(4);,因为4是几经commit;的,5是没有commit的,所以能找会到2。3则会丢失。
SQL> conn lunar/lunar
SQL> insert into test2 values(4);
SQL> commit;
SQL> insert into test2 values(5);
1 row created.

Shutdow abort,然后删除test01.dbf,模拟数据文件丢失
SQL> conn internal
SQL> shutdown abort
ORACLE instance shut down.

删除test01.dbf,把备份的数据文件test01.dbf拷贝过来
Mount数据库
SQL> startup mount;
………………

Database mounted.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 9 needs media recovery
ORA-01110: data file 9: 'D:\BACKUPDB\TEST01.DBF'

在打开数据库的时候,提示'D:\BACKUPDB\TEST01.DBF'需要介质恢复,因为他和其他的文件时间点不一致。

恢复数据文件(把最近的热备的文件拷贝过来)
SQL> recover datafile 'D:\BACKUPDB\TEST01.DBF';
Media recovery complete.
打开数据库
SQL> alter database open;
验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test2;
说明:
? 首先是做一次热备(因为上次已经做了不完全恢复resetlogs)
? 以上改动后需要作一次热备或者冷备,否则数据文件丢失后不能恢复(增加表空间,数据文件都要备份数据库)

1. Shutdow abort,然后删除test01.dbf,模拟数据文件丢失
2. 删除test01.dbf,把备份的数据文件test01.dbf拷贝过来
3. Mount数据库
4. 恢复数据文件(把最近的热备的文件拷贝过来)
5. 打开数据库


shutdown abort的情况,恢复全部数据文件(不包括control和redo)

用热备的数据文件恢复(把热备的数据文件拷贝回来,不包括control和redo)
SQL> conn internal
SQL> shutdown abort
ORACLE instance shut down.

复制全部热备的数据文件过来(完全恢复成功!)
mount数据库
SQL> startup mount
ORACLE instance started.

完全恢复数据库
SQL> recover database;
ORA-00279: change 424112 generated a

t 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
…………………………………………………
Log applied.
Media recovery complete.

打开数据库
SQL> alter database open;
Database altered.
验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1;
完全恢复成功!

说明:
1. 复制全部热备的数据文件过来
2. mount数据库
3. 完全恢复数据库
4. 打开数据库



shutdown immediate的情况,丢失全部控制文件和数据文件(不包括redo),方法1

准备工作
下面的操作,说明如果完全恢复,可以看到insert into test1 values(11);,因为11是redo中已经commit的,12是redo中没有commit的
SQL> insert into test1 values(8);
SQL> commit;
SQL> insert into test1 values(9);
SQL> alter system switch logfile;
System altered.
SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 11
Next log sequence to archive 13
Current log sequence 13
SQL> conn lunar/lunar
SQL> insert into test1 values(10);
SQL> commit;
SQL> insert into test1 values(11);
SQL> conn internal
SQL> conn lunar/lunar
SQL> insert into test1 values(12);
1 row created.
然后单独开启一个实例,再shutdown immediate
(这样,insert into test1 values(12);就是没有提交的数据了,如果完全恢复应该一直可以看到insert into test1 values(11);)
E:\>sqlplus internal
SQL>shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
拷贝热备的所有控制文件和数据文件
mount数据库
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 25856028 bytes
Fixed Size 75804 bytes
Variable Size 8925184 bytes
Database Buffers 16777216 bytes
Redo Buffers 77824 bytes
ORA-01991: ???????'d:\oracle1\ora81\DATABASE\PWDbackup.ORA'

根据提示,重建口令文件
SQL> host
E:\>cd d:\oracle1\ora81\DATABASE\PWDbackup
系统找不到指定的路径。
E:\>cd d:\oracle1\ora81\DATABASE
E:\>d:
D:\oracle1\ora81\database>del PWDbackup.ORA
D:\oracle1\ora81\database>dir PWDbackup.ORA
驱动器 D 中的卷是 Program
卷的序列号是 D0E6-FA1C
D:\oracle1\ora81\database 的目录
找不到文件
D:\oracle1\ora81\database>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA pa
ssword=oracle entries=10;


D:\oracle1\ora81\database>exit
用to trace备份控制文件
SQL> alter database backup controlfile to trace;
数据库已更改。
shutdown immediate关闭数据库
SQL> shutdown immediate;
ORA-01109: ??????

已经卸载数据库。
ORACLE 例程已经关闭。
找到那个控制文件,然后编辑:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;

重建控制文件,并且恢复数据库
SQL> startup nomount
ORACLE 例程已经启动。

SQL> @D:\BACKUPDB\udump\ORA01904.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Cluster altered.

ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1

ORA-00308: cannot open archived log 'ALTER'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'

关闭数据库
除了redo log file中没有提交的数据,其他都可以找回来
SQL> shutdown immediate;
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.

重新mount,作完全恢复(recover database;)
SQL> startup mount
ORACLE instance started.


SQL> recover database;
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
…………………………………………..
Log applied.
Media recovery complete.

打开数据库
SQL> alter database open;
Database altered.

验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1;
SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive

Oldest online log sequence 12
Next log sequence to archive 14
Current log sequence 14
说明:
1. 把热备的控制文件和数据文件拷贝过来
2. mount数据库
3. 根据提示,重建口令文件
4. 用to trace备份控制文件
5. shutdown immediate关闭数据库
6. 找到那个控制文件,然后编辑
7. 重建控制文件,并且恢复数据库
8. 关闭数据库
9. 重新mount,作完全恢复(recover database;)
10. 打开数据库



shutdown immediate的情况,丢失全部控制文件和数据文件(不包括redo),方法2

准备工作
如果数据不丢失,应该可以恢复到insert into test1 values(14);,因为14是redo中commit的,15是redo中没有commit的
SQL> conn lunar/lunar
SQL> select * from test1;

SQL> insert into test1 values(14);
SQL> commit;
SQL> insert into test1 values(15);

把热备的控制文件和数据文件拷贝过来
mount数据库
SQL> startup mount
ORACLE instance started.

ORA-01991: invalid password file 'd:\oracle1\ora81\DATABASE\PWDbackup.ORA'

根据提示,重建口令文件
SQL> host
E:\>del d:\oracle1\ora81\DATABASE\PWDbackup.ORA

E:\>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA password=oracle entries=
10

尝试恢复数据库(现在恢复是不可以的)
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done

SQL> recover database using BACKUP CONTROLFILE;
ORA-00279: change 424123 generated at 10/20/2002 20:44:12 needed for thread 1

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00266: name of archived log file needed

SQL> recover database until cancel using backup controlfile;
ORA-00279: change 424123 generated at 10/20/2002 20:44:12 needed for thread 1

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00266: name of archived log file needed

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'
可见这样恢复是不行的

试图打开数据库(现在打开是不可以的)
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'
可见现在打开是不行的

重新mount数据库
SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

备份控制文件
SQL> alter database backup controlfile to trace;
Database altered.
SQL> shutdown immediate
ORA-01109: da

tabase not open
Database dismounted.
ORACLE instance shut down.

找到那个控制文件,并且编辑它
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;

重建控制文件,并自动完全恢复数据库
SQL> startup nomount
ORACLE instance started.

Total System Global Area 25856028 bytes
Fixed Size 75804 bytes
Variable Size 8925184 bytes
Database Buffers 16777216 bytes
Redo Buffers 77824 bytes
SQL> @D:\BACKUPDB\udump\ORA02020.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Control file created.

ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required
System altered.
Database altered.

验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1 where a>10;

说明:
1. 把热备的控制文件和数据文件拷贝过来
2. mount数据库
3. 根据提示,重建口令文件
4. 尝试恢复数据库(现在恢复是不可以的)
如,这三个,都不能恢复数据库:
recover database;
recover database using BACKUP CONTROLFILE;
recover database until cancel using backup controlfile;
5. 试图打开数据库(现在打开是不可以的)
如,这两个,都不能打开数据库
alter database open;
alter database open resetlogs;
6. 重新mount数据库
7. 备份控制文件
8. 找到那个控制文件,并且编辑它
9. 重建控制文件,并自动完全恢复数据库


shutdown abort的情况,恢复全部控制文件(不包括数据文件和redo)

准备工作
以下说明,如果完全恢复数据库,应该可以看到insert into test1 values(7);
SQL> insert into test1 values(3);
SQL> insert into test1 values(4);
SQL> commit;
SQL> alter system switch logfile;
SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 8
Next log sequence to archive 10
Current log sequence 10
SQL> select * from test1;
SQL> insert into test1 values(5);
SQL> commit;
SQL> insert into test1 values(6);
SQL> alter system switch logfile;
System altered.
SQL> conn internal
SQL> conn lunar/lunar
SQL> insert into test1 values(7);
1 row created.
SQL> shutdown abort;
ORA-01031: insufficient privileges
SQL> conn internal
SQL> shutdown abort;
ORACLE instance shut down.
删除那个控

制文件,把热备的控制文件拷贝过来
mount数据库
SQL> startup mount
ORACLE instance started.
ORA-01991: invalid password file 'd:\oracle1\ora81\DATABASE\PWDbackup.ORA'

根据提示,重建口令文件
SQL> host
E:\>cd d:\oracle1\ora81\DATABASE
E:\>d:
D:\oracle1\ora81\database>del PWDbackup.ORA
D:\oracle1\ora81\database>dir
驱动器 D 中的卷是 Program
卷的序列号是 D0E6-FA1C

D:\oracle1\ora81\database 的目录

2002-10-21 00:42

.
2002-10-21 00:42 ..
2002-10-05 15:36 archive
2002-10-17 13:39 40 initBACKUP.ora
2002-10-05 16:09 50 inittest.ora
2002-10-05 15:36 31,744 oradba.exe
2002-10-07 23:39 206 oradim.log
2002-10-16 18:21 1,536 PWDtest.ora
5 个文件 33,576 字节
3 个目录 2,775,724,032 可用字节

D:\oracle1\ora81\database>
D:\oracle1\ora81\database>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA password=oracle entries=10;

D:\oracle1\ora81\database>exit
用to trace;备份控制文件
SQL> alter database backup controlfile to trace;
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.

找到那个控制文件,然后编辑
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;

重建控制文件,并且恢复数据库(完全恢复成功!)
SQL> @D:\BACKUPDB\udump\ORA02092.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Cluster altered.

Media recovery complete.
System altered.
Database altered.
SQL> conn lunar/lunar
SQL> select * from test1;
完全恢复成功!

说明:
当shutdown abort的以后,如果丢失全部控制文件(不包括数据文件和redo),需要用热备的控制文件恢复数据库的时候,要想完全恢复(一直恢复到redo中commit的数据),必须执行以下步骤:
1. mount数据库,
2. backup controlfile to trace
3. 修改这个生成的控制文件
4. nomount
5. 重建控制文件,


shutdown immediate,丢失全部控制文件(不包括数据文件和redo),A[完全恢复]

SQL> conn internal
SQL> shutdown immediate;

用热备的控制文件恢复(把热备的控制文件拷贝回来)
mount数据库
SQL> startup mount
ORACLE instance started.

完全恢复和until cancel using backup controlfile都失败
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-016

10: recovery using the BACKUP CONTROLFILE option must be done

SQL> recover database until cancel using backup controlfile;
ORA-00279: change 424123 generated at 10/20/2002 20:44:12 needed for thread 1

Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00266: name of archived log file needed

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'

重建控制文件
SQL> alter database backup controlfile to trace;
Database altered.

找到那个控制文件,然后编辑
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;

重建控制文件,并且恢复数据库(完全恢复成功!)
SQL> shutdown immediate;
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.

SQL>@D:\BACKUPDB\udump\ORA02120.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Cluster altered.
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required
System altered.
Database altered.

验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1;
完全恢复成功!

说明:
当shutdown immediate的以后,如果丢失全部控制文件(不包括数据文件和redo),需要用热备的控制文件恢复数据库的时候,要想完全恢复(一直恢复到redo中commit的数据),必须执行以下步骤:
1. mount数据库,
2. backup controlfile to trace
3. 修改这个生成的控制文件
4. nomount
5. 重建控制文件



文本预览
相关文档 最新文档