-
…
…
我们的生命先后顺序
…
未来的每一步一脚印
踏着彼此梦想前进
…
相知 相惜 相依为命
…
… …挺喜欢这几句歌词
我们成长中的最多的那一部分时间大概都是和同学、同事一起度过的
我们刷牙、洗脸、装扮 ... , 我们宽容、乐观、上进 ...
我们总是把最好的那一面留给家以外甚至是不喜欢的的地方或人
那我们当然应该留着更大的热情宽容乐观和理解给身边那些更重要的人 -
oracle imp过慢的解决办法 - [ORACLE]
Jan 11, 2011
性能测试或是压力测试工作的核心是测试环境的准备,其中就经常涉及到大数据量的导入导出。对于一个超过100GB的数据量的imp工作,完全参照生产环境的标准进行正规imp导入,有时候是很痛苦的事情。
测试环境涉及到大数据量的数据导入工作,其实是有一些好的经验的,尤其是在项目关键阶段,我们必须合理利用测试环境数据库安全级别相对较低的特点。
以测试环境如下条件的数据导入为例:
- Oracle 11g RAC archive mode,归档模式
- Oracle 11g RAC 仅有两块磁阵盘存储数据,读写性能一般
- 有一个分区表有超过300GB的数据需要imp导入,每个分区有约5000万条记录
- 这个表使用range partition(3天1个分区),并且有local索引
周五拿到dmp数据文件的时候,下班前就开始imp,后台运行后就闪人了,结果周末两天加上周一共出现了如下几个问题:
- imp时没有设置buffer大小,结果导致报"imp-"错误提示,imp操作中断
- imp时RAC各节点平均每2分钟产生1GB的archive log,归档空间扛不住,500GB的归档空间一晚上就满了,imp中断
- 存放数据的表空间只有一个datafile,且并非bigfile,满了,imp又中断了
- imp的速度很慢。两天了,基本上就见着盘很忙,没怎么见着数据成功导入的日志记录
- 可能因为IO的性能确实很差,通过nmon,vmstat观察到的io表现,每秒写的速度不到20MB,Disk busy已经显示101%,XP20000的盘怂得真纯爷们!
后来,通过如下手段显著优化了imp的时间:
- change RAC archive mode to noarchivelog mode
- alter table t1 nologging;
- alter table drop index
- imp使用更大的buffer
原先三天没有导完的数据,现在半天就搞定了,而且剩下了很多维护archivelog的成本。metalink上有一篇专门介绍imp调优的文章---《Tuning Considerations When Import Is Slow [ID 93763.1]》。
这里面讲到以下有用的知识点,通过以下几个方面的调整,将会显著提高imp的效率:
1. System级别的改变
- 创建使用一个大的回滚段替代原有多个小的回滚段,大小是待导入表大小的50%足够。
- 数据库修改为NOARCHIVELOG mode
- 创建几组大的redo log size,越大越好,因为redolog越大,日志切换的越少。当看到alert.log里有类似 'Thread 1 cannot allocate new log, sequence 17, Checkpoint not complete'提示信息,这说明你需要更大的redo log size。
- 如果条件允许,最好将rollback,datafile以及redo log file放在不同的磁盘上,避免IO争抢。
- 确保imp操作时,没有其他IO操作,减少资源争抢。
- 确保数据字典表里没有统计信息
- 检查sqlnet.ora文件里,确保TRACE_LEVEL_CLIENT = OFF
- 提高DB_BLOCK_SIZE的大小,这个需要全面考量,一旦创建db将不可再修改
2.初始化参数init.ora
- 设置LOG_CHECKPOINT_INTERVAL的值大于redo log的数目,减少checkpoints到最小。
- 增加SORT_AREA_SIZE大小,如果主机剩余内存足够,可设置5~10倍默认大小。当系统出现paging及swaping,则设置过高
- 增加db_block_buffers and shared_pool_size大小
个人感觉, 这几个参数可能真正对imp性能影响没有显著影响,默认设置应该足够。只是没有实际测试过。
3. imp参数的使用
- 使用COMMIT=N,这意味着整个表imp操作结束后进行commit操作。默认是Y,也就是每个buffer结束后commit一次。这意味点背将会前功尽弃!
- buffer设置大点,一般来说200M就不小了
- 使用INDEXES=N,导入表数据的时候不更新index,待数据导入后重新维护索引。显著提高imp的效率
哪些能显著提高imp的效率?哪些适合测试环境使用,而在安全级别较高的生产环境上无法尝试?自己把握!
当然,oracle10g后推出的datapump (expdp,impdp)相较而言,效率也有很大提升,并引入并行参数,是导入导出操作非常好的选择。







