在做impdp导入表数据时,出现了ORA-00943:cluster does not exist的错误,通常在导入数据报错都是表已存在、用户名或表空间不存在等问题,这个错误很奇怪,之前从来没有遇到过。
在MOS上搜索时发现了文档ORA-943 When Importing Clusters (Doc ID 1005258.6),这个错误ORACLE是这样解释的:
简单来说就是如果导入的表是聚簇表,而目标端预先创建的表不是聚簇表的话,那么在导入时表定义检查就会失败,报错ORA-00943: cluster does not exist。
解决方案就是,创建聚簇再导入表数据。
接下来就按照解决方案来处理
1.查看表的聚簇,CLUSTER_EIS_STUDIES
SQL> select owner,table_name,cluster_name from dba_tables where table_name='EISREPORTS';
OWNER TABLE_NAME CLUSTER_NAME
------------------------------ ------------------------------ ---------------------------
RADINFO EISREPORTS CLUSTER_EIS_STUDIES
2.获取聚簇的创建语句
select dbms_metadata.get_ddl('CLUSTER','CLUSTER_EIS_STUDIES','RADINFO') from dual;
3.在目标库上创建聚簇
CREATE CLUSTER RADINFO.CLUSTER_EIS_STUDIES (
PATIENTSINDEX NUMBER(10,0) )
SIZE 2048
聚簇已经创建完毕,再次impdp导入数据,却发现仍然报错,但这次的错误和之前不同,ORA-02032: clustered tables cannot be used before the cluster index is built,
从字面理解来说就是聚簇索引创建前无法使用聚簇表。
那么接下来就要从源端查询聚簇索引信息,之后在目标端创建了。
1.在源端查询聚簇索引信息:
select index_owner,index_name,table_name,column_name from dba_ind_columns where table_name='CLUSTER_EIS_STUDIES'
INDEX_OWNER INDEX_NAME TABLE_NAME COLUMN_NAME
-------------------------- ------------------------------ -------------------------- --------------------------
RADINFO IX_CLUSTER_EIS_STUDIES CLUSTER_EIS_STUDIES PATIENTSINDEX
2.在目标端创建聚簇索引:
create index radinfo.IX_CLUSTER_EIS_STUDIES on cluster CLUSTER_EIS_STUDIES;
再次impdp导入数据,这次终于执行成功。