热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

小心,有bug:SQL开启SPM遭遇librarycache堵塞

编辑手记:在数据库中,有一些bug,可能并不会造

编辑手记:在数据库中,有一些bug,可能并不会造成严重的故障,却在细节上影响系统的性能,而你可能并不知情。

情景描述

在客户系统中,某一条SQL的执行总是会遭遇librarycache堵塞。时间为3-15分钟不等。


以下是dba_hist_active_sess_history的里相关的信息:

COUNT(*)   P3 TO_CHAR(SAMPL

------   ---------  ------------------

      3 520003    20161118 1049

2792 520002    20161118 1049

  215 520002    20161118 1052


      1 310003    20161201 1049

      1 310002    20161201 1049


      3 520003    20161214 1049

  908 520002    20161214 1049

      2 520003    20161214 1050

4876 520002    20161214 1050

      1 520003    20161214 1057

 938 520002    20161214 1057


      2 520003    20161227 1049

6551 520002    20161227 1049

      3 520003    20161227 1050

8245 520002    20161227 1050

      1 520003    20161227 1059

3205 520002    20161227 1059


     1 520003    20170102 2249

3034 520002    20170102 2249

      2 520003    20170102 2303

4362 520002    20170102 2303


可以发现一个奇怪的现象,每次出现都是在10:49开始,持续几分钟, 上午或者晚上, 无一例外。

Librarycache分析

等待的参数

Event

% Event

P1 Value, P2 Value, P3 Value

% Activity

library cache lock

58.13

"479334793648","480850481424","5373954"

0.04

library cache: mutex X

40.33

"2124281552","67461051318272","82"

1.05

library cache: mutex X

40.

"2124281552","66481798774784","82"

1.04

library cache: mutex X

40.

"2124281552","37323265802240","82"

1.04


检查libcache内部表,发现等待的SQL的hash_value 2124281552, namespace为SQL AREA BUILD。锁模式为少数几个独占锁(P3: 0003)和大量的共享锁(P3: 0002)。


该SQL详情如下:

select lpad(to_char(479334793648,'FMXXXXXXXXXXXXXXXX'),16,'0') HDR,

floor(5373954/65536),KGLSTDSC,   mod(5373954,65536)    from x$kglst

where  kglsttyp = 'NAMESPACE' and KGLSTIDN = floor(5373954/65536);


HDR  FLOOR(5373954/65536) KGLSTDSC       MOD(5373954,65536)

0000006F9A9481B0     82 SQL AREA BUILD     

2 -- 2:Row-S 行共享(RS)


ADDR             KGLHDADR         KGLHDPAR

---------------- ---------------- ----------------

KGLNAOBJ           KGLNAHSH   KGLHDNSD         KGLHDOBJ

----------------- ---------- ----------------- ----------------

00007F9E2E152A40 0000006F9A9481B0 0000006F9A9481B0   

8a954ac25948a0e4  2124281552  SQL AREA BUILD   00            


从v$db_object_cache上看,NAMESPACE='SQLAREA BUILD'集中在这个SQL(2124281552), 其他对象几乎没有.

SQL> l

  1  select owner||'.'||name,LOCKED_TOTAL,HASH_VALUE,NAMESPACE

  2  from  v$db_object_cache

  3  where LOCKED_TOTAL > 1e4 and NAMESPACE='SQL AREA BUILD'

  4* order by 2 desc


OWNER||'.'||NAME

-----------------------------------------

LOCKED_TOTAL HASH_VALUE NAMESPACE

------------ ---------- -----------------

$BUILD$.8a954ac25948a0e4

      980338 2124281552 SQL AREA BUILD


$BUILD$.8d3a2b6c82e1f24a

       19551  838677984 SQL AREA BUILD;


Library cache效率

SQL> l

  1  select * from (

  2  select instance_number,snap_id,NAMESPACE,

gets - lag(gets) over(partition by instance_number,NAMESPACE order by snap_id ) gets,

gethits - lag(gethits) over(partition by instance_number,NAMESPACE order by snap_id ) gethits

  3  from

  4  dba_hist_librarycache where NAMESPACE = 'SQL AREA BUILD'

  5* ) where gets > 1e3

SQL> c/3/4

  5* ) where gets > 1e4

SQL>


