将exp逻辑备份文件导入到备库中时出现了错误,相关错误信息如下:
IMP-00017: 由于 Oracle 错误 6550, 以下语句失败:
"DECLARE SREC DBMS_STATS.STATREC; BEGIN SREC.MINVAL := '00730068006F0075006"
"C0075'; SREC.MAXVAL := '9F9A00200020514B'; SREC.EAVS := 4; SREC.CHVALS := D"
"BMS_STATS.CHARARRAY(utl_raw.cast_to_varchar2('00730068006F0075006C0075'),'N"
"fS[',utl_raw.cast_to_varchar2('4E5400200020664B'),utl_raw.cast_to_varchar2"
"('4ED8002000204FCA'),'N貍*',utl_raw.cast_to_varchar2('4EFB002000205170'),'N"
"鸒','O
……
IMP-00003: 遇到 ORACLE 错误 6550
ORA-06550: 第 1 行, 第 4836 列:
PLS-00103: 出现符号 "朒ag?"在需要下列之一时:
( - + case mod new not
null others
avg
count current exists max min prior sql stddev sum variance
execute forall merge time timestamp interval date
pipe
这是个很常见的导入警告,通常与数据库/客户端版本有关。比如这里,源数据库和目标数据库版本都是10.2.0.4,但导出的时候使用了10.2.0.1的客户端:
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件 在别的项目中,还遇到过从10.2.0.2数据库中导入到10.2.0.4目标库时出现了同样的问题,不管imp/exp使用了什么版本。
解决办法,就是在exp或imp时加上一个参数来禁用统计信息的导出/导入: statistics=none
那么,不导入统计信息会有什么影响呢。其实在oracle 10g以后,默认定时采集统计信息,可以在dba_scheduler_jobs视图中查询到该任务:GATHER_STATS_JOB。并且可以在dba_scheduler_job_run_details中看到相应的执行情况。
手动采集统计信息:在sys用户中执行dbms_scheduler.run_job('GATHER_STATS_JOB') 存储过程(等价于执行dbms_stats.gather_database_stats_job_proc);使用dbms_stats包中的gather_xxx_stats来采集。停用定时采集统计信息的任务:DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB')
oracle 10g中修改自动采集统计信息的时间策略:通过sys用户登录执行存储过程dbms_scheduler.set_attribute来修改,例如
dbms_scheduler.set_attribute('GATHER_STATS_JOB','SCHEDULE_NAME','MAINTENANCE_WINDOW_GROUP')
dbms_scheduler.set_attribute('WEEKEND_WINDOW','DURATION','+000 05:00:00')
查询:
selectd.window_name,d.repeat_interval,d.duration
fromDBA_SCHEDULER_JOBS a,DBA_SCHEDULER_WINDOW_GROUPS b,DBA_SCHEDULER_WINGROUP_MEMBERS c,DBA_SCHEDULER_WINDOWS d
wherea.job_name='GATHER_STATS_JOB'
anda.schedule_name=b.window_group_name
andb.window_group_name=c.window_group_name
andc.window_name=d.window_name
unionall
selectd.window_name,d.repeat_interval,d.duration
fromDBA_SCHEDULER_JOBS a,DBA_SCHEDULER_WINDOWS d
wherea.job_name='GATHER_STATS_JOB'
anda.schedule_name=d.window_name;