环境:
OS:Windows 2003
DB:10.2.0.1
我们可以针对整个数据库做不完全恢复,同样我们也可以对某个表空间做不完全恢复(TSPITR),如下的例子将某个表空间恢复到某个时间点,过程如下:
1.创建表空间
connect sys/sys as sysdba
create tablespace tps_hxl
datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORACL\hxl01.DBF' size 100m;
2.创建用户
connect sys/sys as sysdba
create user hxl identified by hxl
default tablespace tps_hxl;
grant connect to hxl;
grant resource to hxl;
3.创建表并写入数据
connect hxl/hxl
create table tb_tps_test
(
id number,
create_time date default sysdate
);
insert into tb_tps_test values(1,sysdate);
insert into tb_tps_test values(2,sysdate);
insert into tb_tps_test values(3,sysdate);
insert into tb_tps_test values(4,sysdate);
select * from TB_TPS_TEST t
---------------------------
select * from TB_TPS_TEST t
--------------------------
ID CREATE_TIME
1 2012-7-23 15:40:47
2 2012-7-23 15:40:47
3 2012-7-23 15:40:47
4 2012-7-23 15:40:47
4.备份数据库,这里的0级备份相当于是全备份
run{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
backup incremental level 0 database format 'F:\rman_bak\0_level_backup_%u_%T';
backup archivelog all delete input format 'F:\rman_bak\0_level_arc_%u_%T.bak';
release channel c1;
release channel c2;
}
5.记录删除表前的时间点,我们表空间恢复需要恢复到该时间点
connect hxl/hxl
SQL> select to_char(sysdate,'YYYYMMDD HH24:MI:SS') sys_date from dual;
SYS_DATE
-----------------
20120723 15:42:40
drop table tb_tps_test;
6.创建辅助实例和密码文件
oradim -new -sid aux1 -intpwd oracle -startmode manual
orapwd file=D:\oracle\product\10.2.0\db_1\database\PWDaux1.ora password=oracle entries=20 force=y
7.创建初始化辅助实例的初始化参数
create pfile='F:\aux1\initaux1.ora' from spfile;
修改参数文件initaux1.ora,最后文件的内容如下,其他参数可以不要,只需要如下几个即可.
*.db_name='oracl'
*.db_unique_name=_oracl
*.control_files=F:\aux1\control01.ctl
*.db_file_name_convert=('D:\oracle\product\10.2.0\oradata\oracl','F:\aux1')
*.log_file_name_convert=('D:\oracle\product\10.2.0\oradata\oracl','F:\aux1')
*.remote_login_passwordfile=exclusive
*.compatible='10.2.0.1.0'
*.db_block_size=8192
*.sga_target=612368384
小插曲,刚开始的时候没有设置辅助实例的sga_target,启动的时候OS会根据时间内存默认分配sga_target,记得当时系统自动分配的是117M,系统分配得过小,从主库连接到辅助库的时候执行如下命令
set oracle_sid=aux1
rman target sys/sys@oracl auxiliary /
一直报如下错误,最后的办法我是直接将辅助库的sga_target,设置成跟主库一样,问题解决.
连接到目标数据库: ORACL (DBID=1834598701)
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: 内部恢复管理器程序包初始化失败
RMAN-06136: 来自辅助数据库的 ORACLE 错误: ORA-00604: 递归 SQL 级别 2 出现错误
ORA-04031: 无法分配 180 字节的共享内存 ("shared pool","select di.inst_id,di.didbi,d...","Typechec
k","seg:kggfaAllocSeg")
8.nomount辅助实例
>set oracle_sid=aux1
>sqlplus /nolog
>connect / as sysdba
>startup nomount pfile='F:\aux1\initaux1.ora'
9.执行表空间恢复
C:\Documents and Settings\huangxueliang>set oracle_sid=aux1
C:\Documents and Settings\huangxueliang>rman target sys/sys@oracl auxiliary /
恢复管理器: Release 10.2.0.1.0 - Production on 星期一 7月 23 17:26:21 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: ORACL (DBID=1834598701)
已连接到辅助数据库: ORACL (未装载)
RMAN> run{
allocate auxiliary channel a1 type disk;
allocate channel c1 type disk;
recover tablespace tps_hxl until time "to_date('20120723 15:42:40','YYYYMMDD HH24:MI:SS')" auxiliary destination 'F:\aux1';
}
这里的时间点是删除表前记录的时间点.
使用目标数据库控制文件替代恢复目录
分配的通道: a1
通道 a1: sid=37 devtype=DISK
分配的通道: c1
通道 c1: sid=141 devtype=DISK
启动 recover 于 23-7月 -12
RMAN-05026: 警告: 假定以下表空间集适用于指定的时间点
表空间列表要求具有 UNDO 段
表空间 SYSTEM
表空间 UNDOTBS1
内存脚本的内容:
{
# set the until clause
set until time "to_date('20120723 15:42:40','YYYYMMDD HH24:MI:SS')";
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log for tspitr to a resent until time
sql 'alter system archive log current';
# avoid unnecessary autobackups for structural changes during TSPITR
sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';
}
正在执行内存脚本
正在执行命令: SET until clause
启动 restore 于 23-7月 -12
通道 a1: 正在开始恢复数据文件备份集
通道 a1: 正在复原控制文件
通道 a1: 正在读取备份段 F:\RMAN_BAK\0_LEVEL_BACKUP_0RNGQP5U_20120723
通道 a1: 已恢复备份段 1
段句柄 = F:\RMAN_BAK\0_LEVEL_BACKUP_0RNGQP5U_20120723 标记 = TAG20120723T154112
通道 a1: 恢复完成, 用时: 00:00:02
输出文件名=F:\AUX1\CONTROL01.CTL
完成 restore 于 23-7月 -12
sql 语句: alter database mount clone database
sql 语句: alter system archive log current
sql 语句: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;
内存脚本的内容:
{
# generated tablespace point-in-time recovery script
# set the until clause
set until time "to_date('20120723 15:42:40','YYYYMMDD HH24:MI:SS')";
plsql <<<-- tspitr_2
declare
sqlstatement varchar2(512);
offline_not_needed exception;
pragma exception_init(offline_not_needed, -01539);
begin
sqlstatement := 'alter tablespace '|| 'TPS_HXL' ||' offline for recover';
krmicd.writeMsg(6162, sqlstatement);
krmicd.execSql(sqlstatement);
exception
when offline_not_needed then
null;
end; >>>;
# set a destination filename for restore
set newname for datafile 1 to
"F:\AUX1\SYSTEM01.DBF";
# set a destination filename for restore
set newname for datafile 2 to
"F:\AUX1\UNDOTBS01.DBF";
# set a destination filename for restore
set newname for datafile 5 to
"D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORACL\HXL01.DBF";
# restore the tablespaces in the recovery set plus the auxilliary tablespaces
restore clone datafile 1, 2, 5;
switch clone datafile all;
#online the datafiles restored or flipped
sql clone "alter database datafile 1 online";
#online the datafiles restored or flipped
sql clone "alter database datafile 2 online";
#online the datafiles restored or flipped
sql clone "alter database datafile 5 online";
# make the controlfile point at the restored datafiles, then recover them
recover clone database tablespace "TPS_HXL", "SYSTEM", "UNDOTBS1" delete archivelog;
alter clone database open resetlogs;
# PLUG HERE the creation of a temporary tablespace if export fails due to lack
# of temporary space.
# For example in Unix these two lines would do that:
#sql clone "create tablespace aux_tspitr_tmp
# datafile ''/tmp/aux_tspitr_tmp.dbf'' size 500K";
}
正在执行内存脚本
正在执行命令: SET until clause
sql 语句: alter tablespace TPS_HXL offline for recover
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
启动 restore 于 23-7月 -12
通道 a1: 正在开始恢复数据文件备份集
通道 a1: 正在指定从备份集恢复的数据文件
正将数据文件00002恢复到F:\AUX1\UNDOTBS01.DBF
正将数据文件00005恢复到D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORACL\HXL01.DBF
通道 a1: 正在读取备份段 F:\RMAN_BAK\0_LEVEL_BACKUP_0QNGQP4O_20120723
通道 a1: 已恢复备份段 1
段句柄 = F:\RMAN_BAK\0_LEVEL_BACKUP_0QNGQP4O_20120723 标记 = TAG20120723T154112
通道 a1: 恢复完成, 用时: 00:00:07
通道 a1: 正在开始恢复数据文件备份集
通道 a1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到F:\AUX1\SYSTEM01.DBF
通道 a1: 正在读取备份段 F:\RMAN_BAK\0_LEVEL_BACKUP_0PNGQP4O_20120723
通道 a1: 已恢复备份段 1
段句柄 = F:\RMAN_BAK\0_LEVEL_BACKUP_0PNGQP4O_20120723 标记 = TAG20120723T154112
通道 a1: 恢复完成, 用时: 00:00:26
完成 restore 于 23-7月 -12
数据文件 5 已转换成数据文件副本
输入数据文件副本 recid=4 stamp=789413273 文件名=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORACL\HXL0
sql 语句: alter database datafile 1 online
sql 语句: alter database datafile 2 online
sql 语句: alter database datafile 5 online
启动 recover 于 23-7月 -12
正在开始介质的恢复
存档日志线程 1 序列 14 已作为文件 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORACL\ARCHIV
012_07_23\O1_MF_1_14_80T67O8H_.ARC 存在于磁盘上
通道 a1: 正在启动到默认目标的存档日志恢复
通道 a1: 正在恢复存档日志
存档日志线程 =1 序列=13
通道 a1: 正在读取备份段 F:\RMAN_BAK\0_LEVEL_ARC_0TNGQP62_20120723.BAK
通道 a1: 已恢复备份段 1
段句柄 = F:\RMAN_BAK\0_LEVEL_ARC_0TNGQP62_20120723.BAK 标记 = TAG20120723T154154
通道 a1: 恢复完成, 用时: 00:00:01
存档日志文件名 =D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC00013_0789122735.001 线程 =1 序列 =1
通道 clone_default: 正在删除存档日志
存档日志文件名 =D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC00013_0789122735.001 记录 ID=8 时间戳
413276
存档日志文件名 =D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORACL\ARCHIVELOG\2012_07_23\O1
14_80T67O8H_.ARC 线程 =1 序列 =14
介质恢复完成, 用时: 00:00:03
完成 recover 于 23-7月 -12
数据库已打开
内存脚本的内容:
{
# export the tablespaces in the recovery set
host 'exp userid =\"/@ as sysdba\" point_in_time_recover=y tablespaces=
TPS_HXL file=
tspitr_a.dmp';
# shutdown clone before import
shutdown clone immediate
# import the tablespaces in the recovery set
host 'imp userid =\"sys/sys@oracl as sysdba\" point_in_time_recover=y file=
tspitr_a.dmp';
# online/offline the tablespace imported
sql "alter tablespace TPS_HXL online";
sql "alter tablespace TPS_HXL offline";
# enable autobackups in case user does open resetlogs from RMAN after TSPITR
sql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;';
}
正在执行内存脚本
Export: Release 10.2.0.1.0 - Production on 星期一 7月 23 17:28:07 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
注: 将不导出表数据 (行)
即将导出表空间时间点恢复对象...
对于表空间 TPS_HXL...
. 正在导出簇定义
. 正在导出表定义
. . 正在导出表 TB_TPS_TEST
. . 正在导出表 TB_TPS_TEST
. 正在导出引用完整性约束条件
. 正在导出触发器
. 终止时间点恢复
成功终止导出, 没有出现警告。
主机命令完成
数据库已关闭
数据库已卸载
Oracle 实例已关闭
Import: Release 10.2.0.1.0 - Production on 星期一 7月 23 17:28:34 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
即将导入表空间时间点恢复对象...
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 SYS 的对象导入到 SYS
. 正在将 MYDBA 的对象导入到 MYDBA
. . 正在导入表 "TB_TPS_TEST"
. 正在将 HXL 的对象导入到 HXL
. . 正在导入表 "TB_TPS_TEST"
. 正在将 SYS 的对象导入到 SYS
成功终止导入, 没有出现警告。
主机命令完成
sql 语句: alter tablespace TPS_HXL online
sql 语句: alter tablespace TPS_HXL offline
sql 语句: begin dbms_backup_restore.AutoBackupFlag(TRUE); end;
已删除辅助实例文件 F:\AUX1\CONTROL01.CTL
已删除辅助实例文件 F:\AUX1\SYSTEM01.DBF
已删除辅助实例文件 F:\AUX1\UNDOTBS01.DBF
完成 recover 于 23-7月 -12
释放的通道: c1
RMAN>
10.手工online表空间
SQL> connect / as sysdba
已连接。
SQL> alter tablespace TPS_HXL online;
表空间已更改.
11.查看删除的表
connect hxl/hxl
select * from TB_TPS_TEST t
--------------------------
ID CREATE_TIME
1 2012-7-23 15:40:47
2 2012-7-23 15:40:47
3 2012-7-23 15:40:47
4 2012-7-23 15:40:47
数据已经恢复.
执行完表空间不完全恢复后最好是备份下数据库,从report need backup可以看出,需要备份做了不完全恢复表空间下的数据文件.
C:\Documents and Settings\huangxueliang>rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期一 7月 23 18:10:24 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: ORACL (DBID=1834598701)
RMAN> report need backup;
使用目标数据库控制文件替代恢复目录
RMAN 保留策略将应用于该命令
将 RMAN 保留策略设置为冗余 1
文件冗余备份少于1个
文件 #bkps 名称
---- ----- -----------------------------------------------------
5 0 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORACL\HXL01.DBF
使用TSPITR的限制:
Some database problems cannot be resolved with TSPITR.
1.If there are no archived redo logs or if the database runs in NOARCHIVELOG mode.
2.If TSPITR is used to recover a renamed tablespace to a point in time before it was renamed, you must use the previous name of the tablespace to perform the recovery operation. In this case when TSPITR completes, the target database contains two copies of the same tablespace, the original tablespace with the new name and the TSPITR tablespace with the old name. If this is not your goal, then you can drop the new tablespace with the new name.
3.If constraints for the tables in tablespace tbs1 are contained in tablespace tbs2, then you cannot recover tbs1 without also recovering tbs2.
4.You cannot use TSPITR to recover the current default tablespace.
5.You cannot use TSPITR to recover tablespaces containing any of the following objects:
Objects with underlying objects (such as materialized views) or contained objects (such as partitioned tables) unless all of the underlying or contained objects are in the recovery set
Undo or rollback segments
Oracle8-compatible advanced queues with multiple recipients
Objects owned by the user SYS. Examples of these types of objects are: PL/SQL, Java classes, callout programs, views, synonyms, users, privileges, dimensions, directories, and sequences.
-- The End --