很久以前SAN还没有普及时, 学习当DBA时曾学到过要将表和索引分开存放, 并且不同的数据放不同的表空间中, 然后查看V$FILESTAT看文件的繁忙程度, 在多个物理盘之间平衡IO以达到性能的优化. 正式库是这样细心设计, 测试库和开发库也会这样细心设计, 但给跨平台数据迁移时带来了很多的麻烦, 尤其是有几十个表空间时, 不但浪费空间, 还容易导入导出时出表空间不存在的错误, 影响速度.

    Oracle的Exp工具就是一个很好的迁移工具, 将表/索引/视图/存贮过程等对象统一打包去, 但不容易解决多个表空间的问题. 在这里有一个非官方公开的方法, Oracle数据库中有一套为Exp工具定制的元数据, 来定义对象的各种属性, 包括数据对象所在的表空间, 只要改一下这些定义就可以了. 在9i中将catexp.sql脚本中下面视图的定义改一下就可以统一表空间了.

exu9tabs
exu9pds
exu9ind_base
exu9sto
exu9lob
exu9ltts
exu8tbp
exu8ixp

    将里面的有关表空间位置(ts$.name)的定义, 改成你想要的表空间的名字, 如原来的定义为:

……
SELECT  0, o$.name, o$.owner#, 0,
        NVL(t$.bobj#, 0), ts$.name
  FROM    sys.tab$ t$, sys.obj$ o$, sys.ts$ ts$
  WHERE  t$.obj# = o$.obj# AND
          t$.ts# = ts$.ts# AND
          o$.owner# != 0 AND
……

    改成固定的值, 如DATA, 如下所示:

……
SELECT  0, o$.name, o$.owner#, 0,
        NVL(t$.bobj#, 0), ‘DATA’ /* ts$.name */
  FROM    sys.tab$ t$, sys.obj$ o$, sys.ts$ ts$
  WHERE  t$.obj# = o$.obj# AND
          t$.ts# = ts$.ts# AND
          o$.owner# != 0 AND
……

    最后运行一下utlrp重新编译一下失效的视图, 再进行导出时, 所有的表/索引或分区都在一个表空间(DATA)上了. 这里不包括子分区的定义, 因为要测试的环境中没有子分区, 就没有改子分区的有关定义部份了.

    危险操作, 不要随便模妨, 不要直接去改catexp.sql文件, 将相关视图的定义拷出到新的文件中, 并且改动视图前, 请先备份好原来的视图定义, 以便还原.