troubleshooting LGWR wait library cache lock instance lock on standby

本案例来自东区某金融客户,数据库版本为19c,故障现象为备库每天早上8点40左右,备库的LGWR都会被阻塞。从而其他应用因为请求不到instance lock也被LGWR阻塞,让客户在第二天重现的时候收集了systemstate dump进行分析。

LGWR PROCESS STATE OBJECT:

LGWR SESSION STATE OBJECT:

LGWR SID为337,等待lc lock,namespace一看就是instance lock,请求模式为X。

这里偷了个懒,很碰巧看到了final blocking session,就省的去搜索哪个session持有了instance lock了。

final blocker为session 1976

final blocker session state object:

final blocker没有任何等待,正在执行的sql为:

有两个子游标handle,

  • Handle=0x3e5e2ea8f0
  • Handle=0x3e5de512f0

查看子游标lc state object:

load时间与故障时间吻合,并且长时间的X模式持有cursor pin mutex和lc pin,这里可以看到heap 6占用了大量的空间,不由得想去看看这个sql的执行计划。

看了吓一跳,首先优化器选用的RBO,很简单的sql,但是in里面变量达到1000个,正好还走了or展开。1000个变量意味着有1000个or分支,难怪heap 6那么大。

看看blocker 的stack信息:

大量的循环了apaclg函数。  (apa)clg – SQL Access Path Analysis ??

分析到此基本可以给出建议了。3个建议同时调整:

  • 减少in变量为100个
  • 使用all_rows hint让执行计划走inlist
  • keep sql执行计划

 

此条目发表在Oracle troubleshooting分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注