情境描述:
1、做一個從UAT到PRD的Schema遷移,UAT環境有sys使用者,PRD環境沒有sys使用者,由於許可權限制,沒辦法使用expdp/impdp,只好選擇exp/imp命令;
2、UAT和PRD環境的TNS已明確,假設UAT環境的TNS配置為:TNS_UAT,PRD環境的配置為:TNS_PRD;
3、PRD環境的DB USER已建好(其他人建好提供的),和UAT環境的是一樣的,假設都為user/pwd;
4、UAT和PRD環境,user使用者的資料表空間名不同,假設UAT環境資料表空間為:TBSP_UAT,PRD環境為TBSP_PRD;
當兩個user的資料表空間不同時無法直接exp/imp(不妨嘗試一下),所以找了以下兩種解決辦法:
方法一:
1、使用exp命令從UAT庫匯出user使用者資料檔案Schema_USER_BAK.dmp,命令格式為:
EXP user/pwd@TNS_UAT BUFFER=64000 FILE=D:\SCHEMA_USER_BAK.dmp OWNER=USER(參數按需添加)
2、使用Notepad++等文本工具開啟檔案,尋找出其中的資料表空間資訊,將SCHEMA_USER_BAK.dmp檔案中的UAT環境資料表空間名TBSP_UAT全部替換PRD對應的資料表空間名TBSP_PRD,修改後的檔案另存新檔SCHEMA_USER.dmp;
3、然後使用imp命令將SCHEMA_USER.dmp檔案匯入給PRD環境的user使用者,命令格式為:
IMP user/pwd@TNS_PRD BUFFER=64000 FILE=D:\SCHEMA_USER.dmp FROMUSER=USER TOUSER=USER
4、OK,方法一完成。
但是,假設UAT環境的user使用者的資料量很大,匯出的dmp檔案通常有3GB、4GB甚至更大,此時就無法通過Notepad++或者UE等編輯器直接去編輯替換資料表空間資訊了,方法一就行不通了,所以這時有了方法二。
方法二:
1、修改UAT環境user使用者的資料表空間名為PRD環境對應的資料表空間名:(修改之前記得備份)
ALTER TABLESPACE TBSP_UAT RENAME TO TBSP_PRD
2、匯出UAT環境user使用者:
EXP user/pwd@TNS_UAT BUFFER=64000 FILE=D:\SCHEMA_USER.dmp OWNER=USER
3、將匯出的dmp檔案匯入給PRD環境的user使用者:
IMP user/pwd@TNS_PRD BUFFER=64000 FILE=D:\SCHEMA_USER.dmp FROMUSER=USER TOUSER=USER
4、還原UAT環境user使用者的資料表空間名:
ALTER TABLESPACE TBSP_PRD RENAME TO TBSP_UAT
5、OK,方法二完成。
上述兩種方法親測有效,但是可能會有特殊情況,至於特殊情況是什麼,那就不好說了。所謂特殊情況特殊處理,所以還得各位小夥伴多多研究了。