Oracle

將模式導入新的或不同的表空間

  • January 31, 2017

是否有一種便捷的方法可以使用單個新表空間或與數據來源不同的表空間將模式導入 Oracle 11gR2?

例如,我從 OLDDB 導出了 BLOG_DATA,其中所有使用者數據都儲存在 USERS 表空間中。

在 NEWDB 上,我想導入 BLOG_DATA 模式,但將使用者對象儲存在專門為此使用者創建的 BLOG_DATA 表空間中。

我創建了 BLOG_DATA 使用者,創建了 BLOG_DATA 表空間並將其設置為該使用者的預設表空間,並添加了適當的無限製配額。

CREATE TABLESPACE blog_data DATAFILE SIZE 1G;

CREATE USER blog_data IDENTIFIED BY secretpassword DEFAULT TABLESPACE blog_data QUOTA UNLIMITED ON blog_data;

GRANT connect,resource TO blog_data

架構是從 OLDDB 導出的,類似於

exp blog_data/secretpassword@OLDDB file=blog_data.dmp 

在閱讀了下面菲爾的出色回答後,我發現自己想知道

由於數據除了預設表空間(使用者擁有配額的唯一表空間)外沒有其他地方可去,這是否會有效地強制 imp 將所有使用者對象放在該預設表空間中?

imp blog_data/secretpassword@NEWDB file=blog_data.dmp

那麼這會將整個 blog_data 模式放在 NEWDB 上的 blog_data 表空間中嗎?是否有任何理由為什麼這不起作用或者我會遇到某些對像等問題?

更新:

我做了一個快速測試,發現情況確實如此。Imp將對象放置在該使用者的預設表空間中,前提是它不能將其放置在原始表空間中(例如,該表空間不存在)。完整解釋:http ://www.dolicapax.org/?p=57

儘管如此,我認為像 Phil 建議的那樣使用 Data Pump 可能是首選。

imp使用 oracle實用程序導入時,實際上不可能指定不同的表空間。但是,作為一種解決方法,您可以通過ROWS=N導入表空間來預先創建USERS表,然後alter table mytable move tablespace BLOG_DATA;為每個表將它們移動到新表空間,然後使用IGNORE=Y參數再次導入以忽略表創建錯誤並導入所有的數據。

如果數據是使用 Data Pump ( expdp) 導出的,(順便說一句,現在每個人都應該使用它,而不是舊的遺留exp/imp實用程序),您可以使用參數輕鬆導入另一個表空間REMAP_TABLESPACE

例如:

impdp scott/tiger@ZOMG file=blog_data.dmp directory=mydir remap_tablespace=USERS:BLOG_DATA

引用自:https://dba.stackexchange.com/questions/25855