14.5 表空间的导入与导出
表空间的导出指的是把表空间的结构和数据文件导出,表空间的导入就是把表空间的结构和数据文件写入数据库,这意味着在数据库中产生了一个新的表空间。利用表空间的导入与导出可以在不同的数据库之间移植一个表空间。在导出表空间时,不需要导出表空间中的表,所以这种方法比导出表空间中所有的表要快得多。
如果要在不同的数据库中移植数据,而这些数据都存储在同一个表空间中,那么最有效的方法就是对这个表空间进行导入与导出。首先在原来的数据库中导出这个表空间,把表空间的结构信息导出到一个文件中,这个文件称为元数据文件。然后把表空间中的数据文件和这个元数据文件一起复制到目标数据库中,然后根据元数据文件的内容把表空间导入到数据库中,这样表空间中所有的数据库对象都被导入到目标数据库中。
利用导入/导出方法移植表空间时,要求源数据库与目标数据库必须具有相同的字符集,在目标数据库中不能有同名的表空间,而且表空间要满足“自包含”的条件。“自包含”是指与当前表空间中的数据库对象相关的其他数据库对象,也要位于当前表空间中。当以下情况之一存在时,表空间不满足“自包含”的条件:
·在当前表空间中有SYS用户创建的表。
·在其他表空间中有一个表,这个表上的索引位于当前表空间中。
·某个分区表的一部分分区位于当前表空间中。
·当前表空间中的某个表上的LOB列位于其他表空间中。
·两个具有主键-外键关联关系的表分别位于当前表空间和另外一个表空间中。
在导出表空间之前,应该对它进行检查,看它是否满足“自包含”的条件。如果有上述情况之一存在,应该把相关的数据库对象移出或移入当前表空间。Oracle提供了一个程序包,利用这个包中存储过程对表空间进行检查。这个存储过程的执行格式如下:
SQL>BEGIN
DBMS_TTS.TRANSPORT_SET_CHECK(ts_list=>'USERS',
incl_constraints=>TRUE);
END;
在这个存储过程中,第一个参数指定要检查的表空间名称,第二个参数的值为TRUE。检查结果可以从数据字典视图transport_set_violations中获得。例如,下面的检查结果表明,在当前表空间中存在sys用户创建的表:
SQL>SELECT*FROM transport_set_violations;
VIOLATIONS
ORA-39917:SYS owned object T1 in tablespace USERS not allowed in pluggable set
如果表空间满足“自包含”的条件,就可以对它进行导出操作了。导出的步骤如下:
1)在源数据库中将表空间置为READ ONLY状态。例如:
SQL>ALTER TABLESPACE USERS READ ONLY;
2)利用EXP命令将表空间的结构信息导出到元数据文件中。
3)将表空间中的数据文件和元数据文件复制到目标数据库所在的系统中。
4)利用IMP命令将表空间导入到目标数据库中。
5)在源数据库中将表空间置为READ WRITE状态。例如:
SQL>ALTER TABLESPACE USERS READ WRITE;
在导出表空间时,要求用户具有EXP_FULL_DATABASE系统权限,在导入表空间时,用户需要具有IMP_FULL_DATABASE系统权限。例如,下面两条命令分别用来在两个数据库中对表空间users进行导出和导入操作:
$exp\'sys/1234 AS SYSDBA\'FILE=users.exp\
TRANSPORT_TABLESPACE=Y TABLESPACES=users
$imp\'sys/1234 AS SYSDBA\'FILE=users.exp\
TRANSPORT_TABLESPACE=Y DATAFILES=(/home/oracle/users01.dbf)
在这两条命令中用到了另外三个参数,这三个参数仅仅在对表空间进行导入/导出时才使用。这三个参数的含义如下:
·TABLESPACES:指定要导出的表空间,如TABLESPACES=(users, data)。
·TRANSPORT_TABLESPACE:指定是否导入或导出表空间的元数据。
·DATAFILES:在导入表空间时指定表空间的数据文件。
利用导入/导出工具虽然可以在不同数据库之间移植表空间,但是Oracle建议使用Data pump工具[1]对表空间进行导入/导出。我们还可以在不同的操作系统平台下移植表空间,这时需要对数据文件的格式进行转换,这种转换要借助于RMAN工具才能完成。详细信息请参考第16章的相关内容。
[1]Data pump是Oracle 10g的新特性,用于导入/导出数据。——编辑注