假定Oracle数据库发生了以下情形:
1、表空间中,某个表的重要数据被破坏或删除。
2、误用DDL语言更改了表空间中的一个或多个表的结构,因此无法使用闪回来恢复这些表。
3、表被误删,并且已不在回收站中,如使用了带purge选项的删表操作。
那么我们该如何恢复呢?
一种可行的方法就是利用Oracle的表空间时间点恢复技术TSPITR(Tablespace 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 hh34: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 hh34: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 hh34:mi:ss');
检查结果,按选取的时间恢复表空间cmes将是安全的,没有对象会丢失。倘若存在丢失的对象,可以在执行恢复操作前先导出这些对象,然后在完成恢复后重新将它们导入。
5、使用RMAN命令自动执行TSPITR
在D:\下新建一个辅助目录auxdata,RMAN将使用该目录创建临时辅助数据库。
启动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执行完成后,恢复目标时间之前的表空间备份将不能再使用,因此应当尽快重新备份一次表空间或整个数据库。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。