数据库无响应问题的紧急处理和分析 (r10笔记第42天)
黄金周里处理了一起紧急的问题,在外面幸亏有同事帮忙协助,等我赶回家去,赶紧继续处理。 首先问题是在晚饭时间左右开始发生,但是过了没多久又恢复了,所以这个问题暂时就没有引起太多关注,但是后面发现问题开始反复,而且数据库的负载开始急剧提升,后面也开始收到了不少的报警信息,一下子问题就变得紧急起来。 环境是10.2.0.3的数据库,在Solaris 10环境中。 当时的DB time情况如下,从负载来看,压力是非常大的,数据库几度出现了无响应的情况,这对于核心业务而言还是影响很大的。
这是一套很稳定的数据库,很稳定的说法主要是很少有变更,而且多年来系统一直表现稳定。 查看资源的使用情况如下,可以看到在问题发生时段,没有大批量的事务,没有大批量的资源消耗。
那看看等待事件,发现都是和锁相关的。根据wait class的指示是和并发相关的。如果看到如此的情况,而且很紧急,想必是很纠结的。
我们来看看问题时间段的SQL情况,看看是否因为SQL问题导致了严重的等待和锁争用。
这个地方就有一些误区,看SQL语句,默认会定位到top的几个SQL语句,细看所占的比例也蛮高,所以同事的注意力就集中在了SQL优化上,但是查看语句是一个很简单的查询,而且也是走了唯一性索引,那问题的症结在哪里呢。 可以从awrsqrpt的报告看出端倪,那就是存在大量的等待。其实执行的时间还是很短的。
那问题的原因怎么解释,到底在等待什么呢。这个需要对整个系统的架构和技术细节需要有一些了解。 首先现在的网卡使用了逻辑IP,如下所示。服务器存在两个物理网卡,现在对外使用的是一个网卡1(e1000g0)上绑定的一个逻辑IP,当然这么做也是有一些历史原因的。
而对系统的架构有一定的了解,会发现其实和另外一个数据库有一些关联。怎么解释呢,就是在问题发生的时候,另外一台数据库的负载也急剧提升。 我直接到另外一台服务器上查看发现存在大量的活跃会话,而在等待的就是下面的这样一个语句。看起来也没有什么问题,如果查看执行计划就会发现其实另外一台服务器中是使用了DB link来访问现在出问题的数据库。
update enthralcert set logout_date = sysdate, status = 0 where cert_number in (select cert_number from enthralcn where cn = lower(:cn))
其实问题的原因也无须掉书袋,经过快速定位和分析,就是因为这样的DB link,听起来好像也不大合理,怎么会有这样的问题呢,问题服务器上存在着大量的数据库连接,会直接更新本地表,间接通过db link来引用其他的表,在业务稳定的时候没有差别,在一定程度上和设置的逻辑IP有一些关系,网络一旦发生抖动和不稳定,就会把这个网络的延迟放大,传 播,大批量的会话开始阻塞,等待,就会变成活跃会话,数据库负载急剧提升,如果应用端持续调用都存在等待,系统资源就会逐渐耗尽,导致出现无响应的情况,这种问题的解决方案目前是采用了折中的一个方案,既然通过db link,我们把一部分的网络压力放在物理网卡2上。在tnsnames.ora中修改对应的IP和端口即可。至少在一定程度上能够极大缓解问题,后续会建议从应用层面,系统层面来持续改进。 当然处理问题的过程中,发现有大量的等待,首要的等待就是library cache的争用,这个可以从下面的图示看出。可以看到shared pool确实很紧张,而且同时buffer cache其实使用一点都不紧张,我们重置一下SGA的组件,这个地方需要提醒一下,在这种情况下需要评估影响范围。
我印象中是存在一个bug,会导致实例直接宕掉,评估了之后决定先改进一下。alter system set shared_pool=xxx运行下去,实例还真宕掉了。
Errors in file /U03/app/oracle/admin/test/bdump/test_mman_944.trc:
ORA-00600: internal error code, arguments: [kmgs_pre_process_request_6], [1],[107], [18], [3], [0xA7024DB68], [], []
Mon Oct 3 22:45:17 2016
MMAN: terminating instance due to error 822
赶紧把实例启动起来,因为有应用重连机制,所以问题的影响还在可控范围,火速调整shared_pool的大小,重启后,问题就得到了一定的缓解,当然问题的根本还是设计不当采用了大量的DB link的方式,把问题的影响放大。需要引以为戒。
- WCF如何克服HTTP传输协议的局限提供对不同消息传输模式的实现
- H5手游大事件:腾讯上线“微信小游戏”!支持群分享与内购
- 我所理解的Remoting(2):远程对象生命周期的管理[上篇]
- 谈谈分布式事务(Distributed Transaction)[共5篇]
- SQLXML初体验:用XML代替T-SQL来操作数据库
- 自己动手写可视化软件(代码已开源)
- 探秘Tomcat——连接篇
- 微信小游戏正式上线,H5游戏迎新机遇
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]
- 成为更好程序员的8种途径
- 探秘Tomcat——启动篇
- ai量化系统架构的思考
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 设计模式~享元模式
- 最近三个月记录
- 近期vue开发相关问题
- 打印日志时 Logback 内部都做了些什么
- nginx配置https
- 近期问题: jq循环中异步请求问题
- 启用HSTS并加入HSTS Preload List-附删除HSTS方法
- 聊聊UI标准化
- puppeteer学习----登录人才网并截图
- MySQL 案例:用户鉴权与 Host 优先级
- Http Post 快速使用
- 有赞Flutter插件开发与发布
- 国标GB28181协议客户端EasyGBS国标视频平台级联EasyNVR:EasyGBS如何实现调阅EasyNVR的视频通道?
- gitlab CI/CD 相关问题
- 微信jssdk分享接口