EXP转化表空间(二)
上一篇 / 下一篇 2008-03-02 17:30:20 / 个人分类:ORACLE
在使用EXP/IMP进行数据的迁移,经常会需要转换表空间的操作,简单记录一下,EXP过程碰到表空间的转换时需要注意的问题。
介绍利用
EXP转换表空间:http://yangtingkun.itpub.net/post/468/455820
前一篇文章介绍了解决表空间转化的问题,但是这种方法无法处理包括分区表在内的表中包含多个段的情况。
看一个简单的例子:
SQL> CREATE TABLESPACE TEST DATAFILE 'F:\ORACLE\ORADATA\TEST1\TEST01.DBF' SIZE
表空间已创建。
SQL> CREATE TABLE T_PARTITION (ID NUMBER, NAME VARCHAR2(30))
o
lDzf!sbigE8w0 2 PARTITION BY RANGE (ID)
+b&aC+L1g]il0 3 (PARTITION P1 VALUES LESS THAN (100) TABLESPACE TEST,ITPUB个人空间#I%P2T4B2js
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
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
ITPUB个人空间R^G7Aw4k`-sA
连接到: Oracle9i Enterprise Edition Release
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
XhgI,o_e0sITPUB个人空间s1nm,wz6~a`
JServer Release 9.2.0.4.0 - ProductionITPUB个人空间|BDcE%U
tVo
已导出ZHS16GBK字符集和AL16UTF16 NCHAR字符集
即将导出指定的表通过常规路径...ITPUB个人空间X8e2o{3?*L%[7R.o G
. .正在导出表 T_PARTITION
1LxN
t
q}J0. .正在导出分区 P1 0行被导出
+\
] t4R^u
~F%JR0. .正在导出分区 P2 0行被导出ITPUB个人空间w7jT]'a:JO
PP
在没有警告的情况下成功终止导出。
对于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;
用户已更改。
SQL> REVOKE UNLIMITED TABLESPACE FROM TEST_IMP;
撤销成功。
F:\>imp test_imp/test_imp@test file=t_partition.dmp tables=t_partition
Import: Release
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
ITPUB个人空间7X s;VU4_5\C)l4P;R
连接到: Oracle9i Enterprise Edition Release
:r*?p%m b|[ H7B|)I0With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining optionITPUB个人空间(L!}N5i,_+BCd9L
s
'g2NN)`#hx8X
Me\0JServer Release 9.2.0.4.0 - Production
经由常规路径导出由EXPORT:V
警告:此对象由TEST导出,而不是当前用户
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR字符集中的导入ITPUB个人空间%\6z g4q$z?3p7j
.正在将TEST的对象导入到TEST_IMPITPUB个人空间H'K5XA Q|wz2e.d-J
IMP-00017:由于ORACLE的959错误,以下的语句失败ITPUB个人空间,F&H}{6N O.^b
"CREATE TABLE "T_PARTITION" ("ID" NUMBER, "NAME" VARCHAR2(30)) PCTFREE 10 P"
A.?!f mn#Kx0 "CTUSED 40 INITRANS 1 MAXTRANS 255 TABLESPACE "SYSTEM" LOGGING PARTITION BY "ITPUB个人空间1Dr)r Zf6z,b
"RANGE ("ID" ) (PARTITION "P1" VALUES LESS THAN (100) PCTFREE 10 PCTUSED 4"
h];ol.t#@C*WY0 "0 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS"ITPUB个人空间Wy*?;lNB3L
" 1) TABLESPACE "TEST" LOGGING NOCOMPRESS, PARTITION "P2" VALUES LESS THAN ("ITPUB个人空间9p-_`p1j)Y YJz
"200) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL
F1_i3l,Qc0 "REELISTS 1 FREELIST GROUPS 1) TABLESPACE "TEST" LOGGING NOCOMPRESS )"
0cH;Y;Es0ngj0IMP-00003:遇到ORACLE错误959
Xl,_FI0ORA-00959:表空间'TEST'不存在
T/Rl$h-tQ0成功终止导入,但出现警告。
前面已经提到了9i中唯一的方法只有先手工创建表,然后使用IGNORE=Y执行导入。
但是对于
SQL> CONN YANGTK/YANGTK@YTK102
5v7kP
z6Ik0已连接。
!j-V+E4GO TNM
F0SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;
TABLESPACE_NAMEITPUB个人空间tL Cb+sJ
------------------------------ITPUB个人空间([){mj3qZK:}|V%@
SYSTEMITPUB个人空间z!s-Iz%b
UNDOTBS1
H:w1]8LaD0SYSAUXITPUB个人空间{ZZp$Sn M[
TEMPITPUB个人空间hm3s3dOd2_E5j
USERSITPUB个人空间[2Ke1X!|g]A%h{
EXAMPLE
?4E_p
r/M1Q8[_0YANGTK
u)d+~4gh0LOB_SPACE
已选择8行。
这时,如果直接导入也会报错:
E:\>imp yangtk/yangtk@ytk102 file=t_partition.dmp tables=t_partition
Import: Release
Copyright (c) 1982, 2005, Oracle. All rights reserved.
BQ)d$Iw4Y |-v0连接到: Oracle Database
6o;K#Z/}}zt2C0With the Partitioning, OLAP and Data Mining options
经由常规路径由EXPORT:V
警告:这些对象由TEST导出,而不是当前用户
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR字符集中的导入
'D3L2z]1G0.正在将TEST的对象导入到YANGTKITPUB个人空间-tAH-gKg b
.正在将TEST的对象导入到YANGTKITPUB个人空间
vFH1g.Y
IMP-00017:由于ORACLE错误959,以下语句失败:
V6@]IBv!Xk0 "CREATE TABLE "T_PARTITION" ("ID" NUMBER, "NAME" VARCHAR2(30)) PCTFREE 10 P"
"gxrD4Bj:C0 "CTUSED 40 INITRANS 1 MAXTRANS 255 TABLESPACE "SYSTEM" LOGGING PARTITION BY "ITPUB个人空间CLA'y X2B_l#](@
"RANGE ("ID" ) (PARTITION "P1" VALUES LESS THAN (100) PCTFREE 10 PCTUSED 4"
7?sM
L s:y0 "0 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS"
-e3F#l_~t&D7`am0 " 1) TABLESPACE "TEST" LOGGING NOCOMPRESS, PARTITION "P2" VALUES LESS THAN ("ITPUB个人空间4FE&qriZ1ez
"200) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL
h
f)lR][,K0 "REELISTS 1 FREELIST GROUPS 1) TABLESPACE "TEST" LOGGING NOCOMPRESS )"
5y#@%G1@1c8A0IMP-00003:遇到ORACLE错误959
|bBJT A-a.?FAe
y0ORA-00959:表空间'TEST'不存在ITPUB个人空间o%`DA&a/Y8D'p
成功终止导入,但出现警告。
但是由于
SQL> ALTER TABLESPACE YANGTK RENAME TO TEST;
表空间已更改。
下面就可以顺利导入:
E:\>imp yangtk/yangtk@ytk102 file=t_partition.dmp tables=t_partition
Import: Release
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ITPUB个人空间}.}+k4oqSa,Z
连接到: Oracle Database
t1ip4A2Pb0With the Partitioning, OLAP and Data Mining options
经由常规路径由EXPORT:V
警告:这些对象由TEST导出,而不是当前用户
已经完成ZHS16GBK字符集和AL16UTF16 NCHAR字符集中的导入ITPUB个人空间c
Yi,^S#q
p
.正在将TEST的对象导入到YANGTKITPUB个人空间`R_7G p4II
.正在将TEST的对象导入到YANGTK
#d'jR~^w[d0. .正在导入分区 "T_PARTITION":"P1"导入了 0行
PK
G5WUN0. .正在导入分区 "T_PARTITION":"P2"导入了 0行ITPUB个人空间|_Bvb9]
成功终止导入,没有出现警告。
导入后可以通过修改表空间名称的方法将表空间名称修改会原来的名称:
SQL> ALTER TABLESPACE TEST RENAME TO YANGTK;
表空间已更改。
通过这种方法的导入,可以解决包含多个段的表,无法通过正常方式进行表空间转换的问题。但是上面的方法只是提供了在不提前建表的方式下导入的一种可行性。
且不说修改表空间名称对于一个对外提供服务的数据库系统的影响,就是修改表空间这个动作本身,就未必比提前建表的工作量小多少。
考虑几种情况,如果表中包含多个分区,每个分区所在表空间不同,希望通过迁移将所有的分区都放到目标的表空间中。那么如果目标数据库中,只有目标表空间存在,且分区表每个分区对应的表空间都不存在的话,只能通过修改一次表空间名称,导入一个分区,再次修改表空间名称,再导入一个分区的方法来实现,效率和工作量都比较大。
而对于迁移表的时候,原分区表的分区所在表空间再目标数据库中存在,且导入的时候不希望导入到同名分区中,而是希望统一导入到目标表空间中。这时需要做的是首先将存在的表空间进行重命名,然后将目标表空间改为刚才的名称,导入分区后,还需要将目标表空间修改会来,再将源表空间名称恢复。总之,这个方法对于很多的迁移情况都是一个很费劲的操作。
而且,这个方法有一个局限性,就是一般用于9i或更低版本向
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG:
