实战课堂:数据库高Library Cache Lock导致Hang的故障分析

简介:

案情描述:

客户数据库发生hang现象,大量业务操作超时,DBA介入分析。

通过OEM控制台的监控工具,可以看到客户数据库的“平均活动会话数”从21点开始active session出现明显增长,最高超过60个直至10点左右恢复。

在图上出现一个明显的“波峰”,且等待事件类为concurrency:

1f83f8ef8d81ecff576e4049a785c6a53a90544a

对于这类情况,如果数据库可以操作,我们仍然可以从ASH或者AWR入手,快速获取信息

收集 21点至22点的AWR报告,其“Top 5 Timed Events”前两个为:library cache lock、library cache pin且平均等待时间分别为2928和2910毫秒,出现严重的性能问题。这两者的Wait Class就是Concurrency,也就是监控中所表现出来的问题。

b8092f50d8e1fb86a2bb876d3aa6f4e24725d4f5

查看AWR中“SQL ordered by Elapsed Time”可以发现所有执行时间长的语句都为调用过程和包,每次执行时间基本都是超过1秒最长达到35.9秒,远远超出了正常值:

59f586f6ec45348f5f5ea647a45e591c939ec8db

通过以上信息进行初步分析,我们怀疑数据库缓慢的原因可能是对高使用率的核心存储过程和包进行编译导致。

该问题的发生一般伴随着“LIBRARY CACHE PIN” 和“LIBRARY CACHE LOCK”等待事件。

为了进一步确认问题,如果有相关包和存储过程在问题期间进行编译过可以通过DBA_OBJECTS视图的"LAST_DDL_TIME"字段观察到最近一次编译时间。

6064bde02bfed4e1afd99aa16ef3ef7ff88be0e6

客户告知当晚存在对表进行添加字段的操作,经过客户与操作人员确认进行添加字段的表为MAIN.EMP_NOTE与上表格标红的行的表名和时间吻合。

存储过程或包引用的表结构发生变更时,对象会变为无效。Oracle会在第一次访问此对象时试图去重新编译它们,如果此时有其他session已经把此对象 pin到library cache中,就会因exclusive类型的pin导致出现等待,当有大量的active session并且存在较复杂的dependence时如下表,当CMP_NOTE发生改变时标红列的所有对象都需要重新编译。

5b808a261d84f72069389c578364436f017f84fd

上表显示了当CBMAIN.EMP_NOTE结构发生改变后导致上表第一行CBMAIN.PKG_DTG_CMG包失效,而CBMAIN.PKG_DTG_CMG在下表有又有更多的对象依赖该包,这种依赖层层深入,重新编译由CBMAIN.CMP_NOTE表结构改变导致失效对象的时间变得不可控,并且在此期间会阻塞其它试图去访问这些对象的session,最终导致当晚问题发生。

5aa97a5ae51934fcdb1da343578b5a1e1325b70f

找到问题的原因,就可以理解数据库的行为。只需要等系统的失效对象编译通过,系统就能够恢复正常工作。

回顾这个问题,我们同样可以对用户日常运维提出规范建议:

d47e62d2b349aca45e42305ed6714efbe5ed61d9数据库的业务账号由统一的归口管理部门和人员进行管理,杜绝非账号管理人员掌握数据库的业务账号。

d47e62d2b349aca45e42305ed6714efbe5ed61d9对于核心业务系统任何变更一定要在停机窗口时间进行操作,应用固定变更场所,避免供应商变更人员使用PL/SQL Developer等工具直连生产系统。

d47e62d2b349aca45e42305ed6714efbe5ed61d9对业务核心对象进行变更包括增加字段,删除字段,添加删除权限都应非常谨慎。定期检查检查数据库中无效对象,清理无用的无效对象。

d47e62d2b349aca45e42305ed6714efbe5ed61d9进行业务变更期间应有DBA配合保障工作。

这就是来自生产的一次故障处理和排查,通过这样的过程,我们能够看到,在生产环境中一次小的操作,就可能导致严重的性能影响,一个DDL都不应该草率执行,任何变更都应该充分考虑级联的各种影响。


原文发布时间为:2018-05-28

本文作者:墨墨

本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”。

相关文章
|
3月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
485 7
|
4月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
188 3
|
人工智能 关系型数据库 OLAP
聚光灯已就位!阿里云瑶池数据库邀你征战Cursor首届实战征文大赛
阿里云AnalyticDB携手Cursor中文社区,正式发起首届实战征文大赛!我们诚邀开发者融合Cursor的智能编程能力与AnalyticDB PostgreSQL提供的Supabase服务进行项目开发,让优秀项目被专家看见、被机遇拥抱!
|
7月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
360 1
|
8月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
7月前
|
SQL 数据建模 关系型数据库
别光知道存数据库了,数据建模才是王道!(入门指南+实战代码)
别光知道存数据库了,数据建模才是王道!(入门指南+实战代码)
1368 4
|
10月前
|
SQL 关系型数据库 数据库
【YashanDB知识库】OM仲裁节点故障后手工切换方案和yasom仲裁重新部署后重新纳管数据库集群方案
本文介绍了主备数据库集群的部署、OM仲裁故障切换及重新纳管的全过程。首先通过解压软件包并调整安装参数完成数据库集群部署,接着说明了在OM仲裁故障时的手动切换方案,包括关闭自动切换开关、登录备节点执行切换命令。最后详细描述了搭建新的yasom仲裁节点以重新纳管数据库集群的步骤,如生成配置文件、初始化进程、执行托管命令等,确保新旧系统无缝衔接,保障数据服务稳定性。
|
4月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
277 6
|
4月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
189 1

热门文章

最新文章