sqlldr入库是常用方式之一,也是最常见的。
我已经处理类似案例多次了,但是今天这次耗时最长。
分析原因:
1.入库报错(比如:没有分区,入库值的精度不对,列名少了一个等等)。
2.io压力大(索引单块读比较多,db file sequential read)
3.机器内存足够,但是oracle的sga不够,或者说sga_target pga_aggrent_target memry_xxxxx设置不对。
4.sqlldr本身进程多,多数为hang 的进程。
5.查看网络是否完好,SQL*Net more data from client
解决方案:
1.分析awr检查数据库压力,top5看看
Top 5 Timed Foreground Events
Event | Waits | Time(s) | Avg wait (ms) | % DB time | Wait Class |
---|---|---|---|---|---|
db file sequential read | 1,484,413 | 14,383 | 10 | 51.51 | User I/O |
DB CPU | 12,478 | 44.69 | |||
SQL*Net more data from client | 5,655,790 | 444 | 0 | 1.59 | Network |
cursor: pin S wait on X | 5,343 | 91 | 17 | 0.32 | Concurrency |
enq: CR - block range reuse ckpt | 8,641 | 70 | 8 | 0.25 | Other |
2.看看alert日志,看看是不是因为数据库的参数限制了入库进程。比如我上次遇到process满了,进程不够。
或者报错,导致数据库不可用,所以参数堆积。
3.禁用索引,降低db file sequential read。
4.ethtool 检查是否千兆网卡。
注:逐渐发现问题后,再补充