Rman备份与恢复

RMAN 备份与恢复测试
1 测试说明
1.1 测试目的
验证RMAN备份与恢复全过程。记录整个过程的操作细节。
利用RMAN的备份与恢复可完成如下工作:
(1) 数据库备份/恢复;
(2) 同一主机,不同磁盘阵列,相同数据存储路径(模式)的数据迁移;(在恢复过程中改变数据存储路径/模式过程待验证)
(3) 不同主机,相同操作系统、同一数据库版本之间的的数据库迁移。(不同数据库版本之间是否可利用RMAN 备份与恢复进行数据迁移待验证。)
1.2 测试环境说明
• OS:Windows XP
• ORACLE VERSION: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 – Prod
• ORACLE运行模式:归档模式
• ORACLE数据存储:文件系统,存储于D:\oracle\product\10.1.0\oradata\orcl 包含文件如下:
2007-08-15 08:43 2,867,200 CONTROL01.CTL
2007-08-15 08:43 2,867,200 CONTROL02.CTL
2007-08-15 08:43 2,867,200 CONTROL03.CTL
2007-08-15 08:42 10,486,272 REDO03.LOG
2007-08-15 08:42 10,486,272 REDO04.LOG
2007-08-15 08:42 10,486,272 REDO05.LOG
2007-08-15 08:42 10,486,272 REDO06.LOG
2007-08-15 08:53 220,209,152 SYSAUX01.DBF
2007-08-15 08:43 461,381,632 SYSTEM01.DBF
2007-08-15 08:43 26,222,592 UNDOTBS01.DBF
2007-08-15 08:43 5,251,072 USERS01.DBF

2 数据备份过程
2.1 RMAN 数据库全备份
rman nocatalog target /
run 
{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup database format 'C:\db_full_%U' include current controlfile;
sql 'alter system archive log current';
#crosscheck archivelog all;
backup format 'c:\arch_full_%U' archivelog all delete input;
release channel c1;
release channel c2;
release channel c3;
}
【注意】
 RMAN采用无恢复目录模式
 备份数据库过程包含当前控制文件备份
 数据库处于归档模式,备份过程包含所有归档日志的备份
 数据库必须处于mount或者open状态,才能进行数据库备份
2.2 数据库在数据全备份后继续操作
(1)在RMAN全备份后继续数据库的操作。即在测试表中插入数据。
SQL> conn kfzjd/kfzjd
已连接。
SQL> insert into t values(100);

已创建 1 行。

SQL> insert into t values(200);

已创建 1 行。

SQL> insert into t values(300);

已创建 1 行。

SQL> insert into t values(400);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t;

ID
----------
1
2
3
100
200
300
400

已选择7行。


(2)正常关闭数据库。并删除原数据库所有文件,包括:控制文件、数据文件、日志文件。以模拟更换磁盘阵列或者文件丢失的情况。
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host move D:\oracle\product\10.1.0\oradata\orcl D:\oracle\product\10.1.0\oradata\orcl.bak
【注意】
 删除文件过程,将以更目录名称的方式,用以模拟新盘阵上的文件存储路径与原系统不同。(^_^)
此时,重新启动数据库过程必然失败。
SQL> conn / as sysdba
已连接。
SQL> startup
ORACLE instance started.

Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
ORA-00205: ?????????, ??????, ???????
【注意】此时由于实例存在,但是database全部丢失,则INSTANCE启动成功,但是database启动失败。即可,NOMOUNT状态(只启动INSTANCE)成功;进入MOUNT状态时,由于控制文件丢失,MOUNT 失败。数据库启动过程不能继续。
3 数据库恢复过程
当前情况下,所有的控制文件、数据库文件、联机日志文件均全部丢失。按照数据库恢复/启动过程,应按照先恢复数据库控制文件,再恢复数据文件的步骤进行。
3.1 恢复数据库控制文件
控制文件的恢复,依托于控制文件的备份方式。以下将分别进行说明。
3.1.1 从RMAN备份中恢复控制文件
在本例子中,RMAN备份脚本进行了控制文件的备份。所以,控制文件的恢复过程可以利用RMAN的备份完成。
此时,也存在两种情况。
• RMAN设置了控制文件自动备份。
• RMAN未设置控制文件自动备份,而由RMAN脚本进行控制文件备份。如本例所示。
对于此两种情况,分别说明如下。
3.1.1.1 RMAN未设置控制文件自动备份(本例)
C:\>rman nocatalog target /

