如果constraint=n,这样的话,数据就会乱了,可能会出现大量重复导入的重复数据,还有可能会出现因为sequence造成的id(主键)已经存在了的,但相同id的数据就导不进来了(由于sequence的原因,这些数据实际上并不是和已经存在的id相同内容的记录)。
我试了通过在脚本中加入alter table table_name disable all triggers;
对于少量的导入可以解决了这个问题,但是我脚本中写了个for循环,可能是每次执行的任务多些,总会有少量的文件导入时报错了:
IMP-00058: ORACLE error 4098 encountered
ORA-04098: trigger ZHANGSAN.TABLENAME_TRIG' is invalid and failed re-validation
Import terminated successfully with warnings.
脚本内容如下:
#!/bin/bash
#
filepath='/data/expdb/';export filepath
scripfile='/home/oracle/tools/impdb/';export scripfile
#get imp date from date.txt
logdates=`awk ' { print $1 } ' $scripfile'date.txt'`
for logdate in $logdates
do
tables='tablename'
sqlplus username/username<
spool trigger_status_1.txt
select trigger_name,status from user_triggers;
spool off
alter trigger TABLENAME_TRIG disable;
spool trigger_status_2.txt
select trigger_name,status from user_triggers;
spool off
exit
EOF
cd $filepath
tar -zxvf $tables$logdate'.dmp.tgz'
cd $ORACLE_HOME/bin/
./imp username/password buffer=2048000 file=$filepath$tables$logdate'.dmp' ignore=y commit=y indexes=n statistics=none filesize=1G tables=$tables log=$filepath'/log/imp_'$tables$logdate'.log' fromuser=username touser=username
done
下面是其中的date.txt文件内容:
20061201
20061202
20061203
20061204
20061205
20061206
20061207
20061208
20061209
20061210
20061211
20061212
20061213
20061214
20061215
20061216
20061217
20061218
20061219
20061220
20061221
20061222
20061223
20061224
20061225
20061226
20061227
20061228
20061229
20061230
20061231
我的理解是,每个dmp文件大小不一样,在一个dmp文件执行时,先将触发器状态变为disable,但是就在执行imp导入语句时,更小的dmp文件imp动作结束,create触发器的动作将trigger状态又变为了enable,此时再执行该imp动作就会报出上述错误。
呵呵,不知道上面描述的够不够清楚,我想请教各位,这种情况有没有办法避免总是将trigger状态变为enable,从而影响正在执行的其它imp动作。因为文件比较多,不太可能一个一个的手工执行,请大侠们指点一下,如果上面我的理解不正确,也请不吝赐教,多谢哈。。。
[本帖最后由 okayleo 于 2008-11-2 00:25 编辑]