rman备份恢复测试
1,打开数据库新建测试数据
$sqlplus / nolog
SQL>conn / as sysdba
SQL>startup
SQL>create table cds(id number(1),name varchar2(20));
SQL>insert into cds(id,name) values('1','litao');
2,启动到归档模式
$sqlplus / nolog
SQL>conn / as sysdba
SQL>alter database archivelog;
SQL>archive log list;
* #data 记录时间,将该时间点添加到恢复脚本中
3,做数据库全备份
$rman target /
RMAN> configure controlfile autobackup on;
RMAN>configure channel device type disk format ‘/home/oracle/backup/%U’;
RMAN>backup database;
4,修改数据库
SQL>drop table cds;
5,启动数据库到mount状态
$sqlplus / nolog
SQL>conn / as sysdba
SQL>startup mount
6,恢复数据库
$rman target /
RMAN>configure channel device type disk format '/home/oracle/backup/%U';
RMAN> restore database;
RMAN>recover database until time "to_date('2011-02-17 12:30:00','yyyy-mm-dd hh24:mi:ss')";
恢复到某一个时间点,时间点为删除数据库之前的系统时间
# RMAN>release channel t1;
(实际上rman也是一个数据库的连接,我们一般做测试的时候都是起一个通道;如果是在生产环境下,我们可能同时开多个通道进行数据库的备份,恢复完成需要释放通道)
7,查看恢复后的数据库
$sqlplus / nolog
SQL>conn / as sysdba
SQL>startup mount;
SQL>alter database open resetlogs;
SQL>select * from cds;
RMAN> shutdown immediate;
database dismounted
Oracle instance shut down
RMAN> startup nomount
connected to target database (not started)
Oracle instance started
Total System Global Area 167772160 bytes
Fixed Size 1260672 bytes
Variable Size 150995840 bytes
Database Buffers 8388608 bytes
Redo Buffers 7127040 bytes
RMAN> alter database mount
2> ;
database mounted
released channel: ORA_DISK_1
RMAN> reset database to incarnation 2 ;
RMAN> list incarnation;
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 ORCL 1168992346 PARENT 1 2006-11-16 18:40:24
2 2 ORCL 1168992346 CURRENT 456954 2007-12-13 10:20:12
3 3 ORCL 1168992346 ORPHAN 3326890 2008-06-23 11:07:57
RMAN> RESTORE DATABASE UNTIL SCN 3326890
2> ;
Starting restore at 2008-06-23 12:27:19
using channel ORA_DISK_1
skipping datafile 1; already restored to file /u/app/oracle/oradata/orcl/systemf
skipping datafile 2; already restored to file /u/app/oracle/oradata/orcl/undotbf
skipping datafile 3; already restored to file /u/app/oracle/oradata/orcl/sysauxf
skipping datafile 4; already restored to file /u/app/oracle/oradata/orcl/users0f
restore not done; all files readonly, offline, or already restored
Finished restore at 2008-06-23 12:27:19
RMAN> alter database open resetlogs;
database opened
RMAN> list incarnation;
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 ORCL 1168992346 PARENT 1 2006-11-16 18:40:24
2 2 ORCL 1168992346 PARENT 456954 2007-12-13 10:20:12
4 4 ORCL 1168992346 CURRENT 3326784 2008-06-23 12:27:43
3 3 ORCL 1168992346 ORPHAN 3326890 2008-06-23 11:07:57
至此数据库恢复到较早前一个时间点。
重复执行同一个恢复脚本会有以下报错
木雨山 21:01:49
木雨山 21:02:14
执行rman恢复的时候报下面的错,不知道是什么原因?日期:2011-3-1
HAHA 9:13:41
D:\>rman target / nocatalog
恢复管理器: Release 10.2.0.1.0 - Production on 星期四 3月 27 00:18:13 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: ORCL (DBID=1176767170)
使用目标数据库控制文件替代恢复目录
RMAN> list incarnation;
数据库原型列表
DB 关键字 Inc 关键字 DB 名 DB ID STATUS 重置 SCN 重置时间
------- ------- -------- ---------------- --- ---------- ----------
1 1 ORCL 1176767170 PARENT 1 10-3月 -08
2 2 ORCL 1176767170 PARENT 472611 25-3月 -08
3 3 ORCL 1176767170 PARENT 474163 25-3月 -08
4 4 ORCL 1176767170 PARENT 488631 26-3月 -08
5 5 ORCL 1176767170 PARENT 490308 26-3月 -08
6 6 ORCL 1176767170 PARENT 506067 27-3月 -08
7 7 ORCL 1176767170 CURRENT 506961 27-3月 -08
--发现有对象丢失,需要进行基于时间的恢复,但丢失对象是发生在实体5的运行过程中,因此使用实体5的备份进行不完全恢复
RMAN> reset database to incarnation
HAHA 9:13:52
这个是rman比较经典的错误
木雨山 9:27:27
RMAN> RESTORE DATABASE UNTIL SCN 490308
木雨山 9:27:32
这样行吗
HAHA 9:27:44
可以的
HAHA 9:27:57
这个是按照scn好恢复
木雨山 9:28:24
我是说 出现那个错误后 这样做
HAHA 9:29:01
reset database to incarnation
木雨山 9:29:12
要先执行这个命令吗
HAHA 9:29:12
RMAN> list incarnation;
数据库原型列表
DB 关键字 Inc 关键字 DB 名 DB ID STATUS 重置 SCN 重置时间
------- ------- -------- ---------------- --- ---------- ----------
1 1 ORCL 1176767170 PARENT 1 10-3月 -08
2 2 ORCL 1176767170 PARENT 472611 25-3月 -08
3 3 ORCL 1176767170 PARENT 474163 25-3月 -08
4 4 ORCL 1176767170 PARENT 488631 26-3月 -08
5 5 ORCL 1176767170 PARENT 490308 26-3月 -08
6 6 ORCL 1176767170 PARENT 506067 27-3月 -08
7 7 ORCL 1176767170 CURRENT 506961 27-3月 -08
--发现有对象丢失,需要进行基于时间的恢复,但丢失对象是发生在实体5的运行过程中,因此使用实体5的备份进行不完全恢复
RMAN> reset database to incarnation
HAHA 9:29:51
这个就是alter database open resetlogs后才会引起这个错误
HAHA 9:30:22
如果你把恢复的点放到执行resetlogs时间点后就不会出现这个问题了
木雨山 9:34:23
不太明白
HAHA 9:34:52
你看看rman20207的错误提示
木雨山 9:38:36
哦 好的
利用归档及联机日志(如果需要的话。恢复的自动过程,一般不需要人为控制)恢复到合适时间点(我选择和控制文件一致的时间点)
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不在了。