前几天在IMP数据时想将数据导入到不同于原系统的表空间去,却发现怎么也不成功,数据还是导入到原来的表空间。
我看了一下,他在新系统上创建的这个用户授予了CONNECT,RESOURCE,DBA等角色,而且这个用户有UNLIMITED TABLESPACE这个系统权限。
总的来说,Oracle并没有提供什么参数让你将数据导入到指定的表空间中,数据默认还是导入到它原来所在的表空间。你可以用IMP 的SHOW参数可以看到其创建脚本中会指定TABLESPACE参数,而这个值是原系统该对象所在的表空间,跟你用户默认的表空间是没有关系的,如下:
“CREATE TABLE “EMPLOYEES” (“EMPLOYEE_ID” NUMBER(6, 0), “FIRST_NAME” VARCHAR2″
“(20), “LAST_NAME” VARCHAR2(25) NOT NULL ENABLE, “EMAIL” VARCHAR2(25) NOT NU”
“LL ENABLE, “PHONE_NUMBER” VARCHAR2(20), “HIRE_DATE” DATE NOT NULL ENABLE, “”
“JOB_ID” VARCHAR2(10) NOT NULL ENABLE, “SALARY” NUMBER(8, 2), “COMMISSION_PC”
“T” NUMBER(2, 2), “MANAGER_ID” NUMBER(6, 0), “DEPARTMENT_ID” NUMBER(4, 0)) “
“PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELIS”
“TS 1 FREELIST GROUPS 1) TABLESPACE “EXAMPLE” LOGGING NOCOMPRESS”
. . 正在跳过表 “EMPLOYEES”
“CREATE TABLE “JOBS” (“JOB_ID” VARCHAR2(10), “JOB_TITLE” VARCHAR2(35) NOT NU”
“LL ENABLE, “MIN_SALARY” NUMBER(6, 0), “MAX_SALARY” NUMBER(6, 0)) PCTFREE 1″
“0 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREE”
“LIST GROUPS 1) TABLESPACE “EXAMPLE” LOGGING NOCOMPRESS”
. . 正在跳过表 “JOBS”
看其中的红色部分,如果在原系统中你创建EMPLOYEES指定的表空间是EXAMPLE,而此时该用户的默认表空间是USERS,那么EXP的DMP文件里是EXAMPLE,而不是USERS,当然如果你建表时没特意指定表空间,那么默认的就会是用户的默认表空间。
所以对于这个问题的解决方法是:
1.如果目标系统中不存在跟原系统一样的表空间,这个一样,是指存储你要导入的数据的表空间
如:你要导入的数据在原系统中是存放在USERS表空间的,而在目标系统并不存在这个表空间,那么你在导入数据时数据就会导入到目标系统中该用户的默认表空间
2. 如果存在一样的表空间,则在目标系统中:
a) REVOKE UNLIMITED TABLESPACE FROM 该USER
b) 取消该用户在原系统导出数据所在表空间的配额:
SQL>ALTER USER XXX QUOTA 0 ON OLD_TABLESPACE
c) 将你要存储导入数据的表空间设为该用户默认的表空间
d) 添加该用户在其默认表空间中的配额:
SQL>ALTER USER XXX QUOTA UNLIMITED ON NEW_TABLESPACE
3. 其他方法:
a) 可以用IMP的SHOW=Y将创建脚本SPOOL出来,然后修改其创建脚本中的TABLESPACE,将其修改成你所需要的表空间。
b) 用第三方工具,比如TOAD,产生其创建脚本,然后修改TABLESPACE值,然后导入的时候加IGNORE=Y进行导入。
c) 可以先导入数据,然后用TOAD的Rebuild Multi Objects,进行数据转移。
相关文章