在练习12-14中我们学习了如何将数据库中删除的表恢复到错误发生之前,而不需要恢复整个数据库。Oracle可以恢复数据库的一个表空间,此时还原表空间数据文件,然后应用归档日志文件直到失效前或错误发生处。下面使用Oracle可迁移表空间功能将需要恢复对象的表空间迁移到主数据库,这种形式称为表空间时间点恢复(TSPITR)。
在前面的练习中我们也学习如何用RMAN方便地进行恢复任务,只需要几个命令就可以创建副本数据库,而副本数据库的创建也非常简单。RMAN也可以用来处理TSPITR,其工作比手工完成方便得多。如果对主数据库只进行了RMAN备份,则只能用RMAN还原和恢复工作。如果兼有用户管理的备份、导出和RMAN备份,则应用RMAN依然快捷、简单。
TSPITR优点就是可以一个或多个表空间恢复到以前的状态,而保持数据库其他部分的现状。不过恢复部分和数据库其余部分之间存在整体逻辑数据库关系时,TSPITR不太方便。如果数据关系是由某个应用程序管理而不是应用数据库的完整性,则需要确保所有相关的数据对象按顺序恢复。表空间中的不一致数据将引起许多问题,如果相关数据分散在大量的表空间中,则必须增加期望恢复的表空间以确保包括了所有相关的对象。
和以前的练习一样需要定义应用的术语,这些术语在练习12-14已经讨论过,这里有必要再次介绍:
- 辅助实例(Auxiliary instance):用于恢复特定表空间的后台进程和内存结构,该实例将打开辅助数据库;
- 辅助数据库(Auxiliary database):主数据库的一个副本或子集,用于表空间的临时恢复。在本练习中,AUXY实例将打开一个名为PRACTICE数据库,该数据库来自PRACTICE主数据库的数据文件和控制文件的一个还原备份;
- 主数据库(Primary database):需要TSPITR的数据库,该数据库中的USERS表空间将恢复到与数据库中其他表空间不同的某一个时间点;
- 恢复集(Recovery set):构成恢复到某一个时间点表空间的数据文件,SYSTEM表空间数据文件不能作为恢复集的一部分,在本节中,恢复集是USERS表空间内的两个备份数据文件;
- 辅助集(Auxiliary set):表空间恢复所需要的全部数据文件。在本节中,恢复集是PRACTICE数据库的备份控制文件,SYSTEM和UNDOTBS01表空间的备份数据文件、辅助数据库参数文件以及PRACTICE主数据库的归档日志文件。
在TSPITR期间,RMAN将完成一系列的任务,当连接到目标、辅助和可选的目录数据库时,RMAN将进行以下任务:
- 根据最近进行的备份或提供的恢复停止点来确定还原需要的数据库子集需要哪些基本的备份;
- 从RMAN备份为辅助数据库创建一个新的控制文件;
- 根据辅助数据库参数或RMAN设置名命令和选项来确定数据文件的存储位置;
- 从第1)步确定的备份片或映像拷贝还原数据文件,这个功能与RMAN通常执行数据库还原是一样的,只有恢复集和辅助集中的文件才被还原与恢复;
- 根据恢复停止点向还原的数据文件应用所有的增量备份,这个工作与在RMAN中发布恢复数据库命令是一样的;
- 基于恢复停止点向还原的数据文件应用所有来自磁盘或备份的归档日志文件,与采用RMAN进行正常恢复一样,归档对象最后被应用到还原的数据库上;
- 当重新设置联机重做日志文件时,打开辅助数据库。这个新的联机重做日志文件将根据从辅助参数文件翻译的内容创建;
- 用可迁移表空间特性导出属于恢复的(不是辅助)表空间的数据字典原数据库,并关闭辅助数据库;
- 将恢复的表空间中数据文件的位置切换到目标控制文件中新数据文件的位置;
- 将恢复的表空间的数据字典元数据导入到主/目标数据库中。
在TSPITR结束时,恢复的表空间是脱机的,保持脱机状态是为了提醒大家注意,需要备份这些表空间,一旦表空间参与到TSPITR中,则在TSPITR期间,以前的备份和归档日志文件都不能用于恢复该表空间。新的备份将为将来的恢复提供新的基准。
当考虑RMAN TSPITR时,应该注意Oracle文档中提到的几个条件,列举如下,其中有限制条件与用户管理的TSPITR一样:
- 辅助数据库和主数据库必须驻留在同一机器上,如果机器缺少磁盘空间或者其他资源,则这个限制将会导致严重的问题;
- 运行没有目录的TSPITR也有许多限制,类似于其他RMAN恢复情况,可以只还原和恢复存储在目标数据库控制文件中的数据文件,如果值配置了数据库存储7天的RMAN备份信息,则不可能恢复21天前有没有进行更新的备份的表空间;
- 不能恢复已经删除的表空间,不能恢复已经删除但又用同样的表空间名还原的表空间;
- 不能在辅助数据库上进行数据库更改,辅助数据库只具有临时功能;
- 在恢复集中不能包括下面这些对象:副本主表、带有VARRAY列的表、包含嵌套表的表、包含外部文件的表、快照日志、快照表、SYSTEM的对象和回退段。
在本练习中,用RMAN执行在练习12-14中进行的用户管理恢复练习,因为两者之间的差别比较明显所以这样的操作很有帮助,而且还可以强化以前所学的内容,因此在进行本练习之前应复习这两个练习。
恢复管理器的TSPITR
- 创建主数据库的RMAN备份 为了用RMAN执行TSPITR,RMAN需要一个合适的用于RMAN向辅助服务器上还原的备份。这个备份可以在数据库打开、关闭时生成,并且可以是映像拷贝、代理拷贝或备份;
- 备份配置备用数据库的参数文件 必须为辅助数据库创建数据库初始化参数,备用数据库需要的许多参数都与Oracle进行自动命名文件和日志文件有关。这可以在数据文件需要迁移到其他位置时,防止覆盖文件和人工干涉。重要的参数包括lock_name_space(用于同一机器上相同的数据库名为一个实例创建一个唯一的内存空间)、db_file_name_convert、log_file_name_convert(自动重新定位数据库文件和日志文件)。
- 配置备用数据库的口令文件 为了DBA身份认证,辅助数据库需要一个口令文件;
- 配置NET8的配置文件 RMAN需要同时连接主数据库和辅助数据库。其中一个连接可以由ORACLE_SID环境变量定义为本地,而另一个则必须通过NET8连接;
- 启动辅助数据库实例 RMAN在辅助数据库上执行TSPITR之前,辅助实例必须以非加载模式启动,读取第2)步中建立的参数文件;
- 打开主数据库 RMAN需要在TSPITR之间打开目标数据库,导入的恢复集字典数据需要目标数据库打开;
- 连接目标、辅助和可选目录数据库时激活TSPITR 当连接到辅助实例, RMAN将执行TSPITR。为辅助实例分配磁盘通道并为恢复设置停止点,指定需要恢复的表空间,然后RMAN执行剩下的任务。
RMAN选择最合适的基准备份用来还原,然后再计算需要什么样的增量和归档重做日志。因为正在进行不完全恢复,所以当完成辅助数据库备份后,RMAN将自动以RESETLOGS模式打开辅助数据库,同时辅助数据库需要重新生成日志文件。一旦打开辅助数据库,RMAN将导出包含在恢复表空间中所有对象的元数据。同样地,当以手工方式从一个数据库向另一个数据库传送表空间时,数据将以同样的方式导出。当导出元数据后,辅助数据库就关闭了,而目标数据库的控制文件就修改到新的数据文件刚恢复的位置,这些都是用RMAN切换命令自动完成的。最后,元数据导入到主数据库,而表空间仍然处于脱机状态。此时对这些表空间进行备份非常重要,因为在TSPITR期间这些以前表空间备份将不能用于前滚数据库。进行备份后将表空间联机,这些表空间就可以使用了。
练习33:表空间时间点恢复
在这个练习中,目标数据库是PRACTICE,辅助数据库是AUXY。下面的步骤是在错误地删除一个表后,成功地恢复一个表空间。接着要在删除命令之前、之后修改对象,以便显示表空间的恢复如何影响其他对象。一旦恢复完成,就可以证实删除的表已经恢复,而其他的表空间数据保持不变,为了使情况更简单些,这里选择自包含的表空间,所以练习中不进行对象依赖性检查。
步骤一:删除表SCOTT.EMP
删除SCOTT的employee表,这次使用TSPITR恢复该表,在删除表之前标记时间,稍后将把用户表空间恢复到这个时间,SCOTT的employee表和包含在这个表空间的其他对象都将恢复。
2 SQL > SET TIME ON
3 17 : 05 : 57 SQL > DELETE FROM tina.date_log WHERE create_date > SYSDATE;
4 17 : 06 : 01 SQL > DROP TABLE SCOTT.EMP;
5 17 : 06 : 08 SQL > SET TIME OFF
(图2)
可以看出删除表发生在17:06:01,在这个练习发生时间是2010-12-24。在对AUXY实例的TSPITR步骤三中再次使用该时间,为了确认TSPITR按要求进行工作,在删除表命令以后为USERS表空间创建一个对象。同时在USERS表空间中的一个表中插入一行记录,最后在USERS以外其他表空间的一个表中插入一行记录。
2 SELECT * FROM scott.dept;
3 SQL > INSERT INTO scott.dept(deptno, dname, loc)
4 VALUES ( ' 50 ' , ' SUPPORT ' , ' DEVER ' );
5 SQL > INSERT INTO tina.date_log VALUES (SYSDATE + 365 * 17 );
6 SQL > COMMIT;
7 SQL > ALTER SYSTEM SWITCH LOGFILE;
(图4)
执行完TSPITR之后,主数据库PRACTICE的USERS表空间将没有SCOTT.DEPT_COPY表。因为TSPITR之后USERS表空间的任何数据更改都不能恢复,所以department表中没有support部门。最后TINA.DATE_LOG中的数据在TSPITR之后将保持不变,应该在TSPITR之后看到一个未来17年的日期记录,还将发现没有恢复的表空间没有丢失任何数据或对象。如果没有恢复的表空间中的对象与恢复的表空间中的对象(例如索引、触发器和约束)有直接的联系,那么它将受到影响。最后,切换日志文件使所有这些对PRACTICE数据库进行的更改都记录到归档日志文件中。
步骤二:准备辅助数据库
准备名为AUXY的辅助数据库,与练习31准备类似,不同的是对所有的路径、参数和文件名应用AUXY而不是STBY。
- 路径 生成所有的管理目录D:\oracle\product\10.1.0\admin\AUXY和数据库目录D:\oracleAUXY;
- 参数文件 用PRACTICE数据库的拷贝创建一个参数文件,并命名为D:\oracle\product\10.1.0\admin\AUXY\\pfile\initAUXY.ORA。增加这些参数将所有PRACTICE修改为AUXY(除了DB_NAME);
1 db_file_name_convert = { " PRACTICE " , " AUXY " }
2 log_file_name_convert = { " PRACTICE " , " AUXY " }
3 lock_name_space = " AUXY "
- 口令文件 为备份数据库创建一个口令文件,使RMAN可以用SYSDBA连接到AUXY数据库;
- Window服务 在Window系统中,用oradmin工具为AUXY数据库创建一个名为OracleServiceAUXY的数据库服务;
- 配置Net8 最后为AUXY配置Net8连接,这一步对于练习10-11是不必要的。因为不需要同时连接到AUXY实例和PRACTICE数据库,使用Net8 Assistant为AUXY数据库增加一个数据库服务,并为AUXY数据库配置监听器。另外非常注意,设置完毕后需要重启监听并把数据库处于非加载模式。
步骤三:执行RMAN TSPITR
最后需要将SCOTT的employee表返回,引导RMAN在USERS表空间执行TSPITR。实际命令非常简短,如下所示:
2 connect catalog rman1010 / rman@rcat
3 connect auxiliary sys / auxy@auxy
4 run{
5 set command id to ' Perorming TSPIR ' ;
6 allocate auxiliary channel d1 type disk;
7 recover tablespace users
8 until time " TO_DATE('2010-12-24 17:06:01', 'yyyy-MM-dd HH24:mi:ss') "
9 auxiliary destination ' D:\oracle\AUXY ' ;
10 }
这个脚本打开一个目标数据库(PRACTICE)、目录数据库(RCAT)和辅助数据库(AUXY)的连接。为辅助实例分配了一个通道并将V$SESSION.CLINT_INFO动态视图列更新为”Performing TSPITR”,然后只需一个恢复表空间的命令RMAN就可以执行了。
运行该脚本并在跟踪文件中检查输出:
2 RMAN > @D:\oracle\CODE\chap17\tspitr.rcv
首先应该明确,RMAN向辅助数据库重建与恢复数据库的一个子集,一旦辅助数据库恢复了,则将回传恢复集表空间到目标数据库。
第一个生成的文件就是辅助数据库的控制文件,PRACTICE数据库控制文件的一个备份在辅助参数文件指定的位置还原。在输出信息中显示控制文件还原所在的备份片,注意RMAN从PRACTICE数据库的备份创建了辅助实例,而不是数据库本身。
为了恢复USERS表空间,RMAN知道它在表空间的恢复集中必须要还原的数据文件,并还原随后所需的表空间和数据文件。Users01.dbf和Users02.dbf属于USERS表空间,必须被还原,在本实例中,这两个数据文件是组成恢复集的两个数据文件。System01.dbf和UNDOTBS01.dbf也必须被还原(本例中组成了辅助数据集)。
(图8)
(图10)
这些命令将恢复需要回传USERS表空间到目标PRACTICE数据库的辅助数据库中的表空间。这些命令不是恢复命令,它们是由RMAN在内存中为将要进行恢复而生成的。因此RMAN将生成要求完成工作的运行脚本,恢复之后,辅助数据库必须打开,这样USERS表空间才能导出自己的字典元数据。
(图12)
RMAN的这些数据显示实际上还原基本备份。注意,辅助数据文件保存在D:\oracle\AUXY目录下,但是恢复集数据文件拷贝到目标数据库文件的位置。目标数据库的USERS表空间在还原数据文件之前是脱机状态。
(图14)
还原之后,辅助数据库中的脱机表空间恢复到停止点。增量备份也应用到还原的数据文件上,然后根据归档日志文件对辅助数据库重做。完成恢复之后,数据库打开,准备导出:
(图16)
RMAN生成export/import命令,从AUXY数据库向PRACTICE数据库传输新的恢复USERS表空间。
如果该脚本运行成功而没有错误,TSPITR就成功了。在TSPITR之后,辅助数据库(AUXY)被关闭,目标数据库(PRACTICE)已打开,而恢复的表空间(USERS)则脱机。
步骤四:确认恢复
为了确认USERS表空间按要求恢复,可以将USERS表空间联机后检查数据库中表的状态。
- 类似于SCOTT.EMP表被删除之前的操作,检查USERS表空间中的对象和数据库情况;
- 查看SCOTT.EMP表存在而SCOTT.DEPT_COPY不存在;
- 检查是否可以在SCOTT.DEPT表中找到SUPPORT记录;
- 确认没有DEPT_COPY表或者SCOTT.DEPT表中没有SUPPORT记录;
- 检查USERS表空间恢复之后其他表空间包含的数据;
- 检查TINA.DATE_LOG表中是否插入一个未来17年日期的记录。
所有这些检查可以用以下SQL执行:
2 SQL > ALTER TABLESPACE USERS ONLINE;
3 SQL > describe scott.emp;
4 SQL > describe scott.dept_copy;
5 SQL > SELECt * FROM scott.dept;
6 SQL > SELECt max(create_date) FrOM tina.date_log;
(图18)
步骤五:TSPITR之后的清理
一旦完成TSPITR则必须备份主数据库的数据文件,不能使用TSPITR之前的数据文件备份来恢复表空间,因为来自该备份的归档日志与新恢复的表空间不对应。尽管整体数据库备份可以保护新恢复的USERS表空间,但可以用以下命令备份一个表空间:
2 allocate channel d1 type disk;
3 backup tablespace USERS
4 format ' D:\oracle\CODE\chap17\db_%d_%s_%p_%t ' ;
5 }
最后一件事:不再需要在磁盘上保存辅助数据库文件。这些文件已经完成了使命,所以可以从D:\oracle\AUXY目录中删除。这样可以删除数据文件、控制文件、重做日志文件和RMAN进行TSPITR时需要的临时文件,也可以删除为辅助实例创建的数据库初始化文件、口令文件和其他路径。
1.1.3. 小结
对比练习12-14,用户管理的TSPITR与本章中的服务器管理的TSPITR相比需要更多的工作。尽管用户管理和服务器管理的TSPITR都需要建立数据库路径和相应的支撑文件以及用于数据库生成的备份,但RMAN却完成了大多数数据库的工作。下表总结了用户管理和服务器管理TSPITR的差别:
用户管理TSPITR |
服务器管理TSPITR |
配置备用数据库(路径、参数文件、口令文件、Window服务);Net8配置可选 |
配置备用数据库(路径、参数文件、口令文件、Window服务);Net8配置可选 |
采用用户管理备份主数据库打开或关闭备份,备份需要与所有数据文件一样大的磁盘或磁带空间 |
采用服务器管理备份目标数据库打开、关闭或映像拷贝。备份需要的磁盘或磁带空间比所有的数据库文件的空间小。映像拷贝需要与所有文件一样的磁盘或磁带空间 |
通过操作系统的命令删除备份文件 |
还原辅助数据库数据文件 |
在辅助数据库位置上创建控制文件的拷贝文件备份 |
在辅助控制文件的位置上还原控制 |
执行手工不完全恢复并RESETLOGS打开Export/Import恢复表空间 |
执行手工不完全恢复并已RESETLOGS打开处理恢复集表空间的导入/导出 |
为恢复的数据文件重新命名或在操作系统拷贝文件 |
切换目标数据库使用恢复的数据文件 |
在TSPITR之前从主数据库中删除恢复的表空间 |
切换数据文件而不需要删除表空间 |
目标和辅助数据库可以保存在不同的服务器上 |
目标和辅助数据库必须保存在同一服务器上 |