恢复管理器: 版本10.1.0.2.0 - Production

Copyright (c) 1995, 2004, Oracle. All rights reserved.

连接到目标数据库: ORCL (DBID=1158376346)
正在使用目标数据库控制文件替代恢复目录

RMAN> show all;

RMAN 配置参数为:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.1.0\DB_1\DATABASE\S
NCFORCL.ORA'; # default
【注意】RMAN 未设置控制文件自动备份。此时如果RMAN 的直接恢复将不成功。如下所示。
RMAN> startup nomount;

Oracle 例程已启动

系统全局区域总计 171966464 字节

Fixed Size 787988 字节
Variable Size 145750508 字节
Database Buffers 25165824 字节
Redo Buffers 262144 字节

RMAN> restore controlfile from autobackup;(由于没有设置自动备份控制文件所以出错)

启动 restore 于 15-8月 -07
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=160 devtype=DISK

恢复区域目标: D:\oracle\product\10.1.0\flash_recovery_area
用于搜索的数据库名 (或锁定名称空间): ORCL
通道 ORA_DISK_1: 在恢复区域中找到自动备份
通道 ORA_DISK_1: 已找到的自动备份: D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\
ORCL\AUTOBACKUP\2007_08_14\O1_MF_S_630614292_3D31JOHN_.BKP
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 08/15/2007 09:54:16
ORA-19504: 无法创建文件"D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL"
ORA-27040: 文件创建错误, 无法创建文件
OSD-04002: 无法打开文件
O/S-Error: (OS 3) 系统找不到指定的路径。

RMAN> restore controlfile;(语法就错误了)

启动 restore 于 15-8月 -07
使用通道 ORA_DISK_1

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 08/15/2007 09:54:31
RMAN-06563: controlfile or SPFILE must be restored using FROM AUTOBACKUP

RMAN> restore database;(数据库未到MOUNT状态,不能进行^_^)

启动 restore 于 15-8月 -07
使用通道 ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 08/15/2007 09:56:57
ORA-01507: 未装载数据库



RMAN> recover database using backup controlfile;(曾经见过ITPUB上有人怎么写,但是无法通过)

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01005: syntax error: found "identifier": expecting one of: "archivelog, aux
iliary, allow, check, delete, from, high, noredo, noparallel, parallel, ;, skip,
tablespace, test, until"
RMAN-01008: the bad identifier was: using
RMAN-01007: at line 1 column 18 file: standard input

