客户反映一个schema数据导入之后一直没有自动收集统计信息,而之前导入的另外一个schema
却是正常的,手动收集却没有问题。因为oracle收集统计信息有前提条件是数据变化量是否超过
10%,否则不会收集,于是查看DBA_TAB_MODIFICATIONS,内容如下:
TABLE_OWNER TABLE_NAME INSERTS TIMESTAMP
ASMMESDB BKTBLEMSEQUIPMENTSTATE 5914983 2016-04-06 22:00:02
ASMMESDB BKTBLSYSEVENTLOG 6010267 2016-04-06 22:00:02
ASMMESDB BKTBLWIPFUTUREHOLD 137654 2016-04-06 22:00:02
ASMMESDB BKTBLWIPLOTPROPERTY 38956193 2016-04-06 22:00:02
ASMMESDB BKTBLWIPLOTSTATE 11615110 2016-04-06 22:00:02
从上面输出来看,的确数据量便变化很大,而且时间戳也是客户导入数据的时间戳,若是自动收集统计信息,那么
这张表数据应该会被purge才对。难道自动收集统计信息job没有启动?查看job运行历史和调度情况都发现是正常
的,而且客户出示的另外一个schema的确在正常收集,时间点都是晚上,说明址有这个schema因为某种原因没有被
收集,忽然想起若是这些表的统计信息被锁定,那么oracle是不会收集统计信息的,再次检查这些表的统计信息
dba_tab_statistics情况,发现这些表的stattype_locked的确是ALL,表明这些统计信息被锁定了,告知用户统计
信息不能自动收集原因,客户同意诊断结果,但是坚持说没有人为锁定,而且这个db只有他一个人使用,也不可能
有其他DBA修改,仍要求继续诊断原因。既然客户不承认人为修改,那么需要是否执行过lock操作,以及什么时侯
这些表被lock的,经过测试发现sys.wri$_optstat_tab_history,sys.wri$_optstat_opr 会记录统计信息表操作
类型和lock的时间,于是检查客户环境输出,的确发现了这些操作,时间居然和imp时间一样,于是让客户提供当
时操作历史,
1.先到如table
imp system/xxxx fromuser=whitehouse touser=whitehouse1 BUFFER=1024000 commit=Y ignore=y rows=N indexes=n CONSTRAINTS=n file=whitehouse.dmp log=imp_whitehouse1_object.log
2.再导入data
imp system/xxxx fromuser=whitehouse touser=whitehouse1 BUFFER=10240000 ignore=y rows=y commit=y indexes=n CONSTRAINTS=n file=whitehouse.dmp log=imp_whitehouse1_data.log
3.最后导入index和constraint
imp system/xxxx fromuser=whitehouse touser=whitehouse1 BUFFER=1024000 commit=Y ignore=y rows=N indexes=y CONSTRAINTS=y file=whitehouse.dmp log=imp_whitehouse1_object_1.log
操作历史里面第一步是rows=N先导入metadata,然后导入数据,经过测试验证果然能重现问题,于是查阅文档rows=N,
官方有如下解释:If ROWS=n, then statistics for all imported tables will be locked after the import operation is finished.