Chinaunix首页 | 论坛 | 博客
  • 博客访问: 74554
  • 博文数量: 54
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-16 16:44
文章分类

全部博文(54)

文章存档

2011年(2)

2009年(28)

2008年(24)

我的朋友

分类: LINUX

2009-05-22 09:55:10

一。环境前提:

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千万别)。这里,我们只是借此测试而已。

阅读(998) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-09-28 00:43:12

好,正遇到类似的问题,看了你的贴,收获不小,谢谢