最近在做数据迁移,发现用数据库泵要比用DML语言(insert)快很多,大概一个8G左右的表数据库几分钟就可以导入成功,而用DML语言需要2-3个小时才能完成。最初以为机器性能不行,想起来最进接触的Linux HugePages相关知识。
通过后来学习发现在数据库内存为AMM管理模式下,不支持Linux HugePages。
关于相关说明:HugePages and Oracle Database 11g Automatic Memory Management (AMM) on Linux (文档 ID 749851.1)
Linux HugePages说明:http://blog.csdn.net/zhouyh139/article/details/8662768#comments
查看v$log表,发现绝大多数日志为active状态。遂将DML语言改为并行nologging形式:
insert /*+position(t1,4)*/ into t1 select /*+position(t2,4)*/ * from t2 nolongging;
发现还是不行,依旧很慢。无奈给数据库做了一个statspack。发现问题:
Top 5 Timed Events Avg %Total
~~~~~~~~~~~~~~~~~~ wait Call
Event Waits Time (s) (ms) Time
----------------------------------------- ------------ ----------- ------ ------
db file async I/O submit 208 1,740 8367 42.6
free buffer waits 804 1,552 1930 38.0
rdbms ipc reply 150 282 1880 6.9
log file parallel write 1,776 219 124 5.4
db file scattered read 3,299 107 33 2.6
-------------------------------------------------------------
发现db file async I/O submit等待事件,且每个等待高达8367秒。同时还伴有free buffer waits等待事件,先查询后者如下:
这个等待事件出现是因为dbwr没有及时将dirty buffer写到磁盘,造成server process得到不到free buffer。造成dbwr写脏块慢的原因主要由以下几种情况:
-
1、i/o慢
检查v$filestat,是否大量磁盘写操作发生;通过iostat等操作系统命令查看磁盘写情况。
可以通过换更快速磁盘及I/O分担的方法解决i/o慢的问题。
-
2、buffer cache设置过小造成dbwr刷新缓慢
通过V$DB_CACHE_ADVICE获得较合理的buffer cache大小并进行调整。
-
3