1. 程式人生 > >imp 命令一個使用者匯入到另一個使用者,修改相應表的表空間

imp 命令一個使用者匯入到另一個使用者,修改相應表的表空間

假設資料使用者USER1使用預設表空間TS1,使用者USER2使用預設表空間TS2,現在將USER1的資料匯入到USER2,要求使用表空間TS2。通過IMP命令引數tablespaces指定表空間是不行的,其他複雜方法要修改配額什麼的,麻煩。整理了一下,大致有以下幾種方法可以:
1. 有一個簡單的方法,適用於資料比較少的情況:直接使用UltraEdit打方DMP檔案,預設是16進位制,切換成文字模式,將裡面的:TABLESPACE "TS1"全部替換成TABLESPACE "TS2",然後再匯入,不用加什麼tablespaces=TS2之類的引數即可,當然加了也無所所謂。
C:\>IMP USER2/USER2 log=C:\plsimp.log file=D:\database\USER1.dmp fromuser=USER1 touser=USER2 ignore=yes tablespaces=TS2

不過有個缺點,如果DMP檔案有幾百M甚至幾G,嘿嘿嘿嘿,不知道UltraEdit有啥反應?

2. 還有另外一種比較好的方法。基本思路都是先從USER1匯出表結構(DMP或者SQL指令碼),然後在USER2使用者下建立空的資料庫表(如果是DMP,則參見方法1;如果是SQL指令碼,則稍作修改後以USER2使用者執行即可),再將包括資料的DMP匯入,注意要設IGNORE=Y,並指定FROMUSER和TOUSER。具體實現方法為:
(1)先用工具匯出USER1的表結構(不要匯出CHECK和FK,特別是FK!),TOAD和PL/SQL都有此功能。PL/SQL Developer匯出表結構:Tools-->Export User Objects(匯出使用者物件) -->選擇要匯出的表(包括Sequence等)-->.sql檔案,匯出的都為sql檔案。或者使用imp的indexfile選項生成表結構的SQL指令碼。
(2)在USER2使用者下建立相同的表結構
(3)匯入完整的資料

PS:
PL/SQL Developer工具操作步驟:
(1)匯出表結構:
Tools-->Export User Objects(匯出使用者物件) -->選擇要匯出的表(包括Sequence等)-->.sql檔案,匯出的都為sql檔案
(這一步也可以匯出一個只包括表結構的DMP檔案。)

(2)匯出表資料:
Tools-->Export Tables-->選擇表,選擇SQL Inserts-->.sql檔案
(這一步也可以匯出一個包括表結構和資料或者只有資料沒有表結構圖的DMP檔案。)

(3)匯入表結構:
執行剛剛匯出的sql檔案,記住要刪掉table前的使用者名稱,比如以前這表名為sys.tablename,必須刪除sys
(如果是隻包括表結構的DMP檔案,則使用UltraEdit修改表空間,再匯入。如方法1)

(4)匯入表資料:
執行剛剛匯出的sql檔案
(如果是DMP檔案,則直接匯入即可,注意要設IGNORE=Y,並指定FROMUSER和TOUSER。)

IMP命令操作步驟:
首先:exp user/pw file=file.dmp owner=yourUser1
然後:imp user/pw file=file.dmp indexfile=xxxx.sql fromuser=yourUser1 touser=yourUser2
隨後:修改xxxx.sql中的關於有表空間設定的地方為新的表空間,並去掉相關的註釋(rem),然後執行xxxx.sql建立相關物件。
最後:imp user/pw file=file.dmp fromuser=yourUser1 touser=yourUser2 ignore=y