1、故障描述
4月1日14:50-16:05 某核心BOSS系统数据库服务异常, 部分业务无法对外提供服务。
2、问题分析
2.1 数据库在线活动进程分析
用统计学的方法分析数据库每个时间点的在线活动进程数(数据库服务器为16C 、ORACLE 2结点RAC 版本11.2.0.4)。
3月31日数据库在线活动进程: 4个,低负载,4个进程共享32个CPU。
4月1日数据库在线进程: 60个在线活动进程, 2个进程争用1个CPU(以前是1个进程共享8个CPU!!!),数据库服务异常。
2.1.1 分析结论
由上面两图分析,4月1日数据库负载为正常情况的15倍,数据库服务异常。
2.1.2 提出疑问
哪些进程及SQL造成数据库活动进程大幅增加?(下章分析)
2.2 数据库活动SQL分析
对数据库运行SQL进行统计分析,发现数据库后台大批量进程在执行SQL: 07ht123456789,数据库事件为:全表扫描,且无其它事务阻塞,统计该SQL在同一时间点的执行情况。
3月31日SQL:
07ht123456789同时运行活动进程数均值:3个(日常活动进程4个,它占3个,平时就有性能隐患)。
4月1日SQL: 07ht123456789同时运行活动进程数均值:60个
2.2.1 结论
SQL_ID:07ht123456789在同一时间点的运行数量为平时的20倍,可以确认该SQL是造成数据库服务异常的“病灶” (下章对此异常SQL分析)。
2.3 异常SQL分析
2.3.1 SQL内容
SQL_id: 07ht123456789
Sql语句:
select count(distinct p.cn)
from ht_idx p
where p.loginstate = 'true'
and p.logindate = :3
2.3.2 执行计划

2.3.3 业务表信息
查看表PORTAL_IMS_IDX数据量为: 4492744
查看此表数据保留天数据:31天
3、为什么以前都正常
为什么以前都正常,今天突然异常呢?这条语句是新程序吗?见下文分析。
3.1 问题一、SQL是新程序吗?

1月份此SQL都在运行,证明不是新程序。
3.2 问题二、SQL每小时执行多少次?
|
系统名称 |
SQL_ID |
时间 |
执行次数 |
平均执行时间(秒) |
|
核心系统 |
07ht123456789 |
3月28日8点-9点 |
3106 |
1.481 |
|
核心系统 |
07ht123456789 |
3月29日8点-9点 |
2966 |
1.514 |
|
核心系统 |
07ht123456789 |
3月31日8点-9点 |
2855 |
1.561 |
|
核心系统 |
07ht123456789 |
4月1日8点-9点 |
1141 |
108.441 |
单条SQL 每小时执行3000次!!!
3.3 问题三、SQL今天比平时慢100倍?
查看28日SQL统计信息
查看31日SQL统计信息
查看4月1日SQL统计信息
Buffer gets: 从数据库缓存读数据。(逻辑读)
Disk reads: 从数据库存储读数据。(物理读)
原来大批量的数据都是从存储读数据,所以造成数据库服务异常。
3.4 查看AWR是否与上述一致?
查看3月31日AWR报告,物理读正常。
查看4月1日的AWR显示有大量的物理读。
结论:大批量的物理读造成SQL语句异常缓慢,造成数据库服务异常。
3.5 4月1日有如此大的物理读?
4月1日凌晨系统升级重启过数据库,数据库重启后缓存会被清空,第二天大批量存在性能问题的语句执行时,大量物理读,造成数据库服务异常。
3.6 总结
400W数据量全表扫描查询每小时执行3000次,在数据库重启缓存被清空后,大量物理读造成数据库服务异常。
4、数据库恢复
将业务表进行历史数据归档后,数据库恢复正常。
5、故障原因
1、 SQL(SQL_ID: 07ht123456789) 性能问题,400W数据全表扫描查询,造成后台大批量进程同时执行此语句,造成数据库异常。
2、 ht_idx(业务表)故障时存储了31天历史数据,未及时进行历史数据归档(已与业务沟通该表应该每天进行历史数据归档)。
3、 数据库重启后缓存被清空,业务高峰期大量物理读造成数据库异常。
6、优化建议
1、 建议开发厂商优化语句(SQL_ID: 07ht123456789)。
2、 建议及时对表ht_idx进行历史数据归档。
3、 建议加强对信息系统数据库监控,及时发现数据库异常,提前消除安全隐患。
4、 加强信息系统常态SQL审核优化,提前发现并优化TOP SQL。