使用表空间时间点恢复(TSPITR)可以将一个或多个非SYSTEM表空间恢复到与数据库其他部分不同的某个时间点上。这点和Flashback 有点类似。 比如用户误删了3张表,我们就可以用TSPITR恢复。
先看TSPITR 的工作流程,如下图所示:
(1) 在辅助实例上用target的备份集restore 数据文件
(2) 在辅助库上用target的归档文件recover 数据文件
(3) 在辅助库上导出相关数据
(4) 修改主库的控制文件
(5) 用辅助库上导出文件导入辅助库上。
几个相关相关的定义:
辅助实例(Auxiliary instance):我们创建的临时实例,RMAN可以使用这个实例执行TSPITR,完成TSPITR操作后,可以删除辅助实例。
辅助数据库(Auxiliary database):主数据库的一个复本或子集,用于表空间的临时恢复。
主数据库(Primary database):需要TSPITR的数据库。
恢复集(Recovery set):构成恢复到某一个时间点表空间的表空间或数据文件,SYSTEM表空间数据文件不能作为恢复集的一部分。
辅助集(Auxiliary set):需要执行TSPITR的其他目标数据库文件集。 辅助集包括备份控制文件,回滚和撤销段表空间数据文件,system表空间数据文件,辅助数据库的联机重做日志,以及一个可选的位于辅助数据库中的临时的表空间。
目标实例(target instance):包含将要恢复的表空间
一、执行自动的TSPITR
1、为TSPITR 做准备
在开始执行TSPITR之前需要完成一些步骤。
(1) 确定还原的时间点
这是最关键的因素。 我们需要认真对待这项操作,因为如果没有使用恢复目录,则表空间的恢复是一次性的过程。 如果错误地标识了恢复的时间点,则不能重新来过。 如果使用恢复目录,则不存在这种限制。
(2) 确定传送集中的对象是自包含的
应该使用TS_PITR_CHECK 视图来确保恢复集是完整的,并且标识所有可能要用到的其他表空间。 首先需要检查TS_PITR_CHECK 视图来确保没有其他相关的表空间。 比如我们检查DAVE 表空间,示例代码如下:
/* Formatted on 2010/7/7 17:10:00 (QP5 v5.115.810.9015) */
SELECT obj1_owner,
obj1_name,
obj1_type,
reason
FROM sys.ts_pitr_check
WHERE (ts1_name IN ('BL') AND ts2_name NOT IN ('BL'))
OR (ts1_name NOT IN ('BL') AND Ts2_Name IN ('BL'))
如果没有冲突,则不会返回任何行。 如果存在冲突,则会看到描述的每个冲突的行。如果有冲突,我们也需要还原关联的表空间。
(3) 保存可能丢失的对象或数据
如果我们将Dave表空间恢复之前的某个时间,那么在这个时间以后的任何更改,如新建对象,更新,插入或者删除,都会丢失。 丢失这些对象可能没有问题,但假设我们需要保存这些数据,则需要导出将要保存的数据,或者将数据复制到数据库中的其他位置。 Oracle 提供了视图 TS_PITR_OBJECTS_TO_BEDROPPED, 该视图列出了将在恢复操作期间丢失的所有对象。 使用该视图可以确定表空间中的对象在恢复之后的状态。
SQL> col owner format a10
SQL> col name format a10
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> SELECT * FROM ts_pitr_objects_to_be_dropped WHERE tablespace_name = 'BL' ;
OWNER NAME CREATION_TIME TABLESPACE_NAME
---------- ---------- ------------------- ------------------------------
BL BL 2010-07-07 19:24:18 BL
2、 执行实际的TSPITR
Oracle Database 10g将为我们执行自动的TSPITR,这意味着它将创建辅助实例。 在这种情况下,我们只需要连接目标数据库和可选的恢复目录(如果有的话),并且执行recover tablespace 命令。 RMAN 将为我们完成剩余的工作。
下面演示使用recover tablespace 命令恢复BL 表空间的示例。 我们使用可选的auxiliary destination来指示RMAN 和 Oracle 应该在何处创建与辅助数据库关联的文件。 使用该参数使得该恢复成为一个具有自动化实例的自定义TSPITR。 如果没有使用该参数,TSPITR 就称为完全自动的TSPITR 恢复。
需要注意的是,如果使用auxiliary destination参数,则应该已经创建了目标目录,并且Oracle 必须能够写入到该目标目录。 在目标路径名中没有后缀的斜杠(/或/),如果包含斜杠将会导致TSPITR失败,并且获得错误消息无法确切地描述该问题。命令如下:
Recover tablespace BL until time "to_date('2010-7-7 20:38:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl'
在执行这个命令之前有几点注意的地方,因为TSPITR 会用已经存在的备份集和归档文件来创建辅助数据库,所以在执行该命令之前需要确认target 数据库有备份和归档,并且控制文件也要有备份。
RMAN> Recover tablespace BL until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl';
启动 recover 于 07-7月 -10
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=145 设备类型=DISK
RMAN-05026: 警告: 假定以下表空间集适用于指定的时间点
表空间列表要求具有 UNDO 段
表空间 SYSTEM
表空间 UNDOTBS1
使用 SID='iEfs' 创建自动实例 -- 这里是系统自动创建的辅助数据库名
供自动实例使用的初始化参数:
db_name=BL
db_unique_name=iEfs_tspitr_BL
compatible=11.2.0.0.0
db_block_size=8192
db_files=200
sga_target=280M
processes=50
db_create_file_dest=F:/bl
log_archive_dest_1='location=F:/bl'
#No auxiliary parameter file used
启动自动实例 BL
Oracle 实例已启动
系统全局区域总计 292933632 字节
Fixed Size 1374164 字节
Variable Size 100665388 字节
Database Buffers 184549376 字节
Redo Buffers 6344704 字节
自动实例已创建
对恢复集表空间运行 TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK 已成功完成
内存脚本的内容:
{
# set requested point in time
set until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log
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 于 07-7月 -10
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=59 设备类型=DISK
通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在还原控制文件
通道 ORA_AUX_DISK_1: 正在读取备份片段 D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/B
L/AUTOBACKUP/2010_07_07/O1_MF_S_723759094_638VQR8R_.BKP
通道 ORA_AUX_DISK_1: 段句柄 = D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBA
CKUP/2010_07_07/O1_MF_S_723759094_638VQR8R_.BKP 标记 = TAG20100707T201134
通道 ORA_AUX_DISK_1: 已还原备份片段 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:02
输出文件名=F:/BL/BL/CONTROLFILE/O1_MF_638Y5Y3J_.CTL
完成 restore 于 07-7月 -10
sql 语句: alter database mount clone database
sql 语句: alter system archive log current
sql 语句: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;
内存脚本的内容:
{
# set requested point in time
set until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 2 to new;
set newname for clone tempfile 1 to new;
set newname for datafile 5 to
"D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF";
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 3, 2, 5;
switch clone datafile all;
}
正在执行内存脚本
正在执行命令: SET until clause
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
临时文件 1 在控制文件中已重命名为 F:/BL/BL/DATAFILE/O1_MF_TEMP_%U_.TMP
启动 restore 于 07-7月 -10
使用通道 ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_AUX_DISK_1: 将数据文件 00001 还原到 F:/BL/BL/DATAFILE/O1_MF_SYSTEM_%U_.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00003 还原到 F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_%U_.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00002 还原到 F:/BL/BL/DATAFILE/O1_MF_SYSAUX_%U_.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00005 还原到 D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF
通道 ORA_AUX_DISK_1: 正在读取备份片段 F:/BACKUP/BL_02LI7BSK_1_1.BAK
通道 ORA_AUX_DISK_1: 段句柄 = F:/BACKUP/BL_02LI7BSK_1_1.BAK 标记 = TAG20100707T200956
通道 ORA_AUX_DISK_1: 已还原备份片段 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:02:46
完成 restore 于 07-7月 -10
数据文件 1 已转换成数据文件副本
输入数据文件副本 RECID=4 STAMP=723761776 文件名=F:/BL/BL/DATAFILE/O1_MF_SYSTEM_638Y6B6B_.DBF
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=5 STAMP=723761776 文件名=F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_638Y6B8V_.DBF
数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=6 STAMP=723761777 文件名=F:/BL/BL/DATAFILE/O1_MF_SYSAUX_638Y6B7Q_.DBF
内存脚本的内容:
{
# set requested point in time
set until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";
# online the datafiles restored or switched
sql clone "alter database datafile 1 online";
sql clone "alter database datafile 3 online";
sql clone "alter database datafile 2 online";
sql clone "alter database datafile 5 online";
# recover and open resetlogs
recover clone database tablespace "BL", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
正在执行内存脚本
正在执行命令: SET until clause
sql 语句: alter database datafile 1 online
sql 语句: alter database datafile 3 online
sql 语句: alter database datafile 2 online
sql 语句: alter database datafile 5 online
启动 recover 于 07-7月 -10
使用通道 ORA_AUX_DISK_1
正在开始介质的恢复
线程 1 序列 7 的归档日志已作为文件 D:/ARCHIVELOG/BL_ARC0000000007_0723658881.0001 存在于磁盘上
线程 1 序列 8 的归档日志已作为文件 D:/ARCHIVELOG/BL_ARC0000000008_0723658881.0001 存在于磁盘上
线程 1 序列 9 的归档日志已作为文件 D:/ARCHIVELOG/BL_ARC0000000009_0723658881.0001 存在于磁盘上
归档日志文件名=D:/ARCHIVELOG/BL_ARC0000000007_0723658881.0001 线程=1 序列=7
归档日志文件名=D:/ARCHIVELOG/BL_ARC0000000008_0723658881.0001 线程=1 序列=8
归档日志文件名=D:/ARCHIVELOG/BL_ARC0000000009_0723658881.0001 线程=1 序列=9
介质恢复完成, 用时: 00:00:14
完成 recover 于 07-7月 -10
数据库已打开
内存脚本的内容:
{
# online the tablespaces that will be exported
sql clone 'alter tablespace BL online';
# make read only the tablespace that will be exported
sql clone 'alter tablespace BL read only';
# create directory for datapump import
sql "create or replace directory TSPITR_DIROBJ_DPDIR as ''
F:/bl''";
# create directory for datapump export
sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as ''
F:/bl''";
}
正在执行内存脚本
sql 语句: alter tablespace BL online
sql 语句: alter tablespace BL read only
sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''F:/bl''
sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''F:/bl''
正在执行元数据导出...
EXPDP> 启动 "SYS"."TSPITR_EXP_iEfs":
EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE
EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
EXPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_EXP_iEfs"
EXPDP> ******************************************************************************
EXPDP> SYS.TSPITR_EXP_iEfs 的转储文件集为:
EXPDP> F:/BL/TSPITR_IEFS_51961.DMP
EXPDP> ******************************************************************************
EXPDP> 可传输表空间 BL 所需的数据文件:
EXPDP> D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF
EXPDP> 作业 "SYS"."TSPITR_EXP_iEfs" 已于 20:59:10 成功完成
导出完毕
内存脚本的内容:
{
# shutdown clone before import
shutdown clone immediate
# drop target tablespaces before importing them back
sql 'drop tablespace BL including contents keep datafiles';
}
正在执行内存脚本
数据库已关闭
数据库已卸装
Oracle 实例已关闭
sql 语句: drop tablespace BL including contents keep datafiles
正在执行元数据导入...
IMPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_IMP_iEfs"
IMPDP> 启动 "SYS"."TSPITR_IMP_iEfs":
IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE
IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
IMPDP> 作业 "SYS"."TSPITR_IMP_iEfs" 已于 21:00:49 成功完成
导入完毕
内存脚本的内容:
{
# make read write and offline the imported tablespaces
sql 'alter tablespace BL read write';
sql 'alter tablespace BL offline';
# enable autobackups after TSPITR is finished
sql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;';
}
正在执行内存脚本
sql 语句: alter tablespace BL read write
sql 语句: alter tablespace BL offline
sql 语句: begin dbms_backup_restore.AutoBackupFlag(TRUE); end;
删除自动实例
自动实例已删除
已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_TEMP_638YDTJF_.TMP
已删除辅助实例文件 F:/BL/BL/ONLINELOG/O1_MF_3_638YDJ2V_.LOG
已删除辅助实例文件 F:/BL/BL/ONLINELOG/O1_MF_2_638YDDND_.LOG
已删除辅助实例文件 F:/BL/BL/ONLINELOG/O1_MF_1_638YD9K7_.LOG
已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_SYSAUX_638Y6B7Q_.DBF
已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_638Y6B8V_.DBF
已删除辅助实例文件 F:/BL/BL/DATAFILE/O1_MF_SYSTEM_638Y6B6B_.DBF
已删除辅助实例文件 F:/BL/BL/CONTROLFILE/O1_MF_638Y5Y3J_.CTL
完成 recover 于 07-7月 -10
RMAN>
一旦完成了TSPITR,我们就应该能够查看到已经恢复的表空间中的对象,并且发现他们已经被恢复到请求的时间点。 我们需要将恢复的表空间改回到联机状态以使用它们。
SQL> select tablespace_name,online_status from dba_data_files;
TABLESPACE_NAME ONLINE_
------------------------------ -------
USERS ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
SYSTEM SYSTEM
BL OFFLINE
SQL> Alter tablespace BL online;
表空间已更改。
如果产生错误,Oracle 就会保持辅助实例和相关数据文件的完整性。 我们可以尝试修正问题并重新启动恢复操作。 在这种情况下,使用auxiliary参数重新启动RMAN,并且连接辅助实例。
如果辅助实例的创建工作没有完全成功,可以很容易的删除辅助实例和它的服务,而不是使用手工的TSPITR过程重新启动恢复操作。首先,指出失败的原因,然后删除实例和服务,并且重新启动自动的TSPITR过程。
删除辅助实例,用sysdba连接sqlplus,然后执行一下命令即可:
SQL> conn / as sysdba
已连接。
SQL> exec dbms_backup_restore.manageauxinstance('sjus',1);
PL/SQL 过程已成功完成。
这里的sjus 是辅助实例名,在RMAN的输出中有显示。这使TSPITR恢复之前清除所有旧的辅助实例,可以在执行该命令后进入辅助目标目录,并删除该目录中的任何文件。
3、带有自动化实例的自定义自动TSPITR
在执行TSPITR时可以使用自定义自动化实例创建,并且仍然允许Oracle 创建实例的其他的方法:
(1) 使用set newname 命令指示恢复集的单个数据文件的位置
(2) 使用configure auxname命令定义辅助实例名
(3) 为辅助实例创建自己的控制文件,并且在参数文件中提供参数(如:db_file_name_convert)。通过在$ORACLE_HOME/rdbms/admin 中创建名为parms_auxint.ora 文件来完成这项工作。 作为选择,我们可以使用RMAN命令set auxiliary instance parameter file 来指定辅助实例参数文件驻留在客户端上的路劲。
一旦已经自定义了辅助实例,就可以通过执行recover tablespace 命令让RMAN 创建辅助实例。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html