16.2.1 确定 TSPITR 需求
1. 检查恢复集表空间是否为自包含
当执行 TSPITR 时,要求恢复集所包括的表空间必须是自包含的。自包含表空间集是指具有相关联的表空间集合。
违反自包含表空间集合的常见情况如下:
- 表空间集合包含有SYS 方案对象。
- 表空间集合包含了索引所在的表空间,但没有包含索引基表所在的表空间。
- 表空间集合没有包含分区表的所有分区。
- 表空间集合包含了表所在的表空间,但没有包含其LOB 列所在的表空间。
SQL> execute sys.dbms_tts.transport_set_check('TBS03',TRUE);
PL/SQL 过程已成功完成。
SQL> select * from sys.transport_set_violations;
未选定行
2. 检查是否存在恢复集表空间的数据文件备份
SQL> select file_name from dba_data_files where tablespace_name='TBS03';
FILE_NAME
----------------------------------------------------------------------------
D:\ORCL\TBS03.DBF
3. 检查是否存在辅助集的数据文件和控制文件备份
SQL> select file_name from dba_data_files where tablespace_name in ('SYSTEM','UNDOTBS1')
2 union
3 select max(name) from v$controlfile;
FILE_NAME
--------------------------------------------------------------------------------
D:\ORCL\CONTROL01.CTL
D:\ORCL\SYSTEM01.DBF
D:\ORCL\UNDOTBS01.DBF
4. 检查 TSPITR 之后丢失的对象
SQL> select owner,name from sys.ts_pitr_objects_to_be_dropped
2 where tablespace_name='TBS03' AND creation_time>to_date('2009-01-10 10:01:0
1','yyyy-mm-dd hh24:mi:ss');
未选定行
16.2.2 准备主数据库
(1) 准备TBS03 表空间、TBS04 表空间及示例表。
SQL> conn system/orcl@orcl
已连接。
SQL> create tablespace tbs03 datafile 'd:\orcl\tbs03.dbf' size 1M autoextend on
next 1M;
表空间已创建。
SQL> create tablespace tbs04 datafile 'd:\orcl\tbs04.dbf' size 1M autoextend on
next 1M;
表空间已创建。
SQL> create table scott.customers
2 (cust_id int,cust_name varchar2(10)) tablespace tbs03;
表已创建。
SQL> create table scott.sales
2 (id int,cust_name varchar2(10),sales_amount number(8,2)) tablespace tbs04;
表已创建。
(2) 备份主数据库的所有数据文件和控制文件。
使用用户管理的表空间时间点恢复:
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
D:\ORCL\SYSTEM01.DBF
D:\ORCL\UNDOTBS01.DBF
D:\ORCL\SYSAUX01.DBF
D:\ORCL\USERS01.DBF
D:\ORCL\TBS03.DBF
D:\ORCL\TBS04.DBF
已选择6行。
SQL> alter database begin backup;
数据库已更改。
SQL> host copy D:\ORCL\SYSTEM01.DBF d:\orcl\bak
已复制 1 个文件。
SQL> host copy D:\ORCL\undotbs01.DBF d:\orcl\bak
已复制 1 个文件。
SQL> host copy D:\ORCL\sysaux01.DBF d:\orcl\bak
已复制 1 个文件。
SQL> host copy D:\ORCL\users01.DBF d:\orcl\bak
已复制 1 个文件。
SQL> host copy D:\ORCL\tbs03.DBF d:\orcl\bak
已复制 1 个文件。
SQL> host copy D:\ORCL\tbs04.DBF d:\orcl\bak
已复制 1 个文件。
SQL> alter database end backup;
数据库已更改。
SQL> alter database backup controlfile to 'd:\orcl\bak\orcl.ctl' reuse;
数据库已更改。
SQL> alter system archive log current;
系统已更改。
使用RMAN 管理的表空间时间点恢复:
RMAN> run {
2> backup database format='d:\orcl\bak\%d_%s_%p.bak';
3> sql 'alter system archive log current';
4> }
启动 backup 于 10-1月 -09
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=140 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=D:\ORCL\SYSTEM01.DBF
输入数据文件 fno=00003 name=D:\ORCL\SYSAUX01.DBF
输入数据文件 fno=00002 name=D:\ORCL\UNDOTBS01.DBF
输入数据文件 fno=00004 name=D:\ORCL\USERS01.DBF
输入数据文件 fno=00005 name=D:\ORCL\TBS03.DBF
输入数据文件 fno=00006 name=D:\ORCL\TBS04.DBF
通道 ORA_DISK_1: 正在启动段 1 于 10-1月 -09
通道 ORA_DISK_1: 已完成段 1 于 10-1月 -09
段句柄=D:\ORCL\BAK\ORCL_1_1.BAK 标记=TAG20090110T110614 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:03:19
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 10-1月 -09
通道 ORA_DISK_1: 已完成段 1 于 10-1月 -09
段句柄=D:\ORCL\BAK\ORCL_2_1.BAK 标记=TAG20090110T110614 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 backup 于 10-1月 -09
sql 语句: alter system archive log current
(3). 在主数据库上执行DML 操作。
SQL> insert into scott.customers values(1,'SCOTT');
已创建 1 行。
SQL> insert into scott.customers values(2,'SMITH');
已创建 1 行。
SQL> insert into scott.sales values(1,'SCOTT',8000);
已创建 1 行。
SQL> insert into scott.sales values(2,'SMITH',10000);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
(4) 模拟用户误操作及其他正常操作。
SQL> host date
当前日期: 2009-01-10 星期六
输入新日期: (年月日)
SQL> host time
当前时间: 11:36:45.56
输入新时间:
SQL> truncate table scott.customers;
表被截断。
SQL> insert into scott.sales values(3,'SCOTT',6000);
已创建 1 行。
SQL> insert into scott.sales values(4,'BLAKE',67000);
已创建 1 行。
SQL> commit;
提交完成。
SQL> create table scott.employee(id int,name varchar2(10)) tablespace tbs03;
表已创建。