问:请问在不使用导入导出工具的情况下,在一个单一Oracle 10g实例中进行备份与恢复独立schema的最佳办法是什么?

  每一个应用开发的schema都被分配了各自的表空间。我是想利用每个应用的表空间进行备份与恢复而不想使用导入导出的方法。请问这样有什么样的风险吗?实现起来是否简单?应用程序的表空间是否可以在任意时刻被恢复?在恢复期间是否需要关闭并重启数据库?

  请您帮忙提供一个最佳的方案。我已经有一个完整的Oracle实例备份了(RMAN等),但是在处理应用程序的时候我希望使用更高效的方法,并且需要与其他数据库恢复独立开来。

  举个例子:

  数据库实例名为ProdA,它有三个内部开发的应用schema:

  Schema   Tablespace

  --------- --------------

  Schema1  TablespaceA

  Schema2  TablespaceB

  Schema3  TablespaceC

  答:你可以将每一个schema放到它自身的表空间里,然后将整个表空间进行备份。但是记住表空间只包含“段”而且并不是所有的对象都是段。所谓的段就是指那些需要空间的对象,比如表和索引。Schema还可以包含视图、存储过程和序列等等。这些对象并不是段它们存储在数据字典下。因此备份表空间将丢失一部分非段对象。如果我必须只将一个schema区别开来进行备份的话,我会使用导入导出或者数据抽取(Data Pump)方式。然而,即使这样做也会有缺陷,因此我除非在万不得已的情况下,很少用到这样的方式。

  如果你想要一个表空间一个表空间地进行备份,你可以恢复一个表空间然后进行时间点的恢复。但是你已经有一个完整的RMAN数据库备份了,因此就没有理由再单独地进行表空间备份了。如果你想要,RMAN可以从完整的数据库备份中恢复一个表空间。

  我经常使用的一种方法就是利用导入导出或者数据抽取来从schema中导出DDL。我已经对表空间进行了备份所以我可以在任意时间回复一个schema的表空间。但是之后我导出DDL来重新创建schema对象,是否应该进行视图或存储过程的恢复呢?要做到这一点,我使用ROWS=N参数进行导出,它会导出CREATE语句而不是表数据。或者如果你不想要使用导入导出来获取DDL的话,使用DBMS_METADATA.GET_DDL过程也可以,具体如下:

  SPOOL schema1_ddl.sql
  SELECT DBMS_METADATA.GET_DDL(owner,object_name,object_type)
  FROM dba_objects WHERE owner=’SCHEMA1’;
  SPOOL OFF

  然后针对每一个schema进行相同的操作,就可以完成你想要的备份了。