RMAN> restore database using backup controlfile; (数据库未到MOUNT状态,不能进行^_^)

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01005: syntax error: found "identifier": expecting one of: "archivelog, cha
nnel, check, controlfile, clone, database, datafile, device, from, force, high,
(, preview, ;, skip, spfile, standby, tablespace, until, validate"
RMAN-01008: the bad identifier was: using
RMAN-01007: at line 1 column 18 file: standard input

RMAN>

由于RMAN未设置控制文件自动备份。则可以利用程序包,从备份集中恢复。如下:
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
SQL> alter session set nls_language=american;

Session altered.

SQL> declare 
2 devtype varchar2(256);
3 done boolean;
4 begin 
5 devtype := dbms_backup_restore.deviceallocate(NULL); 
6 dbms_backup_restore.restoresetdatafile; 
7 dbms_backup_restore.restorecontrolfileto('D:\oracle\product\10.1.0\oradata\orcl\CONTROL01.CTL'
);
8 dbms_backup_restore.restorebackuppiece('c:\DB_FULL_0JIPED0I_1_1',done => done);
9 end;
10 /
declare
*
ERROR at line 1:
ORA-19624: operation failed, retry possible
ORA-19504: failed to create file
"D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL"
ORA-27040: file create error, unable to create file
OSD-04002: ????????????
O/S-Error: (OS 3) ??????????????????????
ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 4772
ORA-06512: at line 8
【注意】由出错了!报告无法创建指定的控制文件,是过程有错误吗?不是,是由于文件目录并不存在。(此时是测试时,故意留下的问题。还记得前面采用修改目录名的方式启动删除所有文件的步骤吗?^_^)
创建D:\oracle\product\10.1.0\oradata\orcl目录后继续。此时该目录下无任何文件。(再留下一个问题,文件存储采用裸设备呢?)
SQL> 
declare 
2 devtype varchar2(256);
3 done boolean;
4 begin 
5 devtype := dbms_backup_restore.deviceallocate(NULL); 
6 dbms_backup_restore.restoresetdatafile; 
7 dbms_backup_restore.restorecontrolfileto('D:\oracle\product\10.1.0\oradata\orcl\CONTROL01.CTL'
);
8 dbms_backup_restore.restorebackuppiece('c:\DB_FULL_0JIPED0I_1_1',done => done);
9 end;
10 /

PL/SQL 过程已成功完成。

此时在D:\oracle\product\10.1.0\oradata\orcl目录中,可看到一个控制文件。D:\oracle\product\10.1.0\oradata\orcl\CONTROL01.CTL。


此时启动数据库试验一下。
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
SQL> alter database mount;
alter database mount
*
第 1 行出现错误:
ORA-00205: ?????????, ??????, ???????

有出错了!看看ORA-00205的说明
ORA-00205 error in identifying controlfile, check alert log for more info
Cause: The system could not find a control file of the specified name and size.
Action: One of the following:
Check that the proper control file name is referenced in the CONTROL_FILES initialization parameter in the initialization parameter file and try again. 
When using mirrored control files, that is, more than one control file is referenced in the initialization parameter file, remove the control file name listed in the message from the initialization parameter file and restart the instance. If the message does not recur, remove the problem control file from the initialization parameter file and create another copy of the control file with a new file name in the initialization parameter file.

明白了!原来是缺少控制文件。检查一下spfile的设置。
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------
control_files string D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL, D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL02.CTL, D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL03.CTL

果然如此。简单,复制controlfile即可。复制该名后继续。

SQL> alter database mount;

数据库已更改。

SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: ??????????? RESETLOGS ? NORESETLOGS ??

OK!数据库可以MOUNT了,但是不能OPEN。和预期目标一样。此时D:\oracle\product\10.1.0\oradata\orcl目录下文件如下。
2007-08-15 10:45 .
2007-08-15 10:45 ..
2007-08-15 10:37 2,867,200 CONTROL01.CTL
2007-08-15 10:37 2,867,200 CONTROL02.CTL
2007-08-15 10:37 2,867,200 CONTROL03.CTL
该目录下只有三个控制文件。和预计的一样。

至此,控制文件恢复完成,可以进行下一步了。
【注意】遗留一个问题。此时是由RMAN备份的控制文件中恢复。那么如果RMAN没有备份控制文件,同时RMAN没有设置自动备份控制文件,那么该如何恢复呢?当然,如果完全没有控制文件的备份,那么就彻底歇菜了!
对于控制文件的手工备份,可以采用
 Alter database backup controlfile to trace;(此恢复有点难度)
 Alter database backup control to ‘c:\control.bak’;(此恢复简单)
3.1.1.2 RMAN设置了控制文件自动备份
建议开启RMAN 自动备份控制文件选项。操作如下:
RMAN> show all;

RMAN 配置参数为:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; (未开启控制文件自动备份)
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.1.0\DB_1\DATABASE\S
NCFORCL.ORA'; # default

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; (设置控制文件自动备份)

旧的 RMAN 配置参数:
CONFIGURE CONTROLFILE AUTOBACKUP OFF;
新的 RMAN 配置参数:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
已成功存储新的 RMAN 配置参数

RMAN> show all;

RMAN 配置参数为:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON; (开启控制文件自动备份)
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.1.0\DB_1\DATABASE\S
NCFORCL.ORA'; # default(控制文件自动备份存储位置)

RMAN>
经过以上设置后,会在数据库的结构发生变化的时候自动备份控制文件。
从RMAN设置了控制文件自动备份后,恢复控制文件的过程如下:
RMAN> startup nomount
Oracle 例程已启动
系统全局区域总计 171966464 字节
Fixed Size 787988 字节
Variable Size 145750508 字节
Database Buffers 25165824 字节
Redo Buffers 262144 字节
RMAN> restore controlfile from autobackup;(从控制文件的自动备份集合中恢复控制文件)

启动 restore 于 15-8月 -07
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=160 devtype=DISK

恢复区域目标: D:\oracle\product\10.1.0\flash_recovery_area
用于搜索的数据库名 (或锁定名称空间): ORCL
通道 ORA_DISK_1: 在恢复区域中找到自动备份
通道 ORA_DISK_1: 已找到的自动备份: D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\AUTOBACKUP\2007_08_15\O1_MF_S_63070
8486_3D5XJB9R_.BKP
通道 ORA_DISK_1: 从自动备份复原控制文件已完成
输出文件名=D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL
输出文件名=D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL02.CTL
输出文件名=D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL03.CTL
完成 restore 于 15-8月 -07

RMAN> alter database mount;(将数据库启动到MOUNTED状态,继续后续的文件恢复)
数据库已装载
释放的通道: ORA_DISK_1
利用以上语句完成控制文件自从控制文件自动备份集中恢复。完成控制文件的恢复操作。将在D:\oracle\product\10.1.0\oradata\orcl目录中生成新的控制文件。注意,此时恢复的控制文件为全部的控制文件。本例中为3个控制文件。
3.1.2 从手动控制文件备份中恢复
手动备份控制文件的方式有两种。
控制文件备份方式(1)
SQL> alter database backup controlfile to 'c:\contrilfile.bak';
数据库已更改。

方式(1)相当于为控制文件进行了一份COPY。在恢复时间,参看spfile中的control_files参数的设置进行恢复即可。

控制文件备份方式(2)
SQL> alter database backup controlfile to trace;
数据库已更改。

方式(2)将在user_dump_dest目录中生成一个trace文件。该文件中将生成控制文件的生成脚本。
本例中user_dump_dest路径为D:\oracle\product\10.1.0\admin\orcl\udump。控制文件生成脚本如下:


STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 454
LOGFILE
GROUP 3 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO03.LOG' SIZE 10M,
GROUP 4 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO04.LOG' SIZE 10M,
GROUP 5 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO05.LOG' SIZE 10M,
GROUP 6 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO06.LOG' SIZE 10M
-- STANDBY LOGFILE
DATAFILE
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF'
CHARACTER SET ZHS16GBK
;

下面将对利用方法(2)生成的控制文件脚本进行控制文件恢复的步骤说明如下:
SQL> conn / as sysdba
已连接到空闲例程。
SQL> startup nomount(只是启动INSTANCE)
ORACLE 例程已经启动。

Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
SQL> select status from v$instance;

STATUS
------------------------
STARTED

利用trace中的创建控制文件脚本,创建控制文件。注意,此时创建的控制文件为所有控制文件,本例中为3个控制文件。创建控制文件位置、数量均由spfile指定。
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 454
7 LOGFILE
8 GROUP 3 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO03.LOG' SIZE 10M,
9 GROUP 4 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO04.LOG' SIZE 10M,
10 GROUP 5 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO05.LOG' SIZE 10M,
11 GROUP 6 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO06.LOG' SIZE 10M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF',
15 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF',
16 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF',
17 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF'
18 CHARACTER SET ZHS16GBK
19 ;

控制文件已创建

注意:控制文件一旦创建,则数据库将启动到MOUNTED状态。
SQL> select status from v$instance;

STATUS
------------------------
MOUNTED

SQL> alter session set nls_language=american;
Session altered.

根据实际情况,看是否需要进行介质恢复
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required

SQL> alter database open;
Database altered.

3.2 恢复数据库数据文件
在控制文件恢复后,可以开始数据库文件的恢复。
D:\oracle\product\10.1.0>rman nocatalog target /
恢复管理器: 版本10.1.0.2.0 - Production
Copyright (c) 1995, 2004, Oracle. All rights reserved.
已连接到目标数据库 (未启动)
RMAN> startup nomount
Oracle 例程已启动
系统全局区域总计 171966464 字节
Fixed Size 787988 字节
Variable Size 145750508 字节
Database Buffers 25165824 字节
Redo Buffers 262144 字节
RMAN> alter database mount;
数据库已装载
RMAN> restore database;
启动 restore 于 15-8月 -07
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=160 devtype=DISK
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00002恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF
正将数据文件00003恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\DB_FULL_0IIPED0H_1_1 标记 = TAG20070815T090417
通道 ORA_DISK_1: 恢复完成
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF
正将数据文件00004恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\DB_FULL_0HIPED0H_1_1 标记 = TAG20070815T090417
通道 ORA_DISK_1: 恢复完成
完成 restore 于 15-8月 -07
(至此数据库恢复存储完成,但是注意并非数据库恢复完成。)
检查D:\oracle\product\10.1.0\oradata\orcl目录内容多了各数据库文件。
2007-08-15 11:34 2,867,200 CONTROL01.CTL
2007-08-15 11:34 2,867,200 CONTROL02.CTL
2007-08-15 11:34 2,867,200 CONTROL03.CTL
2007-08-15 11:40 220,209,152 SYSAUX01.DBF
2007-08-15 11:40 461,381,632 SYSTEM01.DBF
2007-08-15 11:40 26,222,592 UNDOTBS01.DBF
2007-08-15 11:40 5,251,072 USERS01.DBF
7 个文件 721,666,048 字节
但是注意,此时并没有应有的连接日志文件?那么难道日志文件并非CONTROLFILE文件创建?的确如此!那么日志文件的创建,在什么时候呢?后面有所交代。

如果此时强行打开数据库则报告需要介质恢复。(正常)
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF'

继续进行RMAN数据库恢复操作
RMAN> recover database;
启动 recover 于 15-8月 -07
使用通道 ORA_DISK_1
正在开始介质的恢复
无法恢复介质
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 08/15/2007 11:40:38
ORA-00283: recovery session canceled due to errors
RMAN-11003: failure during parse/execution of SQL statement: alter database reco
ver if needed
start
ORA-00283: 恢复会话因错误而取消
ORA-00313: 无法打开日志组 6 (用于线程 1) 的成员
ORA-00312: 联机日志 6 线程 1: 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO06.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


出错了?!不应该呀。检查以上过程发现,其实是数据库日志组丢失了。是这样吗?回想以上过程,的确如此,因为在进行了RMAN全备份后,进行了kfzjd用户表t中插入数据的操作,并且此过程,我们假设了所有的文件均丢失,那么意味着日志文件也丢失了。那么是否会丢失数据呢?结果是必然丢失数据,待验证吧。

既然此时日志组不存在,那么只能进行不完全恢复了。

SQL> recover database until cancel;
ORA-00279: 更改 361912 (在 08/15/2007 09:05:30 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2007_08_15\O1_MF_1_
14_%U_.ARC
ORA-00280: 更改 361912 (用于线程 1) 在序列 #14 中

指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2007_08_15\O1_MF_1
_14_%U_.ARC'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2007_08_15\O1_MF_1
_14_%U_.ARC'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> alter database open resetlogs;
数据库已更改。
SQL> conn kfzjd/kfzjd
已连接。
SQL> select * from t;

ID
----------
1
2
3

SQL>

检查D:\oracle\product\10.1.0\oradata\orcl目录,所有文件均得到恢复。
2007-08-15 12:36 2,867,200 CONTROL01.CTL
2007-08-15 12:36 2,867,200 CONTROL02.CTL
2007-08-15 12:36 2,867,200 CONTROL03.CTL
2007-08-15 12:32 10,486,272 REDO03.LOG
2007-08-15 12:32 10,486,272 REDO04.LOG
2007-08-15 12:32 10,486,272 REDO05.LOG
2007-08-15 12:32 10,486,272 REDO06.LOG
2007-08-15 12:32 220,209,152 SYSAUX01.DBF
2007-08-15 12:32 461,381,632 SYSTEM01.DBF
2007-08-15 12:32 26,222,592 UNDOTBS01.DBF
2007-08-15 12:32 5,251,072 USERS01.DBF
11 个文件 763,611,136 字节
2 个目录 5,616,484,352 可用字节

【注意】自此数据库成功打开。但是,由于在数据库恢复过程中,由于日志文件全部丢失。那么自上一次数据库全备份后的所有数据必然全部丢失。由此看到如果需要数据库完全恢复,日志文件是多么的重要。
4 附加的测试过程
4.1 假设1,日志文件没有丢失
修改以上的测试条件。假设除日志文件外,其他文件均丢失。在完成restore database后,将日志文件复制到原路径,之后进行数据恢复测试。
D:\oracle\product\10.1.0\oradata\orcl>rman nocatalog target /

恢复管理器: 版本10.1.0.2.0 - Production

Copyright (c) 1995, 2004, Oracle. All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup mount

Oracle 例程已启动
数据库已装载

系统全局区域总计 171966464 字节

Fixed Size 787988 字节
Variable Size 145750508 字节
Database Buffers 25165824 字节
Redo Buffers 262144 字节

RMAN> restore database;

启动 restore 于 15-8月 -07
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=160 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00002恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF
正将数据文件00003恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\DB_FULL_0IIPED0H_1_1 标记 = TAG20070815T090417
通道 ORA_DISK_1: 恢复完成
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF
正将数据文件00004恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\DB_FULL_0HIPED0H_1_1 标记 = TAG20070815T090417
通道 ORA_DISK_1: 恢复完成
完成 restore 于 15-8月 -07

RMAN> recover database;

启动 recover 于 15-8月 -07
使用通道 ORA_DISK_1
正在开始介质的恢复
完成介质的恢复
完成 recover 于 15-8月 -07
RMAN> alter database open;
数据库已打开
RMAN>

SQL> conn kfzjd/kfzjd
已连接。
SQL> select * from t;

ID
----------
1
2
3
100
200
300
400

已选择7行。
【注意】由于日志文件并没有丢失,那么数据库可进行完全恢复(数据均可恢复,不会丢失)。数据库打开时,不需要进行日志重置。

5 测试总结
• 基于RMAN 备份,除COPY后,必须在数据库MOUNT或者OPEN状态。建议对于数据涉及数据库迁移的工作,在数据库可以停机的情况下,最好采用非OPEN状态的备份。注意此时在备份脚本中,不要加入如“sql 'alter system archive log current';”的对数据库操作的语句。同时数据库必须处于归档模式。
• 建议开启RMAN 自动备份控制文件选项。同时建议做好手工控制文件备份工作。
• 控制文件中记录的信息为一个控制文件包含数据库名称和身份认证、数据库创建的时间戳、表空间名字、数据文件的名称、位置和在线重做日志文件、当前在线重做日志文件序列号、同步信息、回滚段的开始和结束、重做日志归档信息、备份信息等等。所以,在发生类似创建、删除新表空间等动作后,建议生成新的控制文件备份。(是否能够利用旧的控制文件备份,即在发生数据库改变前的控制文件进行数据库恢复,将在其他的测试文档中进行测试)
• 联机日志文件极为重要。如果联机日志文件丢失,则只能进行数据库不完全恢复。例如:上午10:00对数据库进行了一次全备份(包括所有归档日志)。之后数据库继续运行。至15:00发生了数据库故障,所有连接日志文件全部丢失。在次期间,数据库未生成任何归档日志。那么,数据恢复只能恢复到10:00的时间点的所有数据。
• 数据库恢复时,ORACLE不会自动创建所需要的目录。恢复时,应根据相关信息创建所需要的目录(路径)并赋予适合的权限(UNIX系统)。
• 对于利用裸设备存储的数据库,由于裸设备不能由ORACLE创建(相对本例子中的控制文件恢复)。必须利用操作系统命令,事先创建响应的裸设备,并根据信息进行裸设备命令。
• 与此相关的测试,还有很多,有时间再进行相应的备份/恢复测试。例如是否可在不同ORACLE版本间利用备份/恢复进行数据迁移?是否可利用旧的控制文件进行数据库恢复?等等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值