解決imp匯入時,使用源DB中表空間名的問題

ljm0211發表於2012-07-02

10g裡可以使用remap_schema和remap_tablespace顯示指定,9i的話需要動點腦筋了~


總的來說,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,進行資料轉移。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-734365/,如需轉載,請註明出處,否則將追究法律責任。

相關文章