impdp做資料匯入時約束和觸發器引起資料匯入後應用故障

vmsysjack發表於2013-11-12
使用資料泵匯入資料,匯入過程中沒有任何錯誤,匯入的記錄數完全正常,但應用就是無法使用,取不到資料,找了很久都沒找到原因,最後,發現是由於序列的問題引起的,發現匯出和匯入的值不一樣,通過與開發溝通才明白,因為在匯入資料時要對一些欄位定義做了修改,所以先匯入空表,然後再匯入資料的,在向表插入資料時會插入序列,而序列是由觸發器來產生的,從而導致兩邊的序列值不一致,引起記錄的值有差異,找到原因就好辦了,在匯入資料前關閉所有的約束和觸發器,匯入資料成功後,再開啟約束和觸發器,連線應用測試,一切ok.

在目標庫上建立資料泵目錄

create directory dump_dir as '/oracle/ppp';
grant read,write on directory dump_dir to user;

在源庫上匯出資料:
expdp system/oracle directory=dump_dir dumpfile=user.dmp schemas=user logfile=user.log

匯出表結構:
impdp system/oracle directory=dump_dir dumpfile=user.dmp sqlfile=user.sql logfile=userimp.log

在目標庫上建立表
SQL>@/oracle/ppp/user.sql

匯入資料前關閉約束和觸發器:
SQL>set heading off
SQL>select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints;
SQL>alter table table_name disable constraint constraint_name;

SQL>select 'alter trigger '||trigger_name||' disable;' from user_triggers;
SQL>alter trigger trigger_name disable;

匯入資料:
export ORACLE_SID=SID
$impdp system/oracle directory=dump_dir dumpfile=javaoanew.dmp table_exists_action=append logfile=javaoaimpnew.log

匯入資料後開啟約束和觸發器:
SQL>set heading off
SQL>select 'alter table '||table_name||' enable novalidate constraint '||constraint_name||';' from user_constraints;
SQL>alter table table_name enable novalidate constraint constraint_name;

SQL>select 'alter trigger '||trigger_name||' enable;' from user_triggers;
SQL>alter trigger trigger_name enable;

連線應用測試,一切OK.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29099879/viewspace-776421/,如需轉載,請註明出處,否則將追究法律責任。

相關文章