一直想做个基于时间点的表空间恢复,今天测试了一下,做个笔记,方面以后查阅!
环境:Linux 5.2 10.2.0.1
RMAN TSPITR 使用rman进行表空间基于时间点的恢复
(1)先创建2个表空间。
create tablespace user01 datafile '+DG1' size 1M;
create tablespace user02 datafile '+DG1' size 1M;
(2)在每个表空间上各创建一张表。
create table scott.customers
(cust_id int,cust_name varchar2(10)) tablespace user01;
create table scott.sales
(id int,cust_name varchar2(10),sales_amount number(8,2)) tablespace user02;
(3)在每个表中插入2条记录,提交。检查当前的时间点,待会表空间user01要恢复到当前时间点。
insert into scott.customers values(1,'SOCTT');
insert into scott.customers values(2,'SMITH');
insert into scott.sales values(1,'SCOTT',8000);
insert into scott.sales values(1,'SMITH',10000);
ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM SWITCH LOGFILE;
2012年 02月 29日 星期三 22:53:57 CST
(4) truncate 表1,往表2中插入2条记录。在表空间1中再创建一个表。
truncate table scott.customers;
insert into scott.sales values(3,'SCOTT',6000);
insert into scott.sales values(4,'BLAKE',6700);
commit;
create table scott.employee(id int,name varchar2(10)) tablespace user01;
(5) 利用rman进行表空间1基于时间点的恢复。
--rman部分恢复表空间
(6)将表空间user01 联机, 检查表1的数据是否找回来,检查表2的数据是否是4条,检查新创建的表是否已经不values iis7站长之家。
select * from scott.customers;
CUST_ID CUST_NAME
---------- ----------
1 SOCTT
2 SMITH
select * from scott.sales;
ID CUST_NAME SALES_AMOUNT
---------- ---------- ------------
1 SCOTT 8000
1 SMITH 10000
3 SCOTT 6000
4 BLAKE 6700
select * from dba_tables where owner = 'SCOTT' and table_name='EMPLOYEE';
一切如我们所愿,此时,表空间不完全恢复完成。
如在上例中,执行:
create index scott.idx_customers on scott.customers(cust_name) tablespace ;
begin
dbms_tts.transport_set_check(,true);
end;
select * from transport_set_violations;
会提示:Index SCOTT.IDX_CUSTOMERS in tablespace USER02 points to table SCOTT.CUSTOMERS in tablespace USER01.
begin
dbms_tts.transport_set_check('USER01,user02',true);
end;
select * from transport_set_violations;
不会有任何提示,因为user01/user02表空间作为一个集合,是自包含的。