Oracle数据库优化 之存储电池失效排查

来源:这里教程网 时间:2026-03-03 18:12:51 作者:

磁盘  IO  性能异常

存储电池失效,数据库整体性能性能下降。

 

某未签约客户的业务系统在月结时出现严重性能问题。平时月结时间大概维持在  1  小时左右,但故障期间  1  天都无法完成月结。需要特别指出的是,该系统除了月结,其他业务都一切正常。这在某种程度上加大了问题的判断难度。最终排查由于存储电池失效引起此次故障。

 

数据库在月结时的  AWR  报告如下:

其中影响数据库性能最大的  SQL  是一条  insert  语句,如下所示:

  insert  语句的执行计划显示完全正常,如下所示:

  AWR  报告中可以看到,数据库性能问题的原因已经相当明显:  存储的  I/O  已经严重出现问题。  其中存储的平均每次写的时间最高达到了  688ms  ,平均读的时间最高达到了  235ms  。而根据经验,平均读的时间应该维持在  5-10ms  左右,最高也不应该超过  20ms  (在存储  cache  不命中的情况下)。

但是存储工程师在查看了存储之后,告之客户存储没问题!确实,简单地查看存储是没问题:

   首页页面没有错误。

   电池没有报警。

   硬盘没有亮灯。

   操作系统日志没有存储相关错误。

当局者迷,旁观者清。在月结业务积压的时候,客户信了存储工程师的诊断结果。于是自己做了如下操作:

1  、将核心业务用户使用  exp/imp  的方法迁移到一台  PC  服务器进行月结处理,月结正常。

 2  、使用  exp/imp  的方法重组  t_Gl_AssistBalance  表,重组完成之后月结依旧缓慢。

同样的操作,同样的数据,同样的业务。低端配置的  PC  服务器月结正常,而配置相对高端的小机却出现严重问题。这样的现象客户无论如何是想不通的。于是请来了业务厂商的  DBA  ,该  DBA  在不观察数据库症状的情况下,三下五除二地设了以下隐含参数:

1    _b_tree_bitmap_plans=false

2    _no_or_expansion=true

可想而知,月结症状依旧。这时该  DBA  又三下五除二地进行了  SGA  参数调整,将  buffer cache  从原来的  3G  调整为  16G  ,将  shared pool  从原来的  200m  调整为现在的  2G  。如下所示:

在存储  I/O  紧张的情况下,适当加大  buffer cache  有利于缓解存储的  I/O  压力,但这是建立在合理调整基础之上的。内存不是越多越好,只要够用就行。  DBA  调整完这些参数之后,又再一次开始月结业务,结果系统更加缓慢,产生了大量交换。如下所示:

在只有  24G  内存的主机上,将  SGA  设置为  18G  ,这明显是不合理的。这时业务厂商  DBA  也无能为力,仍下一句话:    你们的业务系统版本太老了,需要升级!    客户傻眼了。

做了这么多无效功,客户终于又找我们了。于是紧急前往现场。我的结论还是一样:存储出现问题。但存储工程师又说:存储没问题。最后我建议存储工程师将电池重新激活一下,这时柳暗花明又一村了,激活完成之后,操作系统  errpt  出现如下清晰而又愉快的警告:

果然是存储电池出现了问题,进而导致  cache  失效,进而导致存储  I/O  大幅度下降。接下来存储工程师进行了一些操作,  cache  恢复正常。月结操作也恢复正常。

事情还没有完。由于在客户现场,虽然问题已经解决,但闲着也是闲着,于是我向存储工程师要来了这个存储底层配置情况:

也就是说  hdisk3-9    hdisk18  属于  raid    1    hdisk10-17  盘属于  raid    2  。而数据库的数据文件全部存放在  raid    1  ,这是极不合理的,这相当于没有将存储的  I/O  性能完全发挥出来。文件系统创建情况如下所示:

 

为了最大程度地发挥存储的性能,于是我建议将  online redolog    undo  数据文件在线迁移到  /backup  文件系统中。迁移完成之后,月结速度进一步提升。

相关推荐