ORACLE不完全恢复的几种情况
1、介绍
RMAN不完全恢复的三个标准模式:基于time、基于scn和基于sequence,与手工不完全恢复相比原理类似,语法稍有不同:
2、不完全恢复的几种情况
#### 1)不完全恢复用于最小化测试备份
####①备份一部分数据文件
RMAN> backup datafile 1,2 format '/u01/rman_bak/%s.bak';
RMAN> backup datafile 1,2 format '/u01/rman_bak/%s.bak';
启动 backup 于 2018-04-22 16:14:25
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00001 名称=/u01/app/oracle/oradata/vbox66db/system01.dbf
输入数据文件: 文件号=00002 名称=/u01/app/oracle/oradata/vbox66db/sysaux01.dbf
通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 16:14:25
通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 16:16:00
段句柄=/u01/rman_bak/3.bak 标记=TAG20180422T161425 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:35
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
备份集内包括当前控制文件
备份集内包括当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 16:16:07
通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 16:16:11
段句柄=/u01/rman_bak/4.bak 标记=TAG20180422T161425 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:04
完成 backup 于 2018-04-22 16:16:11
SQL> create table scott.emp1 as select * from scott.emp;
###②切换日志
alter system switch logfile;
③备份其余的数据文件
select FILE#,name from v$datafile;
SYS@vbox66in>select FILE#,name from v$datafile;
FILE# NAME
1/u01/app/oracle/oradata/vbox66db/system01.dbf
2/u01/app/oracle/oradata/vbox66db/sysaux01.dbf
3/u01/app/oracle/oradata/vbox66db/undotbs01.dbf
4/u01/app/oracle/oradata/vbox66db/users01.dbf
backup datafile 3,4 format ‘/u01/rman_bak/%s.bak’;
RMAN> backup datafile 3,4 format '/u01/rman_bak/%s.bak';
启动 backup 于 2018-04-22 16:29:20
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00003 名称=/u01/app/oracle/oradata/vbox66db/undotbs01.dbf
输入数据文件: 文件号=00004 名称=/u01/app/oracle/oradata/vbox66db/users01.dbf
通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 16:29:22
通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 16:29:25
段句柄=/u01/rman_bak/5.bak 标记=TAG20180422T162921 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 backup 于 2018-04-22 16:29:25
④切换日志
alter system switch logfile;
create table scott.emp2 as select * from scott.emp;
⑤干净的关闭数据库,删除所有数据文件
SYS@vbox66in>shutdown immediate; 发生完全检查点,更新控制文件和数据文件头的SCN
[oracle@vbox66 vbox66db]$ rm -rf system01.dbf
[oracle@vbox66 vbox66db]$ rm -rf sysaux01.dbf
[oracle@vbox66 vbox66db]$ rm -rf undotbs01.dbf
[oracle@vbox66 vbox66db]$ rm -rf users01.dbf
⑥RMAN按时间点做不完全恢复
SYS@vbox66in>startup mount;
RMAN> restore database;
RMAN> alter database open;
RMAN> alter database open;
RMAN-00571: >===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK >FOLLOWS ===============
RMAN-00571: >===========================================================
RMAN-03002: alter db 命令 (在 04/22/2018 16:50:09 上) 失败
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: >'/u01/app/oracle/oradata/vbox66db/system01.dbf'
SYS@vbox66in>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
1 988104
2 988104
3 988104
4 988104
SYS@vbox66in>select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
1 986289 最小化测试需要前滚到987513
2 986289 最小化测试需要前滚到987513
3 987513
4 987513
RMAN> recover database until scn 987513; 此scn是所有数据文件恢复后的最小打开数据库的scn
RMAN> recover database until scn 987513;
启动 recover 于 2018-04-22 17:11:06
使用通道 ORA_DISK_1
正在开始介质的恢复
介质恢复完成, 用时: 00:00:02
完成 recover 于 2018-04-22 17:11:08
SYS@vbox66in>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
1 988104
2 988104
3 988104
4 988104
SYS@vbox66in>select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
1 987513
2 987513
3 987513
4 987513
⑥打开数据库
SYS@vbox66in>alter database open resetlogs;
数据库已更改。
SYS@vbox66in>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
1 987517
2 987517
3 987517
4 987517
SYS@vbox66in>select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
1 987517
2 987517
3 987517
4 987517
⑦验证
SYS@vbox66in>select * from scott.emp1; //有此文件
SYS@vbox66in>select * from scott.emp1; //无此文件
###2) RMAN恢复误删除表空间
必须通过备份的控制文件(即含有删除的表空间结构的老控制文件)进行恢复。本例要做的是drop tablespace test,然后再通过不完全恢复,使数据库在drop表空间前的那一刻打开,从而恢复test表空间及t1表的内容。
注: Oracle11gR2版可以支持数据库处于open方式下,以TSPITR方式恢复误删除的表空间。
①创建表空间和表
create tablespace test datafile '/u01/app/oracle/oradata/vbox66db/test01.dbf' size 20M;
create table test_table (id int,name varchar2(30)) tablespace test;
insert into test_table values(1,'aaa');
insert into test_table values(2,'bbb');
###②对数据库进行全备
RMAN> backup database format '/u01/rman_bak/all_%U.bak';
RMAN> backup database format '/u01/rman_bak/all_%U.bak';
启动 backup 于 2018-04-22 19:40:43
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00001 名称>=/u01/app/oracle/oradata/vbox66db/system01.dbf
输入数据文件: 文件号=00002 名称>=/u01/app/oracle/oradata/vbox66db/sysaux01.dbf
输入数据文件: 文件号=00003 名称>=/u01/app/oracle/oradata/vbox66db/undotbs01.dbf
输入数据文件: 文件号=00005 名称>=/u01/app/oracle/oradata/vbox66db/test01.dbf
输入数据文件: 文件号=00004 名称>=/u01/app/oracle/oradata/vbox66db/users01.dbf
通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 19:40:44
通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 19:42:19
段句柄=/u01/rman_bak/all_0bt10gts_1_1.bak 标记>=TAG20180422T194043 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:35
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
备份集内包括当前控制文件
备份集内包括当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 19:42:22
通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 19:42:29
段句柄=/u01/rman_bak/all_0ct10h0r_1_1.bak 标记>=TAG20180422T194043 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:07
完成 backup 于 2018-04-22 19:42:29
③删除表空间及查看表空间删除时间
SYS@vbox66in>drop tablespace test including contents and datafiles;
tail /u01/app/oracle/diag/rdbms/vbox66db/vbox66in/trace/alert_vbox66in.log
[oracle@vbox66 trace]$ tail alert_vbox66in.log
Sun Apr 22 17:22:36 2018
SMCO started with pid=30, OS id=4136
Sun Apr 22 19:28:40 2018
create tablespace test datafile >'/u01/app/oracle/oradata/vbox66db/test01.dbf' size 20M
Completed: create tablespace test datafile >'/u01/app/oracle/oradata/vbox66db/test01.dbf' size 20M
Sun Apr 22 19:45:53 2018
drop tablespace test including contents and datafiles
Sun Apr 22 19:46:09 2018 //这是删除表空间的完成时间,后面取>时间要比它提前一点(考虑提前1分钟)
Deleted file /u01/app/oracle/oradata/vbox66db/test01.dbf
Completed: drop tablespace test including contents and >datafiles
④删除所有控制文件和数据文件
SYS@vbox66in> select dbid from v$database; //rman恢复是用到
SYS@vbox66in>shutdown immediate
[oracle@vbox66 vbox66db]$ mv system01.dbf system01.dbf.bak
[oracle@vbox66 vbox66db]$ mv undotbs01.dbf undotbs01.dbf.bak
[oracle@vbox66 vbox66db]$ mv sysaux01.dbf sysaux01.dbf.bak
[oracle@vbox66 vbox66db]$ mv users01.dbf users01.dbf.bak
[oracle@vbox66 vbox66db]$ mv temp01.dbf temp01.dbf.bak
[oracle@vbox66 vbox66db]$ mv control01.ctl control01.ctl.bak
[oracle@vbox66 vbox66db]$ mv control02.ctl control02.ctl.bak
⑤准备对drop tablespace test做不完全恢复
SYS@vbox66in>startup nomount;
run {
startup nomount;
set dbid=3269052407;
restore controlfile from '/u01/rman_bak/all_0ct10h0r_1_1.bak' until time '2018-04-22 19:45:09';
alter database mount;
restore database;
recover database until time '2018-04-22 19:45:09';
alter database open resetlogs;
}
RMAN> run {
2> startup nomount;
3> set dbid=3269052407;
4> restore controlfile from >'/u01/rman_bak/all_0ct10h0r_1_1.bak' until time '2018-04-22 >19:45:09';
5> alter database mount;
6> restore database;
7> recover database until time '2018-04-22 19:45:09';
8> alter database open resetlogs;
9> }Oracle 实例已启动
系统全局区域总计 839282688 字节
Fixed Size 2257880 字节
Variable Size 545262632 字节
Database Buffers 289406976 字节
Redo Buffers 2355200 字节正在执行命令: SET DBID
启动 restore 于 2018-04-22 20:18:29
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=18 设备类型=DISK
通道 ORA_DISK_1: 正在还原控制文件
通道 ORA_DISK_1: 还原完成, 用时: 00:00:03
输出文件名=/u01/app/oracle/oradata/vbox66db/control01.ctl
输出文件名=/u01/app/oracle/oradata/vbox66db/control02.ctl
完成 restore 于 2018-04-22 20:18:32数据库已装载
释放的通道: ORA_DISK_1
启动 restore 于 2018-04-22 20:18:38
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=18 设备类型=DISK通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00001 还原到 >/u01/app/oracle/oradata/vbox66db/system01.dbf
通道 ORA_DISK_1: 将数据文件 00002 还原到 >/u01/app/oracle/oradata/vbox66db/sysaux01.dbf
通道 ORA_DISK_1: 将数据文件 00003 还原到 >/u01/app/oracle/oradata/vbox66db/undotbs01.dbf
通道 ORA_DISK_1: 将数据文件 00004 还原到 >/u01/app/oracle/oradata/vbox66db/users01.dbf
通道 ORA_DISK_1: 将数据文件 00005 还原到 >/u01/app/oracle/oradata/vbox66db/test01.dbf
通道 ORA_DISK_1: 正在读取备份片段 >/u01/rman_bak/all_0bt10gts_1_1.bak
通道 ORA_DISK_1: 段句柄 = >/u01/rman_bak/all_0bt10gts_1_1.bak >标记 = >TAG20180422T194043
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:01:45
完成 restore 于 2018-04-22 20:20:25启动 recover 于 2018-04-22 20:20:25
使用通道 ORA_DISK_1正在开始介质的恢复
线程 1 序列 1 的归档日志已作为文件 >/u01/app/oracle/oradata/vbox66db/redo01.log 存在于磁盘上
归档日志文件名=/u01/app/oracle/oradata/vbox66db/redo01.log 线>程=1 序列=1
介质恢复完成, 用时: 00:00:01
完成 recover 于 2018-04-22 20:20:28数据库已打开
⑥验证
SYS@vbox66in>select * from test_table;
ID NAME
1 aaa
2 bbb
注:
①不能使用当前的控制文件恢复误删除的表空间,因为当前控制文件已经没有该表空间的记录了。
②DBID是RMAN识别数据库的身份证,保存在控制文件中,set dbid=对于控制文件自动恢复(from autobackup)是必要的;