版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://fbirdzp.blogbus.com/logs/98676185.html
性能测试或是压力测试工作的核心是测试环境的准备,其中就经常涉及到大数据量的导入导出。对于一个超过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将不可再修改