【博主注:數據庫方面 ITPUB網站及博客內容非常豐富】
轉載來源 ITPUB 博客
經常有人會問:原來的數據在USERS表空間里面,我想把它IMP進APP表空間,我已經修改了目的用戶的默認表空間,為什么結果還是IMP到USERS表空間中了呢。
關於此問題,作如下解釋:
Oracle並沒有提供什么參數來指定要導入哪個表空間,數據默認將導入到原本導出時數據所在的表空間中,但是我們可以通過以下的方法來實現導入到不同的表空間。
下面是網絡上搜集的3個方法:
1.在IMP時候使用INDEXFILE參數
當給此參數指定了某一文件名,IMP的時候所有的index將不會直接導入到表空間中,而是在指定的文件中生成創建index的腳本。
然后用文本編輯器打開此文件,直接編輯腳本中的storage參數,修改為想要導入的表空間名稱。
然后重新執行IMP,使用INDEXS=n參數將除Index之外的Objects導入。
最后進入SQL*PLUS,直接運行剛才編輯的腳本,生成索引。
該方法適用於將index以及constraints導入指定的表空間。
2.改變目的用戶的默認表空間
這就是上面說的經常有人提問的方法。但是上述的問題之所以沒有成功,是因為缺少了下面的幾步。
首先,收回目的用戶的"UNLIMITED TABLESPACE"權限:
revoke unlimited tablespace from username;
其次,取消目的用戶在原數據導出表空間中的配額,這樣才能迫使IMP把數據導入到用戶的默認表空間中去。
然后,將希望導入的表空間設為目的用戶的默認表空間,並添加配額。
最后,執行IMP。
3。使用TOAD
TOAD是強大的Oracle數據庫管理軟件,是Quest出品的第三方軟件,我們可以使用其中的Rebuild Multi Objects工具來實現將多個Object轉移到指定的表空間。
於是我們可以不管三七二十一,先IMP,然后再用TOAD作事后的修改。
關於TOAD的使用,此處不作詳細解釋。
樓主成功方法,基本是方法2,但略有不同。
步驟1:新建表空間和臨時表空間(略),新建用戶。
create user orange identified by 12345678; grant resource,connect,dba to orange; revoke unlimited tablespace from orange; alter user orange default tablespace newtablespaces temporary tablespace newtablespacestemp; -- 設置默認表空間為新建的表空間 alter user orange quota unlimited on newtablespaces ; -- 設置對默認表空間/新表空間配合為無限制配額
步驟2:導出原表空和原用戶的數據表結構(不含數據)。
// 這是CMD命令 // rows=n 表示不導出數據 exp apple/pwd@dblink file=E:\dbtable.dmp rows=n // 導入數據表,更換表的所屬用戶 // tablespaces=newtablespaces 參數一定要加 imp orange/pwd@dblink file=E:\dbtable.dmp fromuser=apple touser=orange ignore=y tablespaces=newtablespaces
步驟3:導出原來的全部數據,導入到已經建好的表結構中。
// 導出原表空間和原用戶的數據庫表及數據 exp apple/pwd@dblink file=E:\dbtabledata.dmp // 導入數據到新用戶和表空間中 // tablespaces=newtablespaces 參數一定要加 imp orange/pwd@dblink file=E:\dbtabledata.dmp fromuser=apple touser=orange ignore=y tablespaces=newtablespaces
注意:
1.導入時如果不加參數 tablespace=XXX,總是報錯:ORA-01950:對表空間無權限。
2. 對臨時表空間不能執行配額操作,對永久表空間可以。