使用表空间时间点恢复(TSPITR)可以恢复数据库的一个或多个表空间。TSPITR支持将一个或多个非SYSTEM表空间恢复到与数据库其他部分不同的某个时间点上,实施TSPITR需要在一个辅助实例中还原源数据库的一部分,然后在辅助实例上将选择的表空间恢复到某一个时间点,最后把恢复的表空间迁移到源数据库。
辅助实例(Auxiliary instance):用于恢复特定表空间的后台进程和内存结构,该实例将打开辅助数据库;
辅助数据库(Auxiliary database):主数据库的一个复本或子集,用于表空间的临时恢复。在本节中,AUXY实例将打开一个名为PRACTICE数据库,该数据库来自PRACTICE主数据库的数据文件和控制文件的一个还原备份;
主数据库(Primary database):需要TSPITR的数据库,该数据库中的USERS表空间将恢复到与数据库中其他表空间不同的某一个时间点;
恢复集(Recovery set):构成恢复到某一个时间点表空间的数据文件,SYSTEM表空间数据文件不能作为恢复集的一部分,在本节中,恢复集是USERS表空间内的两个备份数据文件;
辅助集(Auxiliary set):表空间恢复所需要的全部数据文件。在本节中,恢复集是PRACTICE数据库的备份控制文件,SYSTEM、RBS和TEMP表控件的备份数据文件、辅助数据库参数文件以及PRACTICE主数据库的归档日志文件。
练习12:研究并解决表空间的恢复
在本练习中将“不慎”删除一个表破坏PRACTICE数据库,然后研究TSPITR相关问题。
步骤一:实施打开数据库备份
为进行TSPITR练习,可以按照练习3进行一个关闭数据库的数据库备份或者按照练习5进行一个打开数据库备份生成用于还原和恢复的备份。如果使用练习5打开数据库的备份,将备份路径修改为“D:\oracle\CODE\chap9” ,使用该脚本备份数据库时将完成如下三个操作:
- 归档主数据库的当前联机日志;
- 确保组成辅助集和恢复集表空间的所有数据文件都在备份中;
- 在数据文件备份之后创建辅助集中使用的控制文件。
步骤二:删除SCOTT.EMP
本练习通过删除SCOTT用户的雇员表(EMP),并利用TSPITR恢复该表。首先在删除之前在TS4DROP表空间创建雇员表的索引,该索引和恢复集表空间内的某个对象相关,但又不存在恢复表空间中,然后删除该表并记录删除时间,最后将USERS表空间恢复到该时间点,即恢复SCOTT.EMP雇员表。
2 SQL > ALTER INDEX pk_emp REBUILD TABLESPACE TS4DROP;
3 SQL > ALTER SESSION SET NLS_DATE_FORMAT = ' yyyy-MM-dd HH24:mi:ss ' ;
4 SQL > SELECT sysdate FROM dual;
5 SQL > DROP TABLE SCOTT.EMP;
第一行中以scott身份登录;第二行ALTER INDEX命令将索引一入到TS4DROP表空间中,当在USERS表空间实施表空间恢复时,需要删除并还原该索引;ALTER SESSION通过会话改变所有日期格式。
为更好验证TSPITR就结果,在删除表之后在USERS表空间创建一个对象,同时向USERS 表空间内的dept表插入一行,并在另一个表空间(非USERS)的表date_log插入一行数据。
2 SQL > CREATE TABLE dept_copy TABLESPACE users AS SELECT * FROM dept;
3 SQL > INSERT INTO dept (deptno, dname, loc) VALUES ( ' 50 ' , ' SUPPORT ' , ' DENVER ' );
4 SQL > COMMIT;
5 SQL > CONNECT sys / system@practice as sysdba;
6 SQL > INSERT INTO tina.date_log VALUES (sysdate + 9 * 365 );
7 SQL > COMMIT;
8 SQL > ALTER SYSTEM SWITCH LOGFILE;
实施TSPITR后,SCOTT.EMP表将不再PRACTICE主数据库的USERS表空间内存在,部门表dept将找不到SUPPORT部门,TINA.DATE_LOG将出现一笔日期为9年后的数据。
步骤三:检查TSPITR
为了考查TSPITR对数据库的影响,我们从下面三个问题确定是否实施TSPITR:
- 如果在一个表空间把TSPITR实施到某一个特定的时间点,那些对象将丢失?(删除对象)
- 哪个数据库相关对象可能会妨碍TSPITR的成功完成?(从属对象)
- 恢复集中是否有对象不能被迁移?(不可迁移对象)
1.删除对象(Dropped object):如果将一个表空间恢复到以前的某个时间点,会丢失恢复时间点之后在表空间创建的对象。可以通过查询TS_PITR_OBJECTS_TO_BE_DROPPED视图了解TSPITR将会丢失的对象。
2 Column name format a10
3 Column tname format a10
4 Column time format a20
5 SELECT owner, name, tablespace_name tname, to_char(creation_time) time
6 FROM sys.ts_pitr_objects_to_be_dropped
7 WHERE tablespace_name in ('USERS')
8 AND creation_time > to_date(' 2010 - 02 - 06 15 : 38 : 58 ',yyyy - MM - dd HH24:mi:ss')
9 ORDER BY tablespace_name, creation_time;
查询结果是DEPT_COPY,若恢复终止在2010-02-06 15:38:58 SCOTT的DEPT表的副本将存在于USERS表空间中。
如果要找出那些数据改动应用到USERS表空间的数据对象上,可以通过Log Mininer查看2010-01-28 08:48到当前日志文件之间日志文件。
2.从属对象(Dependent object):这些对象会妨碍表空间成功地恢复到USERS表,为了找出这些表及相关性可以使用名为DBMS_TTSTRANSPORT_SET_CHECK的过程和一个命名为TRANSPORT_SET_VIOLATION的视图。这个过程检查USERS表空间是否自包含(self-contained),该过程需要2各参数,第一个参数给出一个或多个需检查的表空间的名称,如果需要检查表空间集检查完整性约束,那么第二个参数为真。调用该过程,从视图提取非自包含的内容,如果不返回任何行,则说明表空间集是自包含的。
2 SQL > SELECT * FROM transport_set_violations;
在试图只导出恢复的USERS表空间时,可以看到在EMP表上创建的唯一性约束和索引会导致非法,如果只导出USERS表空间的元数据,会得到一个错误信息“The transportable set is not self-contained”。因此为导出USERS表空间,必须在恢复集中包括TS4DROP表空间,同时还要删除TS4DROP表空间内的索引。在Oracle8i中可以使用名为TS_PITR_CHECK的视图来查看妨碍TSPITR运行的相关性和限制,在Oracle9i/10g该视图不存在,取而代之是DBMS_TTS.TRANSPORT_SET_CHECK。
2 FROM sys.ts_pitr_check
3 WHERE (ts1_name IN ('USERS') AND ts2_name NOT IN ('USERS'))
4 OR (ts1_name NOT IN ('USERS') AND ts2_name IN ('USERS'));
在导出之前,需要检查恢复集之外在存在于主数据库和辅助数据库上都有的对象,如果有太多的对象在主数据库上,可以增加该表空间至恢复集内,这样可以减少消耗在删除和还原从属对象上的时间。
3.不可迁移对象(Non-transport object):在TSPITR恢复集中不可以出现的对象有:
- 复制的主表(master)
- 物化视图和物化的视图日志
- 基于功能的索引
- Scoped REF
- 域索引(用户定义的索引)
- 属于SYS的对象,包括回滚段
练习13:还原并恢复USERS表空间
在本练习中,将利用同一机器上的另一个实例还原和恢复USERS表空间,该练习类似练习9复制数据库,主要区别在于只恢复了恢复集和辅助集(USERS、SYSTEM、RBS)表空间,并且把把该数据库设置为一个克隆数据库。
实施TSPITR的首选方法是在一台与主数据库不同的服务器上创建并恢复一个辅助数据库,但由于资源所限我们可以在一台机器上进行TSPITR。在练习中,我们在一台机器上创建PRATICE主数据库的一个名为AUXY的辅助实例,然后恢复恢复集数据文件,为PRACTICE数据库的导入/导出准备数据文件。
步骤一:创建辅助实例
参见练习9步骤一创建一个名为AUXY的实例,包括目录、WINDOWS服务、参数文件以及口令文件。在参数文件中,只需一个控制文件,名为D:\oracle\AUXY\auxiliary.ctl,同时在参数文件中设置DB_FILE_NAME_CONVERT、LOG_FILE_NAME_CONVERT和LOCK_NAME_SPACE等参数项。
2 LOG_FILE_NAME_CONVERT = "PRACTICE","AUXY"
3 LOCK_NAME_SPACE = "AUXY"
需要注意DB_NAME参数不变,仍为PRACTICE,然后创建PRACTICE数据库的辅助实例。
步骤二:将SYSTEM、ROLLBACK和USERS还原到辅助实例中
将练习12中打开数据库创建的备份控制文件拷贝到D:\oracle\AUXY中,该备份控制文件用于加载数据库。把恢复集中的数据文件从D:\oracle\CODE\chap9拷贝到D:\oracle\AUXY目录下,这些数据文件来自SYSTEM、SYSAUX、UNDOTBS和USERS表空间。当创建一个辅助实例用于TSPITR时,不仅要从准备恢复的表空间中还原数据文件,还要还原SYSTEM和ROLLBACK(UNDO)数据文件,这是因为SYSTEM表空间中存储了数据字典,需要利用这些数据进行打开数据库、登录数据库、查看对象、从数据库导出等。需要UNDO表空间是因为在数据库上实施不完全恢复时,对于恢复取消时间未提交的所有事务进行回退。
2 SQL > CONN sys / system@AUXY AS SYSDBA;
3 SQL > STARTUP NOMOUNT;
4 SQL > ALTER DATABASE MOUNT CLONE DATABASE;
当将PRACTICE数据库的辅助实例作为一个克隆数据库加载时,该数据库库即脱离归档日志模式,并且所有的数据文件都脱机,由于加载为克隆实例的数据库无法假定所有的数据文件都在控制文件定义的位置,这种特性为把数据文件还原到其他地方提供了灵活性。在本练习中恢复集或辅助集只是数据文件中的一部分,其他的数据文件不需要被联机处理。
在加载备份控制文件后,可以查看控制文件中有关数据库数据文件的记录,DB_FILE_NAME_CONVERT也已经把所有数据文件的PRACTICE目录修改为AUXY目录。
2 SQL > col file# form 99 ;
3 SQL > SELECT file#, name, status FROM v$datafile;
再要查询视图v$logfile以确保联机日志文件保存在一个于PRACTICE主数据库不同的位置,在恢复之前,将SYSTEM、SYSAUX、UNDOTBS和USERS表控件数据文件置于联机,当将文件置于联机用于恢复时,这些数据文件必须保存在控制文件所指定的地方。
2 SQL > SELECT file#, name, status FROM v$datafile;
此时发现恢复集和辅助集中的数据文件处于了联机状态,而其他的数据文件时脱机状态。当恢复集文件联机时,可以把表空间恢复到USERS表空间到删除SCOTT.EMP表之前的某一个时间点。
步骤三:将AUXY恢复到特定时间
设置LOGSOURCE SQL*Plus系统变量,将辅助数据库还原的路径指向D:\oracle\PRACTICE\ARCHIVE文件夹。
2 SQL > RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL TIME ' 2010 - 02 - 06 15 : 38 : 58 ';
利用恢复命令,在联机表空间应用所有全部重做信息,直到2010-02-06 15:38:58,这个时间刚好就是SCOTT.EMP表被删除之前的时间。
打开辅助实例,重新设置日志。此时辅助实例已经打开了PRACTICE主数据库的一个备份作为辅助数据库,只有SYSTEM的回退段设置为联机状态,这可以防止对数据库中的任何用户对象执行数据操纵语句(DDL)。
在辅助实例上,可以利用前面提到的DBMS_TTS包,比较结果解决所有相关性,如果这个视图没有返回任何行,就可以确信TSPITR的导出阶段将会成功。此时需要删除SCOTT.EMP的主键,期望的表空间迁移将会成功。
练习14:迁移USERS表空间
在这里我们使用表空间导入\导出模式把一个表空间从一个实例插入到另一个实例中。为迁移这些表空间,首先将源数据库上的表空间设置为只读,利用Oracle导出应用程序提取保存在数据字段中的数据库信息(元数据);然后把数据文件和导出的元数据文件复制到目标数据库的制定位置;最后,使用Oracle导入应用程序把表空间元数据写入目标数据库的数据字典中。
一个可迁移的表空间由两部分组成:
- 某个表空间的元数据以及其中包含的全部对象的一个导出;
- 属于该表空间的数据文件的副本。
迁移表空间是通过把表空间的两个部分拷贝到一个兼容的Oracle数据库,然后通过如下步骤把表空间“插入”到数据库实例中:
- 将表空间数据文件还原到新的位置;
- 导入表空间的元数据。
步骤一:改动AUXY上的USERS表空间
在表空间迁移过程中不能出现数据库更改,因此表空间导出之前,把表空间设置为只读。当将一个表空间设置为只读时,数据该表空间的数据文件成为检查点,表空间内不允许任何更新。由于创建的辅助实例没有临时表空间,这里进行添加。
2 SQL > connect sys / system@auxy as sysdba;
3 SQL > alter tablespace users read only;
4 SQL > alter tablespace temp add tempfile ' D:\oracle\AUXY\TEMP01.dbf ' size 20M;
骤二:从AUXY上导出USERT表空间
使用导出应用程序将USERS表空间的元数据提取到一个二进制文件中。
利用一下参数文件创建导出文件:
3 Tablespaces = users
4 File = D:\oracle\CODE\chap9 \transport.dmp
5 Log = transport.log
- Userid 表空间必须由具有SYSDBA身份的用户完成,为将用户定义为SYSDBA必须使用引号;
- Transport_tablespace 该参数支持对可转移表空间元数据的导出,当设置为Y时,导出运行于表空间模式(tablespace_mode),并连同TABLESPACES参数一起使用;
- Tablespaces 该参数规定,制定表空间内用于数据字典包含的全部元数据都将导出。
步骤三:把PRACTICE数据库USERS表空间脱机
在PRACTICE主数据库删除USERS表空间,其中包括内容和数据文件。
2 SQL > connect sys / system@practice as sysdba;
3 SQL > alter tablespace users offline;
步骤四:拷贝数据文件
把AUXY实例恢复的文件复制到PRACTICE主数据库上。
2 WIN > copy D:\oracle\AUXY\USERS01.DBF copy D:\oracle\PRACTICE\USERS01.DBF;
步骤五:向PRACTICE导入USERS表空间
使用导入工具将元数据导入到PRACTICE实例中:
该参数内容如下:
2 Transport_tablespace = y
3 Tablespaces = users
4 Datafiles = ” D:\oracle\PRACTICE\USERS01.DBF”, ” D:\oracle\PRACTICE | USERS02.DBF”
5 File = transport.dmp
6 Log = imp_transport.log
- Userid 表空间必须由具有SYSDBA身份的用户完成,为将用户定义为SYSDBA必须使用引号;
- Transport_tablespace 该参数支持对可转移表空间元数据的导出,当设置为Y时,导出运行于表空间模式(tablespace_mode),并连同TABLESPACES参数一起使用;
- Tablespaces 该参数为Y时,列出将迁移到数据库中的表空间;
- Datafile 当transport_tablespace设置为Y时,该参数列出需迁移的数据文件
步骤六:验证PRACTICE上的TSPITR
把PRACTICE数据库导入的表空间设置为读-写模式:
2 SQL > CONNECT sys / system@practice as sysdba
3 SQL > ALTER TABLESPACE users READ WRITE;
查看SCOTT.EMP是否存在,而SCOTT.DEPT_COPY表是否不存在,查看SCOTT.DEPT是否能够找到SUPPORT部门,查看SCOTT.EMP表是否存在主键。
可以用如下命令查看TINA.DATE_LOG表是否有一个未来9年后的时间插入值:
2 SQL > describe scott.dept_copy;
3 SQL > SELECT * FROM scott.dept;
4 SQL > SELECT MAX(create_date) FROM tina.date_log;