前一篇文章(http://www.ixdba.net/article/24/1358.html)介绍了解决表空间转化的问题,但是这种方法无法处理包括分区表在内的表中包含多个段的情况。
看一个简单的例子:
SQL> CREATE TABLESPACE TEST DATAFILE 'F:ORACLEORADATATEST1TEST01.DBF' SIZE 10M;
表空间已创建。
SQL> CREATE TABLE T_PARTITION (ID NUMBER, NAME VARCHAR2(30))
2 PARTITION BY RANGE (ID)
3 (PARTITION P1 VALUES LESS THAN (100) TABLESPACE TEST,
4 PARTITION P2 VALUES LESS THAN (200) TABLESPACE TEST);
表已创建。
下面要将T_PARTITION迁移到另外一个数据库中,但是目标数据库中不存在TEST表空间:
F:>exp test/test@test1 file=t_partition.dmp tables=t_partition
Export: Release 9.2.0.4.0 - Production on 星期日 3月 2 16:55:34 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
s
JServer Release 9.2.0.4.0 - Production已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径 ...
. . 正在导出表 T_PARTITION
. . 正在导出分区 P1 0 行被导出
. . 正在导出分区 P2 0 行被导出在没有警告的情况下成功终止导出。
对于9i数据库而言,由于分区所在表空间不存在,即使向上一篇文章介绍的那样设置QUOTA的默认表空间,导入仍然是要报错的:
SQL> CREATE USER TEST_IMP IDENTIFIED BY TEST_IMP DEFAULT TABLESPACE YANGTK;
用户已创建
SQL> GRANT CONNECT, RESOURCE TO TEST_IMP;
授权成功。
SQL> ALTER USER TEST_IMP QUOTA UNLIMITED ON YANGTK;
IXDBA.NET社区论坛
用户已更改。
SQL> REVOKE UNLIMITED TABLESPACE FROM TEST_IMP;
撤销成功。
F:>imp test_imp/test_imp@test file=t_partition.dmp tables=t_partition
Import: Release 9.2.0.4.0 - Production on 星期日 3月 2 16:56:30 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
s
JServer Release 9.2.0.4.0 - Production
经由常规路径导出由EXPORT:V09.02.00创建的文件
警告: 此对象由 TEST 导出, 而不是当前用户
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入
. 正在将TEST的对象导入到 TEST_IMP
IMP-00017: 由于 ORACLE 的 959 错误,以下的语句失败
"CREATE TABLE "T_PARTITION" ("ID" NUMBER, "NAME" VARCHAR2(30)) PCTFREE 10 P"
"CTUSED 40 INITRANS 1 MAXTRANS 255 TABLESPACE "SYSTEM" LOGGING PARTITION BY "
"RANGE ("ID" ) (PARTITION "P1" VALUES LESS THAN (100) PCTFREE 10 PCTUSED 4"
"0 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS"
" 1) TABLESPACE "TEST" LOGGING NOCOMPRESS, PARTITION "P2" VALUES LESS THAN ("
"200) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 F"
"REELISTS 1 FREELIST GROUPS 1) TABLESPACE "TEST" LOGGING NOCOMPRESS )"
IMP-00003: 遇到 ORACLE 错误 959
ORA-00959: 表空间'TEST'不存在成功终止导入,但出现警告。
前面已经提到了9i中唯一的方法只有先手工创建表,然后使用IGNORE=Y执行导入。
但是对于10g来说,可以通过变通的方法解决这个问题: