使用表空间时间点恢复(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