因为表空间的恢复只能是恢复到备份时的最新状态,所以有时需要通过表空间恢复到特定时间点的数据,可以根据以下方式进行恢复。由于表空间的数据库对象等字典信息保存在数据库的 SYSTEM 表空间中,所以表空间备份恢复只能在备份源库上联机执行,且要求在源库正常启动状态下执行表空间还原操作,并且需要开启归档模式。
还需要特别注意的是,此操作是通过UNTIL LSN 或者 UNTIL TIME进行恢复,表空间还原不建议使用 UNTIL LSN 或者 UNTIL TIME,若要使用,则确保备份集生成之后未执行过 DDL 操作,否则将可能出现不可预知的后果。
以下为表空间在虚拟环境上通过lsn恢复到特定点的操作:
1. 首先创建表空间MAIN及测试表test,并插入两行数据,提交。
create tablespace "MAIN" datafile '/dm7/dmdbms/data/DAMENG/MAIN.DBF' size 128 autoextend on ;
create table test(a char,b char) storage(on MAIN);
insert into test values(1,2);
insert into test values(3,4);
commit;
2.创建联机备份,也可以使用全库备份的备份文件恢复表空间:
backup tablespace main full backupset '/opt/dmdbms/data/test';
3.查询当前lsn记录:305857(cur_lsn)
select * from v$rlog;
4.删除表test中的全部数据
truncate table test;
5.通过lsn还原表空间
这里恢复失败的原因应该是要注意,lsn值使用备份时的lsn值,因为此时是备份中记录的有效lsn,所以此次实验备份中记录的lsn是305858。如果是在备份前记录的,则会出现下边情况。
alter tablespace main offline;
restore tablespace main from backupset '/opt/dmdbms/data/test' until lsn 305857;
[-8268]:无效恢复数据库LSN参数.
SQL> restore tablespace main from backupset '/opt/dmdbms/data/test' until lsn 305856;
restore tablespace main from backupset '/opt/dmdbms/data/test' until lsn 305856;
[-8268]:无效恢复数据库LSN参数.
已用时间: 00:00:01.052. 执行号:0.
SQL> restore tablespace main from backupset '/opt/dmdbms/data/test' until lsn 305858;
操作已执行
已用时间: 453.571(毫秒). 执行号:144.
SQL> alter tablespace main online;
操作已执行
已用时间: 21.712(毫秒). 执行号:145.
如果根据时间恢复,以下为示例:
restore tablespace main from backupset '/opt/dmdbms/data/test' until time '2020-02-18 14:56:13';
6.查询数据,两行数据恢复。
select * from test;