如今有一個場景需求,須要把在一臺服務器上某個用戶的對象所有遷移到另外一臺服務器。有如下幾個狀況:html
一、原用戶下的表分屬於不一樣的表空間(因爲維護人員在過程當中修改過用戶的默認表空間)數據庫
二、原用戶的數據庫量過大,導出慢。服務器
三、遷出、遷入的oracle版本爲11goracle
針對以上狀況,遷移方法步驟以下:ide
一、因爲用戶下的數據庫過大,故建議使用expdp方式來進行導出,須要先去創建一個DIRECTORY,用於放置導出的文件位置工具
二、因爲是要導出某個用戶下的所有對象,語句寫法參考以下:post
expdp PNC_GAS/PNC_GAS@ORCL schemas=PNC_GAS dumpfile=ncgas20180116.dmp DIRECTORY=dbbackup
三、因爲被導出的用戶下的表可能分屬於不一樣表空間,故須要先查詢原用戶的表到底分屬哪些表空間,查詢語法以下:網站
select distinct tablespace_name 所使用表空間 from user_tables;
須要注意的是,以上語句是須要先登陸到原用戶後再去執行命令查詢url
四、而後在被遷入的服務器上創建一個新用戶,創建一個新的表空間並指定爲新用戶的默認表空間(這裏新建的用戶名能夠和原用戶保持一致)spa
五、新定義的表空間須要注意被導入的數據佔據的空間大小,最好留足足夠空間。如下命令爲新建一個最大爲32G,當數據增長時默認以10m的大小擴張
CREATE TABLESPACE GAS DATAFILE 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\GAS.DBF' SIZE 32768M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED LOGGING ONLINE EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;
建議使用toad for oracle工具去建用戶和表空間,可視化操做很方便
六、創建完新用戶和新表空間後,須要執行導入命令。如下命令支持將同一個用戶不一樣表空間的數據導入至同一用戶的同一表空間
IMPDP GAS/GAS@ORCL DIRECTORY=dbbackup schemas=GAS dumpfile=YAGAS20180116.dmp REMAP_TABLESPACE=USERS:YA_GAS_WEB REMAP_TABLESPACE=SYSTEM:YA_GAS_WEB REMAP_TABLESPACE=GAS:YA_GAS_WEB REMAP_TABLESPACE=YAN_GAS:YA_GAS_WEB
以上命令把原用戶下4個表空間下的對象所有導入至新用戶的同一表空間下
七、最後,須要驗證新用戶下的這個表空間下的表及數量是否與原用戶下不一樣表空間的表及數量和相同。查詢各個表空間的表語句以下:
select table_name 表名 ,tablespace_name 所使用表空間 from user_tables where tablespace_name='您要查詢的表空間名'
須要注意的是:該命令也是在登陸了所要查詢的用戶以後去執行的。查詢的是當前登陸用戶的某個表空間下的表信息
我在經歷了以上步驟後,驗證了新舊用戶及表空間下的表及其餘對象,發現數據未出現丟失,經實際驗證以上步驟操做有效!
補充:以上步驟是基於對數據導出及導入的理解探索式獲得結果,過程當中遇到了一些錯誤,在這裏作下分享:
一、導入命令時,默認導入表的表空間大小不足,會報如下錯誤,當把表空間改大之後命令會繼續執行起走。
如下錯誤是我在沒有指定命名空間的狀況下出現的,可參考語句:
expdp PNC_GAS/PNC_GAS@ORCL schemas=PNC_GAS dumpfile=ncgas20180116.dmp DIRECTORY=dbbackup
二、expd命令默認會把原用戶與新用戶相同表空間的對象導入過去:意思是在不特殊指定表空間狀況下,參考如下語句
IMPDP YA_ZC/ya_zc@ORCL DIRECTORY=dbbackup schemas=YA_ZC dumpfile=yazc201801162144.dmp REMAP_TABLESPACE=GAS:YAN_GAS
該語句把原用戶表空間爲GAS下的對象遷移到新用戶的YAN_GAS表空間下;
該語句同時會把原用戶自己在表空間名爲YAN_GAS下的對象自動導入到新用戶下的YAN_GAS表空間中;執行了以上命令後,再去執行如下命令
IMPDP YA_ZC/ya_zc@ORCL DIRECTORY=dbbackup schemas=YA_ZC dumpfile=yazc201801162144.dmp REMAP_TABLESPACE=YAN_GAS:YAN_GAS
會出現如下截圖的警告:
這就是由於上一個命令已經把原表空間YAN_GAS下的對象已遷移到了新表空間YAN_GAS之下了。