SNAP_ID 1-GETHITS/GETS    GETS  GETHITS

------- -------------- ------- --------

29037     .818992528    4149      751

29223     .180594901   15532    12727

29223     .003631652  446078   444458

29229      .92168512    7406      580

29817     .842255412    5959      940

29818     .496903641    4037     2031

29847     .003819032  332545   331275

29853     .877702162    4996      611

30148     .863040311    4118      564

30150      .90610175    6113      574

30163     .816539263    4317      792

30164     .339652956    6224     4110

30164     .003373041  769039   766445

30165     .001798013  219687   219292

30184     .859574468    4465      627

30185     .543539326    7832     3575

30185     .474295506    5252     2761

30186     .658835375    5959     2033

30187     .703128195    4891     1452

30189     .895012469    4010      421


请求和命中同步上涨,发现并非由于MISS造成的问题。

SQL AREA BUILD是一个非常罕见的LIBRARY 操作。毫无疑问,SQL AREA BUILD是这个故障的最关键信息之一,

SQL分析

SQLID: 8p5aas9cnj874

SQLTEXT:

SELECT F.REFOPCODE, NVL(F.EATTRIBUTE3, 'N'), F.TSID FROM (SELECT S.REFOPCODE, S.EATTRIBUTE3, S.TSID FROM TBLTS S WHERE S.RCARD = :B4 AND S.CDATE = :B3 AND S.ORGID = :B2 AND S.RCARDSEQ = :B1 AND S.TSSTATUS = 'tsstatus_reflow' ORDER BY S.MTIME DESC) F WHERE ROWNUM = 1


Version Count

SQL> select count(*) from v$sql where sql_id = '8p5aas9cnj874';

  COUNT(*)

----------

        17


该SQL Version 为17,不算太高。



SQL执行趋势

SNAP_ID LOADED VERSIONS VERSION

COUNT INVALIDATIONS

DELTA LOADS

DELTA PARSE_CALLS

DELTA EXECUTIONS_DELTA


30167 7 11   5 11 20192 318672

30167 9 13 17 23 19996 118173

30166 7 11   5 11 19603 354010

30166 9 13 16 21 19627 107652

30165 9 13 16 19   5936   18983

30165 6 11   3   8   5229   89726

30164 6 11   3   8   2526 110558

30164 3   9   0   0     121         80

30163 7   7   5   9 26875 352589

30163 7   7   5 10 26925 338666

30162 7   7   5   9 26343 340612

30162 7   7   5 10 26324 325503

30161 7   7   4   9 26213 309335

30161 7   7   5   9 26526 326526

30160 7   7   3   6 23104 277292

30160 7   7   5 10 23348 273669

30159 7   7   5   9 17877 209221

30159 7   7   4   8 17748 214364

30158 7   7   6 11 19152 230054


故障期间,执行次数/parse call反而下降,证明并非由于SQL执行量或者parse call量增加导致问题。

 

SQL执行计划

PLAN_TABLE_OUTPUT

-----------------------------------------------

SQL_ID  8p5aas9cnj874, child number 2

-------------------------------------

SELECT F.REFOPCODE, NVL(F.EATTRIBUTE3, 'N'), F.TSID FROM (SELECT

S.REFOPCODE, S.EATTRIBUTE3, S.TSID FROM TBLTS S WHERE S.RCARD = :B4 AND

S.CDATE = :B3 AND S.ORGID = :B2 AND S.RCARDSEQ = :B1 AND S.TSSTATUS =

'tsstatus_reflow' ORDER BY S.MTIME DESC) F WHERE ROWNUM = 1


Plan hash value: 427499170

可以发现,SQL没有使用特殊函数,但采用了SPM

时间点分析

问题发生的时间点规律性非常强,总共出过5次,4次在上午10:49, 一次在晚上10:49, 从未有过例外。因此,有足够的理由怀疑,这个故障由一个周期性执行的activity所诱发。因此,我们检查了操作系统crontab, 应用定时任务,数据库DBA_JOB和数据库DBA_SCHEDUEL_JOB等,只在DBA_SCHEDUEL_JOB中发现可疑目标。

JoB ID

Log Date

Job Name

51932

20161204 104946

RLM$EVTCLEANUP.

51982

20161204 224946

