记Oracle数据库的一次调优
操作系统
数据库
问题
当程序部署到这个系统之后,发现应用运行效率很差。一般这种情况,多数问题出现在应用这一端。但负责此项目的程序员告诉我,当他在上面truncate一张小表 (10w以内数据)要花400多秒,我觉得数据库应该是有一定问题的。
排查问题
查看告警日期
admin/orcl/bdump/alert_orcl.log
发现出现大量
Thread 1 cannot allocate new log
Checkpoint not complete
处理这个问题,我是有经验的。一般来说是增大日志文件或者增加日志组。按照以往的
经验,我把redo log file size 从50M增加到100M,并新增了3个日志组
为了方便监控
alter system set log_checkpoints_to_alert=true scope=both
增加日志组与日志文件后,发现告警仍旧存在。处理事务时仍然出现长时间等待。
出现Checkpoint not complete,一般是由于日志增长太快,Checkpoint 没有及时完成
导致的。发生日志切换时,LGWR进程停止写日志到当前日志文件,关闭日志文件,打开新的
日志文件并写日志缓存中的数据到新的日志文件.当前日志文件组A切换到日志文件组B,A的
状态从current变成active。B从inactive变成current并触发checkpoint事件,checkpoint会
记录此时的RBA,并将此RBA之前buffer cache中的脏块到数据文件当中去.当Checkpoint完
成,A的状态从active变成inactive.
当A处于Active模式,B发生日志切换到A。那么就会出现
Thread 1 cannot allocate new log
Checkpoint not complete
从而导致当前事务等待,导致性能问题。
解决此问题:
1.增加日志组,增长写日志组的循环时间。
2.增加日志文件大小,减少日志切换。
但为什么,我增加这些后。基本没有效果不明显呢?于是我测首先测了下机器的IO吞吐量。
测试写入:time dd if=/dev/zero of=/home/test.dbf bs=8k count=300000
写入速度,48.7MB/s
使用Bonnie++进行系统IO性能测试
字符写入速度 34797K/sec block写入速度40736K/sec。3块硬盘做了raid5有这个速度,应该
还算可以吧。
第二,查看了下具体事务产生的redo log size
1.自数据库启动以后所产生日志大小
select name,value/1024/1024 from v$sysstat where name like 'redo size';
2.当前session所产生的日志大小
select a.name,b.value/1024.00/1024.00
from v$statname a,v$mystat b
where a.statistic#=b.statistic# and a.name='redo size';
在具体业务中,400秒内竟然产生了1.1G的日志量。按照100M大小的日志文件,6组。很容易
就在很短时间内就写完一个日志循环,造成checkpoint not complete.
解决问题
1.增加日志文件大小到600M,日志组10组
alter database add logfile group 1 ('/orasvr/oradata/orcl/redo01.log') size 600M;
alter database add logfile group 2 ('/orasvr/oradata/orcl/redo02.log') size 600M;
alter database add logfile group 3 ('/orasvr/oradata/orcl/redo03.log') size 600M;
alter database add logfile group 4 ('/orasvr/oradata/orcl/redo04.log') size 600M;
alter database add logfile group 5 ('/orasvr/oradata/orcl/redo05.log') size 600M;
alter database add logfile group 6 ('/orasvr/oradata/orcl/redo06.log') size 600M;
alter database add logfile group 7 ('/orasvr/oradata/orcl/redo07.log') size 600M;
alter database add logfile group 8 ('/orasvr/oradata/orcl/redo08.log') size 600M;
alter database add logfile group 9 ('/orasvr/oradata/orcl/redo09.log') size 600M;
alter database add logfile group 10 ('/orasvr/oradata/orcl/redo10.log') size 600M;
3.开启异步读写,加快DBWR效率,加快checkpoint完成
可以参考http://wangwei.cao.blog.163.com/blog/static/10236252620108323337465/
后续跟踪
无告警日志出现,性能问题得到解决