网站首页 > 技术文章 正文
故障现象:
下午业务高峰期收到反馈,客户生产一个SQL无法通过,所有的请求都卡在一个数据语句上。影响客户生产,所有业务人员都在线等待,十万火急紧急联系客户远程。根据业务人员描述,从业务系统界面看,卡住的都是在执行同一个操作,并且数据库迟迟没有返回,问题出在数据库层面。
故障处理:
1、登录数据库系统,三板斧之第一板斧头:查看等待事件。
select inst_id,event#,event, count(*)
from gv$session
where wait_class# != 6
group by 1, 4 desc;
查出来数据库当前有20个library cache lock 等待, 同时还有一个library cache:mutex X等待。心头一惊,一般情况下数据库SQL执行效率差可能是执行计划发生抖动导致,常规的等待事件是db file sequence read/write之类,通过执行计划绑定可以解决。这个library cache lock和library cache:mutex X发生在SGA的shared pool 锁竞争,在数据库配置SGA、sharedpool 配置正确的情况下一般不会产生。开发又折腾除了什么新的幺蛾子。
2、检查数据库配置,三板斧之二:检查数据库配置
客户的生产库版本是11.2.0.4 打了比较新的RU。物理内存256G。
2.1 library cache的锁竞争第一个考虑到的是库的SGA或者shared pool配置过小,检查SGA 配置有70G。同时SGA采用手动管理,db_cache配置40G, shared pool 配置15G,streams pool\large pool\java pool 分别配置5G. PGA 配置 20G. 整体数据库配置没问题。
2.2 library cache的锁竞争 还有一个怀疑是用户大规模的密码错误,可以通过event 设置'28401 trace name context forever,level 1'解决。该event参数也已经配置正常。并且再三咨询过现场人员没有人动过生产环境。
综上,配置问题可以排除,密码错误导致的锁竞争也可以排除。这两个常规的导致
3、检索文档,三板斧之三:查看AWR和alert日志
数据库alert日志没有啥异常的ORA报错。AWR分析如下:
3.1 Instance Efficiency Percentages (Target 100%)的Parse CPU to Parse Elapsd %: 0.41 异常低。
3.2 根据第一个线索,数据库CPU的解析效率如此低下是有问题的。 检查解析的错误比率
错误的解析比率占比94.59%。
至此已经破案,数据库在大量的解析执行错误的SQL语句,导致shared pool 内存锁,从而hang住整个SQL。
根据检索,找到一个相关的文档。
'Library Cache Lock', 'Library cache: mutex X' and High Parse Failures Rates with 'Error=936' (Doc ID 2515981.1)
根据文档的解决方案。设置一个数据库的10035事件,抓取错误的解析语句。
---打开10035抓取错误解析语句
ALTER SYSTEM SET EVENTS '10035 trace name context forever, level 1';
---关闭10035抓取
ALTER SYSTEM SET EVENTS '10035 trace name context off';
故障总结:
数据库打开10035抓取的一瞬间,alert日志大量的解析错误语句爆出来,还是同一个。发给研发。研发人员分析判断。程序的SQL语句中调用了一个函数,该函数会对表里面的一个字段做计算。如果该字段为空,则在函数里面会执行一个错误的SQL。同时该表的记录有二十几万,等于一次请求,没一行都会执行一个错误的SQL,从而导致数据库有大量的解析错误。最终产生library cache lock。
该函数已经存在有十几年了,开发人员写的函数对数据的考虑不全面。
猜你喜欢
- 2024-11-14 面试官:一条查询 SQL 到底做了什么事?请你来描述下!
- 2024-11-14 Oracle案例:一次gc buffer busy acquire诊断
- 2024-11-14 图文详解:数据库事务与锁 数据库事务的概念
- 2024-11-14 云贝教育 | 「技术文章」内存闩锁分析
- 2024-11-14 MySQL进阶系列:锁-InnoDB中锁的情况
- 2024-11-14 Oracle技术分享 LOCK TABLE语法 oracle锁表语句lock table
你 发表评论:
欢迎- 613℃几个Oracle空值处理函数 oracle处理null值的函数
- 604℃Oracle分析函数之Lag和Lead()使用
- 593℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 590℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 584℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 578℃【数据统计分析】详解Oracle分组函数之CUBE
- 567℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 559℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)