RLM$EVTCLEANUP.

52028

20161205 104946

RLM$EVTCLEANUP.

52072

20161205 224946

RLM$EVTCLEANUP.

52694

20161213 104946

RLM$EVTCLEANUP.

52723

20161213 224946

RLM$EVTCLEANUP.

52768

20161214 104946

RLM$EVTCLEANUP.

52814

20161214 224946

RLM$EVTCLEANUP.

53152

20161218 104946

RLM$EVTCLEANUP.

53214

20161218 224946

RLM$EVTCLEANUP.

53259

20161219 104946

RLM$EVTCLEANUP.

53289

20161219 224946

RLM$EVTCLEANUP.

53335

20161220 104946

RLM$EVTCLEANUP.

53739

20161225 104946

RLM$EVTCLEANUP.

53808

20161225 224946

RLM$EVTCLEANUP.

54111

20161229 104946

RLM$EVTCLEANUP.

篇幅原因,省略部分内容。

可以看到,Schedule Job RLM$EVTCLEANUP. 在每个小时的49分会开始运行。根据Oracle官方文档,RLM$EVTCLEANUP属于EXFSYS用户,专门用户XML数据库的数据过滤功能。由于客户数据库未使用XML DB及其相关的数据过滤功能,因此,可以考虑删除该用户。

寻找对应BUG

从Oracle官方网站寻找关于“SQL AREA BUILD”的BUG. 找到以下文章。

Bug: 16005481: PLAN FOR HINTED SQL LINKED TO UNHINTED SQL IN SPM AND HIGH 'LIBRARY CACHELOCK'.

该BUG首先发现于11.2.0.3.0,但从未被修复。


官网的示例如下:


整体故障现象,library cache, SPM 以及版本11.2.0.3.0都比较接近。

解决方案

根据以上分析,Bug 16005481及EXFSYS的RLM$EVTCLEANUP的定时任务最为可疑,因此,建议进行以下操作:

  • 移除该SQL的SPM, 并改用hint保证SQL性能。

  • 修改初始化参数 skip_unusable_indexes=false

  • 移除疑似1049 AM/1049 PM出现的活动的EXFSYS用户,此用户为Oracle 访问XML相关的一个用户,在目前应用中没有使用。


 后续建议:

  • 11.2.0.4.0 为11g最后一个大的patchset,但还是存在不少bug, 建议用户有机会可以升级到11.2.0.4.161118, 里面包含了大量的bug fix.

  • 在AWR中可以发现数据库中存在大量failed parse, 这些failed parse 可能影响library cache的效率。建议用户进行处理。


加入"云和恩墨大讲堂",参与讨论学习

搜索 盖国强(Eygle)微信号:eyygle,或者扫描下面二维码,备注:云和恩墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。


关注公众号,获得后续精彩分享



推荐阅读
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • SQL 查询实体优化与实战技巧分享 ... [详细]
  • MyISAM和InnoDB是MySQL中最为广泛使用的两种存储引擎,每种引擎都有其独特的优势和适用场景。MyISAM引擎以其简单的结构和高效的读取速度著称,适用于以读操作为主、对事务支持要求不高的应用。而InnoDB引擎则以其强大的事务处理能力和行级锁定机制,在需要高并发写操作和数据完整性的场景下表现出色。选择合适的存储引擎应综合考虑业务需求、性能要求和数据一致性等因素。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 在将Excel数据导入MySQL数据库的过程中,如何确保不会生成重复记录?本文介绍了一种方法,通过PHP脚本检查数据库中是否存在相同的“Code”字段值,从而避免重复记录的产生。该方法不仅提高了数据导入的准确性,还增强了系统的健壮性。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 阿里云MySQL与Oracle数据库的主从复制技术详解 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 本文探讨了如何在C#应用程序中通过选择ComboBox项从MySQL数据库中检索数据值。具体介绍了在事件处理方法 `comboBox2_SelectedIndexChanged` 中可能出现的常见错误,并提供了详细的解决方案和优化建议,以确保数据能够正确且高效地从数据库中读取并显示在界面上。此外,还讨论了连接字符串的配置、SQL查询语句的编写以及异常处理的最佳实践,帮助开发者避免常见的陷阱并提高代码的健壮性。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
author-avatar
歪友46300606
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有