- 论坛徽章:
- 0
|
一。环境前提:
oracle 10g
windows
18:00 完成创建表空间test1,并有表t1(name,varchar2(10))
18:05 rman全库完整备份(控制文件自动备份)
18:10 drop tablespace test1 including contents and datafiles;
此时,通过select ts#,name from v$tablespace检查发现,test1表空间已经不存在了
18:11 shutdown abort;(掉电式关闭)
目的:
恢复到数据库内含有test1表空间及T1表的状态。
分析:
因为,在18:10时刻,删除了表空间test1,导致数据库物理结构变化(需要注意的是,此时rman会自动备份控制文件)。所以,如果常规恢
复,不还原控制文件,则rman会使用目标数据库current
controlfile,则数据库结构中已经没有test1表空间。无法实现目的。所以,采用还原控制文件至
18:05~18:10之间,然后不完全恢复数据库的方法。
1.在rman下启动数据库到nomount状态
RMAN> startup nomount;
已连接到目标数据库 (未启动)
Oracle 实例已启动
系统全局区域总计 452984832 字节
Fixed Size 1249512 字节
Variable Size 104861464 字节
Database Buffers 339738624 字节
Redo Buffers 7135232 字节
2.设置日期格式
RMAN> sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
--因为rman默认以环境变量来读取时间格式,与sqlplus的固定格式不同,所以,此处要设定时间格式变量。
3.从自动备份中还原控制文件到还没有删除test1表空间的合适时间点
RMAN> restore controlfile from autobackup until time '2009-3-10 18:07:00';
启动 restore 于 10-3月 -09
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=157 devtype=DISK
恢复区域目标: E:\oracle\product\10.2.0/flash_recovery_area
用于搜索的数据库名 (或数据库的唯一名称): TEST
通道 ORA_DISK_1: 在恢复区域中找到自动备份
通道 ORA_DISK_1: 已找到的自动备份: E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_ARE
TEST\AUTOBACKUP\2009_03_10\O1_MF_S_681156245_4VDGRPHN_.BKP
通道 ORA_DISK_1: 从自动备份复原控制文件已完成
输出文件名=E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\CONTROL01.CTL
输出文件名=E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\CONTROL02.CTL
输出文件名=E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\CONTROL03.CTL
完成 restore 于 10-3月 -09
4.挂载数据库
RMAN> alter database mount;
数据库已装载
释放的通道: ORA_DISK_1
5.还原数据文件
RMAN> restore database;
--因为restore使用当前启用的控制文件里的数据库结构及rman的存储仓库信息,所以,不必指定还原的时间点
启动 restore 于 10-3月 -09
启动 implicit crosscheck backup 于 10-3月 -09
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=155 devtype=DISK
已交叉检验的 2 对象
完成 implicit crosscheck backup 于 10-3月 -09
启动 implicit crosscheck copy 于 10-3月 -09
使用通道 ORA_DISK_1
完成 implicit crosscheck copy 于 10-3月 -09
搜索恢复区域中的所有文件
正在编制文件目录...
目录编制完毕
已列入目录的文件的列表
=======================
文件名: E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\TEST\AUTOBACKUP\2009_03_10\
O1_MF_S_681156245_4VDGRPHN_.BKP
文件名: E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\TEST\AUTOBACKUP\2009_03_10\
O1_MF_S_681156459_4VDGZCQX_.BKP
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSTEM01.DBF
正将数据文件00002恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\UNDOTBS01.DBF
正将数据文件00003恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSAUX01.DBF
正将数据文件00004恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\USERS01.DBF
正将数据文件00005恢复到C:\UNDO.DBF
正将数据文件00006恢复到E:\TEST01.DBF --发现test1表空间的数据文件已经被还原回来了
正将数据文件00007恢复到E:\T02.DBF
通道 ORA_DISK_1: 正在读取备份段 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\TES
T\BACKUPSET\2009_03_10\O1_MF_NNNDF_TAG20090310T180320_4VDGQ989_.BKP
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\TEST\BACKUPSET\2009_03_10\
O1_MF_NNNDF_TAG20090310T180320_4VDGQ989_.BKP 标记 = TAG20090310T180320
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:35
完成 restore 于 10-3月 -09
5.重复设置日期格式
6.利用归档及联机日志(如果需要的话。恢复的自动过程,一般不需要人为控制)恢复到合适时间点(我选择和控制文件一致的时间点)
RMAN> recover database until time '2009-03-10 18:07:00';
启动 recover 于 10-3月 -09
使用通道 ORA_DISK_1
正在开始介质的恢复
存档日志线程 1 序列 3 已作为文件 E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO03.LO
G 存在于磁盘上
存档日志文件名 =E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO03.LOG 线程 =1 序列 =3
介质恢复完成, 用时: 00:00:04
完成 recover 于 10-3月 -09
RMAN> alter database open resetlogs;(resetlogs将重置日志切换sequence,并初始化联机日志。所以,几乎所有的oracle教材都建议resetlogs后,马上进行一次完整备份,最好是脱机备份)
数据库已打开
此时可以登录数据库,验证发现,表空间test1及表t1和数据已经恢复
(ps:中间曾经报过ora-01153:an incompatible media recovery is active错误,原因还没找到)
二。elder incarnation跨resetlogs版本恢复
在上节的基础上,如果我们想将数据库恢复至18:10删除表空间test1之后的状况。我们任然按照以上步骤执行:
RMAN> startup nomount;
RMAN> sql 'alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
RMAN> restore controlfile from autobackup until time '2009-03-10 18:15:00';
(注意,仍然需要适当的还原控制文件。因为,在上次的恢复之后,test1表空间又回来了,造成数据库的结构改变,rman再次自动备份了其中含有‘test01.dbf’数据文件位置的控制文件。如果直接恢复,则无法去除test1表空间)
RMAN> alter database mount;
RMAN> restore database;
RMAN> sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
RMAN> recover database until time '2009-03-10 18:15:00';
此时,出现以下错误:
RMAN-03002: recover 命令 (在 03/10/2009 19:21:19 上) 失败
RMAN-20207: UNTIL TIME 或 RECOVERY WINDOW 在 RESETLOGS 时间之前
20207错误:默认的认为until time或RECOVERY
WINDOW的时间不能早于resetlogs的时间(我们上一个场景用resetlogs
打开数据的时间)。其原因可能是(个人猜测):既然resetlogs了,就不认识之前的归档日志信息了。把之前的归档日志排除在可供恢复的选择之外了。
这只是默认的行为,可能处于节省系统资源的考虑,毕竟resetlogs之前的数据再利用可能很小。
我们先不管原因,其解决可按以下方法处理:
1.找到数据库的当前incarnation号:
RMAN> list incarnation of database "test";
数据库原型列表
DB 关键字 Inc 关键字 DB 名 DB ID STATUS 重置 SCN 重置时间
------- ------- -------- ---------------- --- ---------- ----------
1 1 TEST 1978860036 PARENT 1 30-8月 -05
2 2 TEST 1978860036 PARENT 534907 05-3月 -09
3 3 TEST 1978860036 PARENT 762990 10-3月 -09
4 4 TEST 1978860036 PARENT 764885 10-3月 -09
5 5 TEST 1978860036 PARENT 765443 10-3月 -09
6 6 TEST 1978860036 PARENT 767488 10-3月 -09
7 7 TEST 1978860036 PARENT 771807 10-3月 -09
8 8 TEST 1978860036 PARENT 774320 10-3月 -09
9 9 TEST 1978860036 PARENT 779541 10-3月 -09
10 10 TEST 1978860036 PARENT 782000 10-3月 -09
11 11 TEST 1978860036 PARENT 783792 10-3月 -09
12 12 TEST 1978860036 CURRENT 801599 10-3月 -09 --此行原型(incarnation)号状态为current,即当前
所以,数据库的前一个(resetlogs之前)原型号为11.
我们重新启动数据库到mount状态(因为需要知道是重置哪个库,所以要挂载)
2.重置数据库到前一个原型(注意:此时的控制文件已经在前面的步骤中,还原到了适当的时间点。实际上,我们应该在nomount前还原控制文件,当然,这不是重置db原型必须的步骤)
RMAN> reset database to incarnation 11;
将数据库重置为原型 11
RMAN> sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
RMAN> restore database;
RMAN> recover database until time '2009-03-10 18:15:00';
RMAN> alter database open resetlogs; (此时,数据库的incarnation编号将再次上涨)
数据库打开
连接数据库,检查发现,表空间test1不在了。
实际上,如果只是想删除test1表空间,当然不必这么费劲(o(>﹏<)o千万别)。这里,我们只是借此测试而已。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/79444/showart_1935098.html |
|