记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/

 

 

后续跟踪

   无告警日志出现,性能问题得到解决