发布网友 发布时间:2022-04-13 13:46
共1个回答
热心网友 时间:2022-04-13 15:16
如何将exp出来的数据IMP到不同表空间前几天部门经理在IMP数据时想将数据导入到不同于原系统的表空间去,却发现怎么也不成功,数据还是导入到原来的表空间。我看了一下,他在新系统上创建的这个用户授予了connect,RESOURCE,dba等角色,而且这个用户有UNLIMITEDTABLESPACE这个系统权限。总的来说,Oracle并没有提供什么参数让你将数据导入到指定的表空间中,数据默认还是导入到它原来所在的表空间。你可以用IMP的SHOW参数可以看到其创建脚本中会指定TABLESPACE参数,而这个值是原系统该对象所在的表空间,跟你用户默认的表空间是没有关系的,如下:"CREATETABLE"EMPLOYEES"("EMPLOYEE_ID"NUMBER(6,0),"FIRST_NAME"VARCHAR2""(20),"LAST_NAME"VARCHAR2(25)NOTNULLenable,"email"VARCHAR2(25)NOTNU""LLenable,"PHONE_NUMBER"VARCHAR2(20),"HIRE_date"dateNOTNULLenable,"""JOB_ID"VARCHAR2(10)NOTNULLenable,"SALARY"NUMBER(8,2),"COMMISSION_PC""T"NUMBER(2,2),"MANAGER_ID"NUMBER(6,0),"DEPARTMENT_ID"NUMBER(4,0))""PCTfree10PCTUSED40INITRANS1MAXTRANS255STORAGE(INITIAL65536freeLIS""TS1freeLISTGROUPS1)TABLESPACE"example"LOGGINGNOCOMPRESS"..正在跳过表"EMPLOYEES""CREATETABLE"JOBS"("JOB_ID"VARCHAR2(10),"JOB_TITLE"VARCHAR2(35)NOTNU""LLenable,"MIN_SALARY"NUMBER(6,0),"MAX_SALARY"NUMBER(6,0))PCTfree1""0PCTUSED40INITRANS1MAXTRANS255STORAGE(INITIAL65536freeLISTS1free""LISTGROUPS1)TABLESPACE"example"LOGGINGNOCOMPRESS"..正在跳过表"JOBS"看其中的红色部分,如果在原系统中你创建EMPLOYEES指定的表空间是example,而此时该用户的默认表空间是USERS,那么exp的dmp文件里是example,而不是USERS,当然如果你建表时没特意指定表空间,那么默认的就会是用户的默认表空间。所以对于这个问题的解决方法是:1.如果目标系统中不存在跟原系统一样的表空间,这个一样,是指存储你要导入的数据的表空间如:你要导入的数据在原系统中是存放在USERS表空间的,而在目标系统并不存在这个表空间,那么你在导入数据时数据就会导入到目标系统中该用户的默认表空间2.如果存在一样的表空间,则在目标系统中:a)REVOKEUNLIMITEDTABLESPACEFROM该USERb)取消该用户在原系统导出数据所在表空间的配额:SQL>alterUSERXXXQUOTA0ONOLD_TABLESPACEc)将你要存储导入数据的表空间设为该用户默认的表空间d)添加该用户在其默认表空间中的配额:SQL>alterUSERXXXQUOTAUNLIMITEDONNEW_TABLESPACE3.其他方法:a)可以用IMP的SHOW=Y将创建脚本SPOOL出来,然后修改其创建脚本中的TABLESPACE,将其修改成你所需要的表空间。b)用第三方工具,比如TOAD,产生其创建脚本,然后修改TABLESPACE值,然后导入的时候加IGNORE=Y进行导入。c)可以先导入数据,然后用TOAD的RebuildMultiObjects,进行数据转移。