移动Oracle数据库的表空间方法介绍

来源:互联网 发布:电影配音软件 编辑:程序博客网 时间:2024/05/18 17:58
出处:IT专家网 日期:2010-03-24
  •   
  • 分享到:


在使用Oracle数据库的过程中,经常会遇到将数据库中的数据从一个数据库移动到另一个数据库的情况,如果移动的数据量不是太大,我们可以使用EXPORT/IMPORT将数据进行导出/导入。但如果需要搬移的数据量非常庞大,则用这种方法进行数据移动非常缓慢。在Oracle8i版本中,提供了可以对空间进行移动的方法,通过搬移空间可大大降低数据迁移的速度,提高工作效率。

  对空间进行移动时应注意以下几点:

  (1)源数据库和目标数据库必须在相同硬件平台上。例如我们可以在Sun Solaris平台的Oracle数据库之间搬移空间,也可以在Windows 2000平台的Oracle数据库之间搬移空间,但是不能在Sun Solaris/Windows 2000之间搬移空间。

  (2)源数据库和目标数据库的字符集和民族字符集必须相同。

  (3)不能将空间搬移到具有同名空间的目标数据库中。

  (4)在Oracle8i之间搬移空间时,源数据库和目标数据库的数据块尺寸一定要相同。

  下面我们以Oracle8i(8.1.5) for Windows 2000为例说明移动表空间的具体方法。

  一、检查要移动空间

  当搬移空间时,如果被搬移空间中的数据没有和其它空间中的数据有参照关系,则可直接对此空间进行搬移;如果被搬移空间中的数据与其它空间中的数据有参照关系,那么在移动表空间时,凡与被移动表空间有参照关的空间也应进行搬移,否则移动到目的地的空间中的数据是不完整的。例如空间local包含了A1,而空间local2包含了A1的索引IDX_A1,此时如果要搬移空间local,则也应同时搬移空间local2,此时我们称空间local、local2为自包含的。在进行空间搬移之前,可以用下列方法查看被搬移的空间是否为自包含空间。


  SQL>execute dbms_tts.transport_set_check(ts_list=>'local',
  incl_constraints=>TRUE);

  参数ts_list用于指定要搬移的空间,incl_constraints用于指定是否检查完整性约束。执行完过程dbms_tts.transport_set_check之后,系统将违反自包含空间的信息存入临时transport_set_violations。查询该时,如果没有返回任何信息,说明空间是自包含的,否则会返回非自含空间的原因:

  二、导出空间信息

  为保持数据文件的一致性,在导出自包含空间数据字典信息之前,应首先将自包含空间转变为只读状态,作用是使空间信息不会发生变化。


  SQL>alter tablespace local read only;
  SQL>alter tablespace local2 read only;

  将空间设置为只读关态时,会在空间数据文件上发出检查点,并且其内容不会发生任何变化,此时就可以导出空间信息了。导出空间仅仅是导出与其相关的数据字典信息,而不是导出空间的任何数据,使用如下操作系统命令可导出空间local和local2的信息。

  D:>EXP transport_tablespace=y tablespaces=local,local2 file=

  expdat.dmp

  用户名:internal/oracle@test as sysdba

  参数:transport_tablespace搬移空间选项,Y示导出空间信息;tablespaces用于指定要导出的空间;file用于指定存放导出信息的文件。

  导出空间信息之后,使用操作系统命令将空间数据文件和导出文件(expdat.dmp)复制到目标数据库所在机器相应的目录中。

  三、导入空间

  在将空间数据文件和导出文件复制到目标数据库所在机器之后,就可以将空间信息导入到目标数据库中了。导入自包含空间实际是将数据字典信息从导出文件装载到目标数据中,如空间名称、空间所对应数据文件以及数据对象名称等。具体的操作系统命令如下:


  D:>IMP transport_tablespace=y datafiles= 'd:localdblocal1.dbf'
  ,'d:localdblocal2.dbf’

  用户名:internal/oracle@test as sysdba

  当执行完上述命令之后,会将空间local和local2及其所包含的所有数据对象信息导入到目标数据库中。

  注意:在Oracle8.1.5中搬移空间时,源空间中存放的所有数据对象的所有者在目标数据库中必须存在,如果不存在,则应在导入空间之前建立相应的用户,然后再导入空间。