转载

Oracle表空间时间点恢复技术TSPITR

假定Oracle数据库发生了以下情形:

1、表空间中,某个表的重要数据被破坏或删除。

2、误用DDL语言更改了表空间中的一个或多个表的结构,因此无法使用闪回来恢复这些表。

3、表被误删,并且已不在回收站中,如使用了带purge选项的删表操作。


那么我们该如何恢复呢?


一种可行的方法就是利用Oracle的表空间时间点恢复技术TSPITRTablespace Point In Time Recover),这是一种仅在部分数据库上执行不完整恢复的技术。该技术依据目标数据库的表空间的一个子集来创建辅助数据库,仅在此子集上执行不完整的恢复,然后使用辅助数据库的表空间来替代目标数据库中的表空间。最终结果看起来好像仅恢复和还原了该子集,而保持目标数据库的其余部分是最新的。


手动完成表空间的时间点恢复非常繁琐,但利用RMAN可以自动执行TSPITR,在不影响数据库中其他表空间或对象的前提下,方便的将一个或多个表空间的内容还原到过去的某个时间点。TSPITR是一个有用的恢复工具,但使用前需要明确以下前提:

1、数据库必须位于归档模式,且存在相应的备份集合。

2、要恢复的表空间必须是自包含的,不依赖于其它表空间中的对象。例如,如果一个表在其它表空间中包含索引,则它们或者一起参与恢复,或者先将依赖关系解除才能做恢复。


当然,TSPITR并非是发生所有表空间灾难后的万能救星。例如,不能使用它来恢复已经删除的表空间。另外,如果重命名了表空间,则无法将其恢复到重命名之前的时间点。


使用RMAN执行TSPITR很简单,在此之前需要执行几个步骤以确保操作成功,下面我们通过一个例子说明TSPITR技术的使用方法。


1、假定表空间CMES中的一张表被误删,且已无法从回收站中找回


sqlplus cmes/cmes@mes

drop table c_material_t purge;


2、确定破坏大致发生的时间点


这里,首先在操作系统提示符下设置用于控制日期时间格式的环境变量,并使用此会话完成后面的工作,确保日期时间的正确解析:

set nls_date_format=yyyy-mm-dd hh24:mi:ss


查看当前时间:

select sysdate from dual;


SYSDATE

-------------------

2016-02-15 21:30:48


3、验证表空间的依赖性


查看数据字典视图TS_PITR_CHECK来确定某个表空间是否与其它表空间存在依赖关系:

select obj1_owner, obj1_name, ts1_name, obj2_owner, obj2_name, ts2_name

  from ts_pitr_check

 where (ts1_name = 'CMES' and ts2_name != 'CMES')

    or (ts1_name != 'CMES' and ts2_name = 'CMES');


该视图填充了一对一关系的行,其中表空间ts1_name中的一个对象依赖于表空间ts2_name中的一个对象。检查结果是cmes表空间中的对象没有和其它表空间对象存在依赖关系。


倘若发现表空间对象存在依赖关系,可以临时将依赖关系解除,或者将包含依赖对象的表空间一并添加到恢复集中。后者效果更好,可以确保维护表之间逻辑上的一致性。


4、确定在执行TSPITR后会丢失的对象


查看数据字典视图TS_PITR_OBJECTS_TO_BE_DROPPED来确定表空间在按目标时间进行恢复后将会丢失的对象:

select owner, name, to_char(creation_time, 'yyyy-mm-dd hh24:mi:ss') create_time

  from ts_pitr_objects_to_be_dropped

 where tablespace_name = 'CMES'

   and creation_time > to_date('2016-02-15 21:20:00', 'yyyy-mm-dd hh24:mi:ss');


检查结果,按选取的时间恢复表空间cmes将是安全的,没有对象会丢失。倘若存在丢失的对象,可以在执行恢复操作前先导出这些对象,然后在完成恢复后重新将它们导入。


5、使用RMAN命令自动执行TSPITR


D:/下新建一个辅助目录auxdataRMAN将使用该目录创建临时辅助数据库。


启动RMAN命令连接到目标数据库:

rman target /


执行恢复命令:

recover tablespace cmes until time '2016-02-15 21:20:00' auxiliary destination 'd:/auxdata';


6、恢复后的表空间会处于脱机状态,因此还需要手动执行命令将表空间联机


sql'alter tablespace cmes online';


7、验证表空间状态,确认丢失的表已恢复


select tablespace_name, status from dba_tablespaces;


TABLESPACE_NAME                STATUS

------------------------------ ---------

SYSTEM                         ONLINE

SYSAUX                         ONLINE

UNDOTBS1                       ONLINE

TEMP                           ONLINE

USERS                          ONLINE

CMES                           ONLINE

RMES                           ONLINE

INDX                           ONLINE


select count(*) from cmes.c_material_t;


  COUNT(*)

----------

       345


另外一点需要注意,在TSPITR执行完成后,恢复目标时间之前的表空间备份将不能再使用,因此应当尽快重新备份一次表空间或整个数据库。


正文到此结束
Loading...