ITPub博客

首页 > 数据库 > Oracle > [20240512]没有建表引发的灾难.txt

[20240512]没有建表引发的灾难.txt

原创 Oracle 作者:lfree 时间:2024-05-18 21:17:50 0 删除 编辑

[20240512]没有建表引发的灾难.txt

--//五一前遇到的问题,生产系统应用程序升级,但是3个表忘记建立,而编写的程序可能存在问题,导致频繁调用这些根本不可能执行的sql
--//语句,正常情况下应该报ORA-00942: table or view does not exist,很奇怪的同事反映应用前台根本不报错,真不知道开发如何写代
--//码,难道没做例外处理以及记录吗?导致前台无法应用程序无法执行任何操作,业务停顿接近1个小时.

--//在测试环境模拟看看出现这样的情况,看看如何诊断和分析问题.

1.环境:
SCOTT@test01p> @ver1
PORT_STRING          VERSION    BANNER                                                                       CON_ID
-------------------- ---------- ---------------------------------------------------------------------------- ------
IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production      0

$ ./sql_idz.sh  'select count(1) from deptxxx'  0
sql_text = select count(1) from deptxxx\0
full_hash_value(16) = AA0B8A5E997323CE2D65F9B7AF91ED4F
hash_value(10) = 2945576271
sql_id(32) = 2utgtqyrt3vag
sql_id(32) = 2utgtqyrt3vag
sql_id(32) = 2utgtqyrt3vag

2.建立测试环境:
$ cat m2.txt
set verify off
declare
v_id number;
begin
    for i in 1 .. &&1 loop
        select count(1) into v_id from deptxxx;
end loop;
end ;
/
quit

SCOTT@test01p> @ m2.txt 20
        select count(1) into v_id from deptxxx;
                                       *
ERROR at line 5:
ORA-06550: line 5, column 40:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 5, column 9:
PL/SQL: SQL Statement ignored
--//不能通过PL/SQL测试,等于无法编译自动中断执行.也就是仅仅调用1次,

3.换一个测试方式:
$ cat m2.sh
#! /bin/bash
sqlplus -s -l scott/btbtms@test01p <<EOF >/dev/null
set feedback off
select count(1) from deptxxx;
/
... --//snap
/

quit
EOF

--//主:中间的/太长,我加入20000个/,我的测试环境cygwin有点慢.如果是linux环境,你可以写成$(seq 20000|xargs -IQ echo /).
--//这样执行有一个缺点就是先要展开里面/才能执行,这样在测试环境时有点延迟执行,我的测试环境延迟实在是无法忍受.
--//我估计在linux执行也存在类似问题,可以尝试改成$(seq 1000|xargs -IQ echo /).
--//实在不行还是写成20000个/的形式.

--//开始测试,每次并发10个执行.
$ ~/bin/zzdate ; seq 100 | xargs -IQ -P 10 bash -c ./m2.sh
trunc(sysdate)+19/24+56/1440+51/86400 == 2024/05/12 19:56:51 == "timestamp'2024-05-12 19:56:51'"
...

SYS@test> @ ashtop event 1=1 trunc(sysdate)+19/24+56/1440+51/86400 sysdate
  Total                                                                                         Distinct Distinct    Distinct
Seconds     AAS %This   EVENT                         FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
------- ------- ------- ----------------------------- ------------------- ------------------- ---------- -------- -----------
    150     3.8   54% | kksfbc child completion       2024-05-12 19:56:56 2024-05-12 19:57:30          1       32          32
     69     1.7   25% | library cache lock            2024-05-12 19:56:59 2024-05-12 19:57:30          1       17          17
     19      .5    7% | cursor: pin S wait on X       2024-05-12 19:56:57 2024-05-12 19:57:28          1       11          11
     19      .5    7% |                               2024-05-12 19:56:57 2024-05-12 19:57:30          1       18          18
     11      .3    4% | SQL*Net break/reset to client 2024-05-12 19:56:54 2024-05-12 19:57:28          1       10          10
      9      .2    3% | library cache: mutex X        2024-05-12 19:56:59 2024-05-12 19:57:29          1        8           8
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      1      .0    0% | control file sequential read  2024-05-12 19:57:26 2024-05-12 19:57:26          1        1           1
7 rows selected.
--//2024/05/12 19:56:51过了8秒以后出现library cache lock,library cache: mutex X.

SYS@test> @ ashtop sql_id,event 1=1 trunc(sysdate)+19/24+56/1440+51/86400 sysdate
  Total                                                                                                       Distinct Distinct    Distinct
Seconds     AAS %This   SQL_ID        EVENT                         FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
------- ------- ------- ------------- ----------------------------- ------------------- ------------------- ---------- -------- -----------
    633     4.1   49% | 2utgtqyrt3vag library cache lock            2024-05-12 19:56:59 2024-05-12 19:59:24          1      113         113
    411     2.7   32% | 2utgtqyrt3vag kksfbc child completion       2024-05-12 19:56:56 2024-05-12 19:59:23          1      121         121
     84      .5    7% | 2utgtqyrt3vag                               2024-05-12 19:56:57 2024-05-12 19:59:24          1       77          77
     55      .4    4% | 2utgtqyrt3vag cursor: pin S wait on X       2024-05-12 19:56:57 2024-05-12 19:59:24          1       39          39
     36      .2    3% | 2utgtqyrt3vag library cache: mutex X        2024-05-12 19:56:59 2024-05-12 19:59:13          1       33          33
     35      .2    3% |               SQL*Net break/reset to client 2024-05-12 19:56:54 2024-05-12 19:59:24          1       32          32
     14      .1    1% |               library cache: mutex X        2024-05-12 19:57:08 2024-05-12 19:59:14          1       12          12
      7      .0    1% |                                             2024-05-12 19:57:24 2024-05-12 19:59:17          1        7           7
      2      .0    0% | 2utgtqyrt3vag cursor: mutex S               2024-05-12 19:58:23 2024-05-12 19:58:23          1        1           1
      2      .0    0% | cbs6jb3jmg9nm                               2024-05-12 19:57:31 2024-05-12 19:59:20          2        2           2
      2      .0    0% |               control file sequential read  2024-05-12 19:57:26 2024-05-12 19:57:32          1        2           2
      1      .0    0% | 2utgtqyrt3vag library cache: bucket mutex X 2024-05-12 19:59:24 2024-05-12 19:59:24          1        1           1
12 rows selected.
--//sql_id=2utgtqyrt3vag,我前面有计算.执行脚本源代码在最后.

SYS@test> @ sql_id 2utgtqyrt3vag
--SQL_ID = 2utgtqyrt3vag
--//查询不到sql语句,我估计我同事在这里给搞昏了.
--//如果当时查询到sql语句,我估计定位很快,不会走许多弯路....

SYS@test> @ sharepool/shp4x 2utgtqyrt3vag 0
TEXT                  KGLHDADR         KGLHDPAR         C40                          KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0         KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16   N0_6_16     N20   KGLNAHSH KGLOBT03      KGLOBT09
--------------------- ---------------- ---------------- ---------------------------- -------- -------- -------- ---------------- -------- -------- -------- -------- --------- ------- ---------- ------------- --------
..
child handle address  000007FF11A10938 000007FF000E6070 select count(1) from deptxxx        0        0       57 00               00              0        0  3561717   3561717 3561717 2945576271 2utgtqyrt3vag     4374
child handle address  000007FF11F45AD8 000007FF000E6070 select count(1) from deptxxx        0        0        3 00               00              0        0  3561717   3561717 3561717 2945576271 2utgtqyrt3vag     4375
parent handle address 000007FF000E6070 000007FF000E6070 select count(1) from deptxxx        1        0   275975 000007FF11F91680 00        3563000        0        0   3563000 3563000 2945576271 2utgtqyrt3vag    65535
4377 rows selected.
--//我的测试产生大量子光标.估计 kksfbc child completion,cursor: pin S wait on X与这个因素有关

SYS@test> @ wcx sysdate-3/86400 sysdate
-- Display ASH Wait Chain Signatures script v0.7 by Tanel Poder ( http://blog.tanelpoder.com )
%This  SECONDS AAS WAIT_CHAIN                                                                                                                                 FIRST_SEEN          LAST_SEEN
------ ------- --- ------------------------------------------------------------------------------------------------------------------------------------------ ------------------- -------------------
   7%        2  .7 -> ,,@=>17,23902,@1=>library cache lock                                                                                                    2024-05-12 20:04:57 2024-05-12 20:04:58
   7%        2  .7 -> 179,16416,@1=>181,3323,@1=>library cache lock -> 17,23902,@1=>179,16416,@1=>library cache lock -> ,,@=>17,23902,@1=>library cache lock  2024-05-12 20:04:57 2024-05-12 20:04:58
   7%        2  .7 -> 179,16416,@1=>258,12330,@1=>library cache lock -> 17,23902,@1=>179,16416,@1=>library cache lock -> ,,@=>17,23902,@1=>library cache lock 2024-05-12 20:04:57 2024-05-12 20:04:58
   7%        2  .7 -> 17,23902,@1=>179,16416,@1=>library cache lock -> ,,@=>17,23902,@1=>library cache lock                                                   2024-05-12 20:04:57 2024-05-12 20:04:58
   7%        2  .7 -> 179,16416,@1=>175,11537,@1=>library cache lock -> 17,23902,@1=>179,16416,@1=>library cache lock -> ,,@=>17,23902,@1=>library cache lock 2024-05-12 20:04:57 2024-05-12 20:04:58
   7%        2  .7 -> 179,16416,@1=>97,50538,@1=>library cache lock -> 17,23902,@1=>179,16416,@1=>library cache lock -> ,,@=>17,23902,@1=>library cache lock  2024-05-12 20:04:57 2024-05-12 20:04:58
   7%        2  .7 -> 179,16416,@1=>18,48560,@1=>library cache lock -> 17,23902,@1=>179,16416,@1=>library cache lock -> ,,@=>17,23902,@1=>library cache lock  2024-05-12 20:04:57 2024-05-12 20:04:58
   7%        2  .7 -> 179,16416,@1=>262,10796,@1=>library cache lock -> 17,23902,@1=>179,16416,@1=>library cache lock -> ,,@=>17,23902,@1=>library cache lock 2024-05-12 20:04:57 2024-05-12 20:04:58
   7%        2  .7 -> 179,16416,@1=>98,33150,@1=>library cache lock -> 17,23902,@1=>179,16416,@1=>library cache lock -> ,,@=>17,23902,@1=>library cache lock  2024-05-12 20:04:57 2024-05-12 20:04:58
   7%        2  .7 -> 179,16416,@1=>176,47654,@1=>library cache lock -> 17,23902,@1=>179,16416,@1=>library cache lock -> ,,@=>17,23902,@1=>library cache lock 2024-05-12 20:04:57 2024-05-12 20:04:58
   3%        1  .3 -> ,,@=>175,11537,@1=>kksfbc child completion                                                                                              2024-05-12 20:04:59 2024-05-12 20:04:59
   3%        1  .3 -> ,,@=>18,48560,@1=>                                                                                                                      2024-05-12 20:04:59 2024-05-12 20:04:59
   3%        1  .3 -> 18,48560,@1=>176,47654,@1=>library cache lock -> ,,@=>18,48560,@1=>                                                                     2024-05-12 20:04:59 2024-05-12 20:04:59
   3%        1  .3 -> 18,48560,@1=>98,33150,@1=>library cache lock -> ,,@=>18,48560,@1=>                                                                      2024-05-12 20:04:59 2024-05-12 20:04:59
   3%        1  .3 -> 18,48560,@1=>17,23902,@1=>library cache lock -> ,,@=>18,48560,@1=>                                                                      2024-05-12 20:04:59 2024-05-12 20:04:59
   3%        1  .3 -> 18,48560,@1=>258,12330,@1=>library cache lock -> ,,@=>18,48560,@1=>                                                                     2024-05-12 20:04:59 2024-05-12 20:04:59
   3%        1  .3 -> 18,48560,@1=>97,50538,@1=>library cache lock -> ,,@=>18,48560,@1=>                                                                      2024-05-12 20:04:59 2024-05-12 20:04:59
   3%        1  .3 -> ,,@=>181,3323,@1=>kksfbc child completion                                                                                               2024-05-12 20:04:59 2024-05-12 20:04:59
   3%        1  .3 -> 18,48560,@1=>179,16416,@1=>library cache lock -> ,,@=>18,48560,@1=>                                                                     2024-05-12 20:04:59 2024-05-12 20:04:59
19 rows selected.
--//出现大量library cache lock阻塞.

SYS@test> @ ashtop event 1=1 sysdate-5/86400 sysdate
  Total                                                                                                      Distinct Distinct    Distinct
Seconds     AAS %This   EVENT                   FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
------- ------- ------- ----------------------- ------------------- ------------------- ---------- -------- -----------
     38     7.6   79% | library cache lock      2024-05-12 20:05:52 2024-05-12 20:05:56          1        5           5
      4      .8    8% | library cache: mutex X  2024-05-12 20:05:54 2024-05-12 20:05:55          1        2           2
      3      .6    6% | kksfbc child completion 2024-05-12 20:05:52 2024-05-12 20:05:56          1        3           3
      3      .6    6% |                         2024-05-12 20:05:52 2024-05-12 20:05:56          1        3           3
--// kksfbc child completion 应该与产生大量子光标有关,为什么不是很清楚,生产系统我没有看到,也许不在前30条.

SYS@test> @ ashtop sql_id,event,p1,p2,p3 "event like 'library cache%'" sysdate-5/86400 sysdate
  Total                                                                                                                                  Distinct Distinct    Distinct
Seconds AAS %This   SQL_ID        EVENT                              P1             P2      P3 FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
------- --- ------- ------------- ---------------------- -------------- -------------- ------- ------------------- ------------------- ---------- -------- -----------
      3  .6    6% | 2utgtqyrt3vag library cache lock      8792101725488  8792090672984 5373954 2024-05-12 20:07:02 2024-05-12 20:07:06          1        3           3
      2  .4    4% | 2utgtqyrt3vag library cache lock      8792101725488  8791800107672 5373954 2024-05-12 20:07:04 2024-05-12 20:07:06          1        2           2
      2  .4    4% | 2utgtqyrt3vag library cache lock      8792101725488  8791808899128 5373954 2024-05-12 20:07:03 2024-05-12 20:07:05          1        2           2
      2  .4    4% | 2utgtqyrt3vag library cache lock      8792101725488  8792090306696 5373954 2024-05-12 20:07:03 2024-05-12 20:07:04          1        2           2
      2  .4    4% | 2utgtqyrt3vag library cache lock      8792101725488  8792156248984 5373954 2024-05-12 20:07:04 2024-05-12 20:07:05          1        2           2
      2  .4    4% | 2utgtqyrt3vag library cache lock      8792101725488  8792156687152 5373954 2024-05-12 20:07:03 2024-05-12 20:07:05          1        2           2
      2  .4    4% | 2utgtqyrt3vag library cache: mutex X     3468241561              0 5374033 2024-05-12 20:07:04 2024-05-12 20:07:05          1        2           2
      2  .4    4% | 2utgtqyrt3vag library cache: mutex X     3468241561   768799145984 5374033 2024-05-12 20:07:03 2024-05-12 20:07:03          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8791798282960 5373954 2024-05-12 20:07:02 2024-05-12 20:07:02          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8791798283256 5373954 2024-05-12 20:07:05 2024-05-12 20:07:05          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8791798284016 5373954 2024-05-12 20:07:06 2024-05-12 20:07:06          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8791800107376 5373954 2024-05-12 20:07:05 2024-05-12 20:07:05          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8791800107376 5373955 2024-05-12 20:07:03 2024-05-12 20:07:03          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8791800107968 5373954 2024-05-12 20:07:02 2024-05-12 20:07:02          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8791808899720 5373954 2024-05-12 20:07:04 2024-05-12 20:07:04          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8791808900480 5373954 2024-05-12 20:07:06 2024-05-12 20:07:06          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792090307920 5373954 2024-05-12 20:07:05 2024-05-12 20:07:05          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792090308384 5373954 2024-05-12 20:07:02 2024-05-12 20:07:02          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792090671928 5373954 2024-05-12 20:07:04 2024-05-12 20:07:04          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792100505400 5373954 2024-05-12 20:07:05 2024-05-12 20:07:05          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792100505992 5373954 2024-05-12 20:07:04 2024-05-12 20:07:04          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792100506752 5373954 2024-05-12 20:07:02 2024-05-12 20:07:02          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792102509568 5373954 2024-05-12 20:07:03 2024-05-12 20:07:03          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792102509864 5373954 2024-05-12 20:07:04 2024-05-12 20:07:04          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792102510920 5373955 2024-05-12 20:07:05 2024-05-12 20:07:05          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792156249912 5373954 2024-05-12 20:07:03 2024-05-12 20:07:03          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792156250208 5373955 2024-05-12 20:07:02 2024-05-12 20:07:02          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792156250672 5373954 2024-05-12 20:07:06 2024-05-12 20:07:06          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792156687784 5373954 2024-05-12 20:07:02 2024-05-12 20:07:02          1        1           1
      1  .2    2% | 2utgtqyrt3vag library cache lock      8792101725488  8792156688376 5373954 2024-05-12 20:07:06 2024-05-12 20:07:06          1        1           1
30 rows selected.

--//记住library cache lock的P1=8792101725488,library cache: mutex X P1=3468241561
--//8792101725488 = 0x7ff1219a530
--//5373954 = /2^16  %2^16 (Type | Mode) = 82,2 = 0x520002 ,82 表示SQL AREA BUILD.
--//前面计算的sql语句hash_value(10) = 2945576271,而等待事件的P1,P2,P3并没有与之相关.

SYS@test> select distinct kglhdnsp,kglhdnsd,kglobtyd from x$kglob  where KGLHDNSP=82 order by 1;
      KGLHDNSP KGLHDNSD       KGLOBTYD
-------------- -------------- -------------
            82 SQL AREA BUILD CURSOR

SYS@test> @ ev_name "library cache%"
EVENT#   EVENT_ID NAME                              PARAMETER1     PARAMETER2   PARAMETER3         WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS  DISPLAY_NAME
------ ---------- --------------------------------- -------------- ------------ ------------------ ------------- ----------- ----------- ----------------------------------
   342 2802704141 library cache pin                 handle address pin address  100*mode+namespace    3875070507           4 Concurrency library cache pin
   343  916468430 library cache lock                handle address lock address 100*mode+namespace    3875070507           4 Concurrency library cache lock
   344 2952162927 library cache load lock           object address lock address 100*mask+namespace    3875070507           4 Concurrency library cache load lock
   345 1646780882 library cache: mutex X            idn            value        where                 3875070507           4 Concurrency library cache: mutex X
   346 2601513493 library cache: bucket mutex X     idn            value        where                 3875070507           4 Concurrency library cache: bucket mutex X
   347 2382371857 library cache: dependency mutex X idn            value        where                 3875070507           4 Concurrency library cache: dependency mutex X
   348 2446268751 library cache: mutex S            idn            value        where                 3875070507           4 Concurrency library cache: mutex S
  1361  800384622 library cache revalidation                                                          1893977003           0 Other       library cache revalidation
  1362 1578286316 library cache shutdown                                                              1893977003           0 Other       library cache shutdown
9 rows selected.
--//library cache lock的P1表示handle address,看看是怎么对象.
--//library cache: mutex X的P1表示idn,我以前理解对应hash_vale.可以是sql语句或者某个对象的hash_value.
--//Tanel Poder有1篇文档,Oracle_Latch_And_Mutex_Contention_Troubleshooting.pdf
library cache: mutex* wait events
1) library cache hash bucket number (if idn <= 131072)
2) idn = hash value of the library cache object under protection (if idn >  131072)
--//一点疑问,如果hash value<=131072(2^17)呢?

--//library cache lock的P1表示handle address,看看是怎么对象.
SYS@test> @ fchaz 0x7ff1219a530
LOC KSMCHPTR               KSMCHIDX       KSMCHDUR KSMCHCOM               KSMCHSIZ KSMCHCLS       KSMCHTYP KSMCHPAR         KSMCHPTR_END
--- ---------------- -------------- -------------- ---------------- -------------- -------- -------------- ---------------- -----------------
SGA 000007FF1219A500              1              1 KGLHD                       856 recr                 80 00               000007FF1219A857

--//000007FF1219A500+0x30 = 8792101725488 = 0x7ff1219a530,实际上正好等于@ fchaz 0x7ff1219a530的查询地址.
--//如果熟悉以前学习可以知道开始的偏移0x30(48字节)就是handle address,顺便说一下我这里是测试环境,
--//执行tpt fcha脚本会报错或者要么很慢,生产系统共享池很大,扫描会很慢.我使用我改写fchaz,取消执行前的警告提示.

SYS@test> @ sharepool/shp4 7ff1219a530 0
SYS@test> @ prxx
==============================
TEXT                          : parent handle address
KGLHDADR                      : 000007FF1219A530
KGLHDPAR                      : 000007FF1219A530
C40                           : 2d65f9b7af91ed4f
KGLHDLMD                      : 2
KGLHDPMD                      : 0
KGLHDIVC                      : 0
KGLOBHD0                      : 00
KGLOBHD6                      : 00
KGLOBHS0                      : 0
KGLOBHS6                      : 0
KGLOBT16                      : 0
N0_6_16                       : 0
N20                           : 0
KGLNAHSH                      : 3468241561
KGLOBT03                      :
KGLOBT09                      : 0
PL/SQL procedure successfully completed.
--//看到的对象是2d65f9b7af91ed4f,而不是DEPTXXX.
--//注:如果生产系统执行以上语句可能报错或者很慢,实际上选择hash_value=3468241561,使用shp4x.sql脚本查询,就没有这个问题.

--//2d65f9b7af91ed4f ,我检索发现正好对应sql语句的 full_hash_value(16)的后16位.
--//取后8位计算 af91ed4f = 2945576271,正好对应sql语句的hash_value之.
--//而且KGLNAHSH正好等于library cache: mutex X 的P1=3468241561
--//说明是library cache: mutex X导致大量library cache lock.

$ ./sql_idz.sh  'select count(1) from deptxxx'  0
sql_text = select count(1) from deptxxx\0
full_hash_value(16) = AA0B8A5E997323CE2D65F9B7AF91ED4F
hash_value(10) = 2945576271
sql_id(32) = 2utgtqyrt3vag
sql_id(32) = 2utgtqyrt3vag
sql_id(32) = 2utgtqyrt3vag

SYS@test> @ lcl
display  library cache lock problem

INST_ID SADDR            HANDLE            MOD  REQ OBJECT               SQL_ID            HASH_VALUE KGLNAOBJ         USER_NAME C50
------- ---------------- ---------------- ---- ---- -------------------- ------------- -------------- ---------------- --------- --------------------------------------------------
      1 000007FF09EF26B8 000007FF1219A530    2    0 2d65f9b7af91ed4f     1sym80r7bkant     3468241561 2d65f9b7af91ed4f SCOTT     alter system kill session '98,36220' immediate;
display wait library cache lock

SID        SERIAL# SPID     PID      P_SERIAL# EVENT              C50
--- -------------- ---- ------- -------------- ------------------ --------------------------------------------------
264          53720 7040      27             34 library cache lock alter system kill session '264,53720' immediate;
 18          58858 2812      64             14 library cache lock alter system kill session '18,58858' immediate;
 97          45103 6488      65              9 library cache lock alter system kill session '97,45103' immediate;
176          47333 4044      66             12 library cache lock alter system kill session '176,47333' immediate;
262          33120 6588      67             10 library cache lock alter system kill session '262,33120' immediate;
 17          50789 6304      68              9 library cache lock alter system kill session '17,50789' immediate;
 98          36220 4768      69              8 library cache lock alter system kill session '98,36220' immediate;
258          12758 2828      71             23 library cache lock alter system kill session '258,12758' immediate;
8 rows selected.

SYS@test> @ sql_id 1sym80r7bkant
--SQL_ID = 1sym80r7bkant

--//还是看不到sql语句.也许这是问题的难点,实际上对象是2d65f9b7af91ed4f.
--//kill这些library cache lock进程没有任何用处,因为程序还在跑.
--//实际上如果当时查询x$kglob视图,KGLOBT03=2utgtqyrt3vag,就可以获得sql语句,一看就明白问题在那里,重写建立表就ok了.

SYS@test> select * from v$db_object_cache where name = '2d65f9b7af91ed4f'
  2  @ prxx
==============================
OWNER                         : $BUILD$
NAME                          : 2d65f9b7af91ed4f
DB_LINK                       :
NAMESPACE                     : SQL AREA BUILD
TYPE                          : CURSOR
SHARABLE_MEM                  : 0
LOADS                         : 0
EXECUTIONS                    : 0
LOCKS                         : 7
PINS                          : 0
KEPT                          : NO
CHILD_LATCH                   : 76441
INVALIDATIONS                 : 0
HASH_VALUE                    : 3468241561
LOCK_MODE                     : SHARED
PIN_MODE                      : NONE
STATUS                        : UNKOWN
TIMESTAMP                     :
PREVIOUS_TIMESTAMP            :
LOCKED_TOTAL                  : 850974
PINNED_TOTAL                  : 0
PROPERTY                      :
FULL_HASH_VALUE               : 53270f034126313b1c7a6805ceb92a99
CON_ID                        : 3
CON_NAME                      : TEST01P
ADDR                          : 000007FF1219A530
EDITION                       :
PL/SQL procedure successfully completed.
--//NAMESPACE=SQL AREA BUILD,select distinct kglhdnsp,kglhdnsd,kglobtyd from x$kglob  where KGLHDNSP=82 order by 1;
--//kglhdnsp=82 , 对应8进制是\01222
--//3468241561 % 2^17 = 76441,对应CHILD_LATCH =76441.
--//注意OWNER=$BUILD$,我使用SCOTT计算sql_id不对.使用我以前写sql_idx.sh脚本.

$ echo -n -e '2d65f9b7af91ed4f.$BUILD$.TEST01P' > cc.txt

$ ./sql_idz.sh  cc.txt  1 '\0122\0\0\0'
sql_text = 2d65f9b7af91ed4f.$BUILD$.TEST01P\0122\0\0\0
full_hash_value(16) = 53270F034126313B1C7A6805CEB92A99
hash_value(10) = 3468241561
sql_id(32) = 1sym80r7bkant
sql_id(32) = 1sym80r7bkant
sql_id(32) = 1sym80r7bkant

--//基本都能对上前面select * from v$db_object_cache where name = '2d65f9b7af91ed4f'的的输出.
--//注:我改写我原来写的脚本,因为cat 文件里面包含chr(0),cat的输出就忽略掉.

--//82 ascii码 R,注意使用dbms_sql_translator包计算不用加chr(0),这样对于表少1个chr(0).
SELECT dbms_sql_translator.sql_id ('2d65f9b7af91ed4f.$BUILD$.TEST01PR'||chr(0)||chr(0)) c20,
dbms_sql_translator.sql_hash ('2d65f9b7af91ed4f.$BUILD$.TEST01PR'||chr(0)||chr(0)) N20
FROM dual;
C20                         N20
-------------------- ----------
1sym80r7bkant        3468241561

--//也能对上.

4.总结:
--//我已经基本展示生产系统出现的问题,还是不明白为什么这样会产生大量的子光标.

--//在分析sql语句时或许与产生大量子光标有关,在对象2d65f9b7af91ed4f上存在争用,NAMESPACE = SQL AREA BUILD,导致
--//出现library cache: mutex X,library cache lock.

--//另外我做了测试,如果打开几个回话,手工执行select count(1) from deptxxx;当然不是并发执行,并没有产生多个子光标的情况.
--//也许问题就出在密集的执行产生大量子光标上面.

--//在测试前我以为阻塞的位置要么与sql语句的hash_value有关,要么与deptxxx对象有关,甚至在shared pool latch上存在争用,
--//因为错误的sql语句每次存在硬解析,实际的情况都不是,而在NAMESPACE = SQL AREA BUILD,建立的对象上存在争用.
--//还有一些细节我需要验证,好好消化,写的有点乱...

--//我估计同事看到sql_id后查询不到对应sql语句,而不断的kill进程并不会有助于问题解决,在这上面浪费大量时间,而且实际上
--//阻塞的时间都很短.
--//实际上只要查询底层的x$kglob的,KGLOBT03=2utgtqyrt3vag,就可以获得sql语句,一看就明白问题在那里,至少能发现表没有建立.
--//实际上还可以查询v$db_object_cache的HASH_VALUE(它可以通过sql_id获得),获得对应sql语句,该视图的底层就是x$kglob.

--//贴一段生产系统看到的情况.
> @ dashtop event "event like 'library cache%'" "timestamp'2024-04-26 08:00:57'" "timestamp'2024-04-26 10:30:00'"
    Total
  Seconds     AAS %This   EVENT                                      FIRST_SEEN          LAST_SEEN
--------- ------- ------- ------------------------------------------ ------------------- -------------------
  8164610   913.0   76%   library cache lock                         2024-04-26 08:23:22 2024-04-26 09:17:44
  2587860   289.4   24%   library cache: mutex X                     2024-04-26 08:23:22 2024-04-26 09:17:44
       10      .0    0%   library cache pin                          2024-04-26 10:00:40 2024-04-26 10:00:40
--//出现问题时间点2024-04-26 08:23:22,到2024-04-26 09:17:44问题解决.后面library cache pin仅仅出现1次,可以不用考虑.

> @ dashtop event,sql_id "event='library cache lock'" "timestamp'2024-04-26 08:00:57'" "timestamp'2024-04-26 08:30:00'"
    Total
  Seconds     AAS %This   EVENT              SQL_ID        FIRST_SEEN          LAST_SEEN
--------- ------- ------- ------------------ ------------- ------------------- -------------------
   554750   318.3   96%   library cache lock arw6k2rf5s29b 2024-04-26 08:23:22 2024-04-26 08:29:55
    13880     8.0    2%   library cache lock bakhcg5b1749p 2024-04-26 08:23:22 2024-04-26 08:29:55
     2580     1.5    0%   library cache lock ddd4xgabw2tct 2024-04-26 08:23:33 2024-04-26 08:29:55
     2440     1.4    0%   library cache lock 306sjy7n4m9bk 2024-04-26 08:23:22 2024-04-26 08:29:55
     2300     1.3    0%   library cache lock av7t0b1v7jn1m 2024-04-26 08:23:22 2024-04-26 08:29:55
      440      .3    0%   library cache lock 69zcqdq405z1h 2024-04-26 08:25:31 2024-04-26 08:29:55
      420      .2    0%   library cache lock dgvzbsr848vam 2024-04-26 08:25:09 2024-04-26 08:29:55
      410      .2    0%   library cache lock bg1t2pc5ym090 2024-04-26 08:24:15 2024-04-26 08:29:55
      350      .2    0%   library cache lock 0j7bs1g3fg66x 2024-04-26 08:23:33 2024-04-26 08:29:55
      310      .2    0%   library cache lock 7yhjdqcg8wzny 2024-04-26 08:23:22 2024-04-26 08:29:55
      300      .2    0%   library cache lock 4f03m8k9vgb6r 2024-04-26 08:23:43 2024-04-26 08:29:55
      250      .1    0%   library cache lock 9bsd8hfq3cf81 2024-04-26 08:23:54 2024-04-26 08:29:55
      200      .1    0%   library cache lock 5xw2vsz1868zh 2024-04-26 08:25:31 2024-04-26 08:29:55
       20      .0    0%   library cache lock 899c5c7ug4dp4 2024-04-26 08:23:22 2024-04-26 08:23:22
14 rows selected.

> @ sqlhh arw6k2rf5s29b 100
time unit : millisecond
BEGIN_INTERVAL_TIME    INST_ID SQL_ID        PLAN_HASH_VALUE EXECUTIONS ELA_MS_PER_EXEC CPU_MS_PER_EXEC ROWS_PER_EXEC LIOS_PER_EXEC BLKRD_PER_EXEC IOW_MS_PER_EXEC  AVG_IOW_MS CLW_MS_PER_EXEC APW_MS_PER_EXEC CCW_MS_PER_EXEC
------------------- ---------- ------------- --------------- ---------- --------------- --------------- ------------- ------------- -------------- --------------- ----------- --------------- --------------- ---------------
2024-04-26 11:00:15          1 arw6k2rf5s29b      3673589541     135628               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-26 12:00:17          1 arw6k2rf5s29b      3673589541     125952               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-26 13:00:36          1 arw6k2rf5s29b      3673589541     117259               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-26 14:00:13          1 arw6k2rf5s29b      3673589541     121757               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-26 15:00:15          1 arw6k2rf5s29b      3673589541     131134               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-26 16:00:35          1 arw6k2rf5s29b      3673589541     135313               0               0           0.0             0              0               0         0.0               0               0               0
...
2024-04-29 02:00:20          1 arw6k2rf5s29b      2199259672      54386               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-29 03:00:39          1 arw6k2rf5s29b      2199259672      52685               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-29 04:00:08          1 arw6k2rf5s29b      2199259672      52485               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-29 05:00:17          1 arw6k2rf5s29b      2199259672      52623               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-29 06:00:37          1 arw6k2rf5s29b      2199259672      51764               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-29 07:00:04          1 arw6k2rf5s29b      2199259672      56257               0               0           0.0             0              0               0         0.0               0               0               0
2024-04-29 09:00:35          1 arw6k2rf5s29b      2199259672     127381               0               0           0.0             0              0               0         0.0               0               0               0
47 rows selected.
--//可以发现1个细节,我无法解析,9:17恢复系统,很奇怪的是9:17-11:00并没有大量执行.而之后有记录.
--//要么就是9,10点执行次数很少,没有写入awr相关历史表中,要么就是这个过程中程序升级回退了.
--//最奇怪的涉及查询返回0,我查看相关表现在的情况表中没有任何记录,似乎再2024-04-29 09:00:35之后某个时刻发现问题,不再执行.
--//我估计取消了升级与改动,我们团队缺乏必要的交流与沟通,根本不知道开发做了什么.

--//另外有1个小技巧可能便于辅助判断,就是执行计划的SQL_PLAN_HASH_VALUE是0.
> @ dashtop sql_id,SQL_PLAN_HASH_VALUE "event like 'library cache%'" "timestamp'2024-04-26 08:00:57'" "timestamp'2024-04-26 09:30:00'"
    Total
  Seconds     AAS %This   SQL_ID        SQL_PLAN_HASH_VALUE FIRST_SEEN          LAST_SEEN
--------- ------- ------- ------------- ------------------- ------------------- -------------------
  9898240  1852.6   92%   arw6k2rf5s29b                   0 2024-04-26 08:23:22 2024-04-26 09:17:32
   409370    76.6    4%   bakhcg5b1749p                   0 2024-04-26 08:23:22 2024-04-26 09:17:44
    81520    15.3    1%   ddd4xgabw2tct                   0 2024-04-26 08:23:33 2024-04-26 09:17:44
    59940    11.2    1%   0j7bs1g3fg66x                   0 2024-04-26 08:23:33 2024-04-26 09:17:44
    53760    10.1    0%   306sjy7n4m9bk                   0 2024-04-26 08:23:22 2024-04-26 09:17:32
    40870     7.6    0%   dgvzbsr848vam           823207121 2024-04-26 08:24:58 2024-04-26 09:17:44
    37100     6.9    0%   69zcqdq405z1h                   0 2024-04-26 08:25:20 2024-04-26 09:17:44
    36280     6.8    0%   7yhjdqcg8wzny                   0 2024-04-26 08:23:22 2024-04-26 09:17:44
    32860     6.2    0%   bg1t2pc5ym090          3916753348 2024-04-26 08:24:15 2024-04-26 09:17:44
    31400     5.9    0%   av7t0b1v7jn1m                   0 2024-04-26 08:23:22 2024-04-26 09:17:32
    17990     3.4    0%   fuspz01qnu8hd                   0 2024-04-26 08:52:28 2024-04-26 09:17:32
     8800     1.6    0%   9bsd8hfq3cf81                   0 2024-04-26 08:23:54 2024-04-26 09:17:44
     8300     1.6    0%   gc3s9xsr2v4td                   0 2024-04-26 08:44:24 2024-04-26 09:17:44
     7060     1.3    0%   c4jmjmy1hsp7t                   0 2024-04-26 08:56:21 2024-04-26 09:17:44
     4850      .9    0%   cyy3tk3dqxpf7                   0 2024-04-26 08:33:49 2024-04-26 09:17:32
...
35 rows selected.
--//实际上是SQL_PLAN_HASH_VALUE=0,基本都是表不存在的情况.
--//当然我不知道存在一种特殊情况,sql_id记录的是匿名PL/SQL块语句.这样SQL_PLAN_HASH_VALUE=0.我没有测试.

5.相关脚本:
--//lcl.sql
PROMPT
PROMPT display  library cache lock problem
PROMPT

column object format a20
column user_name format a20
SELECT inst_id
      ,kgllkses saddr
      ,kgllkhdl handle
      ,kgllkmod MOD
      ,kgllkreq REQ
      ,kglnaobj object
      ,KGLLKSQLID sql_id
      ,kglnahsh hash_value
      ,KGLNAOBJ
      ,user_name
      ,   'alter system kill session '''
       || s.sid
       || ','
       || s.serial#
       || ''''
       || ' immediate;'
          c50
  --,lock_a.*
  FROM x$kgllk lock_a, v$session s
 WHERE    s.saddr = lock_a.kgllkses and
 kgllkmod > 0
       AND EXISTS
              (SELECT lock_b.kgllkhdl
                 FROM x$kgllk lock_b
                WHERE     kgllkses IN (SELECT saddr
                                         FROM v$session
                                        WHERE event like 'library cache lock') /* blocked session */
                                        --WHERE event like 'library cache pin') /* blocked session */
                      AND lock_a.kgllkhdl = lock_b.kgllkhdl
                      AND kgllkreq > 0);

PROMPT
PROMPT display wait library cache lock
PROMPT
SELECT s.sid
      ,s.serial#
      ,p.spid
      ,p.pid
      ,p.serial# p_serial#
      ,s.event
      ,   'alter system kill session '''
       || s.sid
       || ','
       || s.serial#
       || ''''
       || ' immediate;'
          c50
  FROM v$session s, v$process p
 WHERE s.paddr = p.addr
AND s.event= 'library cache lock';
--AND s.event= 'library cache pin';


--//shp4.sql
column N0_6_16 format 99999999
column fcura_addrlen new_value _fcura_addrlen

set termout off
select vsize(addr)*2 fcura_addrlen from x$dual;
set termout on

SELECT DECODE (kglhdadr,
               kglhdpar, 'parent handle address',
               'child handle address')
          text,
       kglhdadr,
       kglhdpar,
       substr(kglnaobj,1,40) c40,
       KGLHDLMD,
       KGLHDPMD,
       kglhdivc,
       kglobhd0,
       kglobhd6,
       kglobhs0,kglobhs6,kglobt16,
       kglobhs0+kglobhs6+kglobt16 N0_6_16,
       kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6+kglobt16 N20,
       kglnahsh,
       kglobt03 ,
       kglobt09  
  FROM x$kglob
 WHERE
    KGLHDPAR = lpad(upper('&1'), &_fcura_addrlen, '0')
or  KGLHDADR = lpad(upper('&1'), &_fcura_addrlen, '0')
or  KGLOBHD0 = lpad(upper('&1'), &_fcura_addrlen, '0')
--or  KGLOBHD1 = lpad(upper('&1'), &_fcura_addrlen, '0')
--or  KGLOBHD2 = lpad(upper('&1'), &_fcura_addrlen, '0')
--or  KGLOBHD3 = lpad(upper('&1'), &_fcura_addrlen, '0')
--or  KGLOBHD4 = lpad(upper('&1'), &_fcura_addrlen, '0')
--or  KGLOBHD5 = lpad(upper('&1'), &_fcura_addrlen, '0')
or  KGLOBHD6 = lpad(upper('&1'), &_fcura_addrlen, '0')
or  KGLOBT03 = lower('&1')
or  KGLNAHSH= &2;

--//shp4x.sql
column N0_6_16 format 99999999
SELECT /*+ USE_CONCAT(@"SEL$1" 8 OR_PREDICATES(1)) */ DECODE (kglhdadr,
               kglhdpar, 'parent handle address',
               'child handle address')
    text,
       kglhdadr,
       kglhdpar,
       substr(kglnaobj,1,40) c40,
       KGLHDLMD,
       KGLHDPMD,
       kglhdivc,
       kglobhd0,
       kglobhd6,
       kglobhs0,kglobhs6,kglobt16,
       kglobhs0+kglobhs6+kglobt16 N0_6_16,
       kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6+kglobt16 N20,
       kglnahsh,
       kglobt03,
       kglobt09  
  FROM x$kglob
 WHERE kglobt03 = lower('&1') or KGLNAHSH= &2;

--//sql_idz.sh
#! /bin/bash
# calcucate sql_text of full_hash_value(16),hash_value(10),sql_id(32).
# argv1 sql statement or sql of text file
# argv2 flag: 0= sql statement 1=sql of text file for sqlplus  2=sql of text file for other 3=original
# argv3 default = '\0' add tailstr

odebug=${ODEBUG:-0}
oflag=${2:-0}
tailstr=${3:-'\0'}

if [ $oflag -eq 0 ]
then
    sql_text=${1}${tailstr}
fi

# sqlplus format sql_text
if [ $oflag -eq 1 ]
then
sql_text="$( cat $1 | sed -e "s/
$//" -e "s/\s*$//" -e '$s/;$//')""${tailstr}"
# sql_text="$( cat $1 | unix2dos | sed '$s/;\s*$//')"'\0'
# sql_text="$( cat $1 | sed -e "s/
$//" -e sed '$s/;\s*$//')"'\0'
# sql_text="$( cat $1 | sed '$s/;\s*$//')"'\0'
fi

# other format sql_text
if [ $oflag -eq 2 ]
then
sql_text="$( cat $1 | sed '$s/;\s*$//')""${tailstr}"
# sql_text="$( cat $1 | unix2dos | sed '$s/;\s*$//')"'\0'
# sql_text="$( cat $1 | sed -e "s/
$//" -e '$s/;\s*$//')"'\0'
# sql_text="$( cat $1 | sed '$s/;\s*//')"'\0'
fi

# exact_matching_signature, force_matching_signature
if [ $oflag -eq 3 ]
then
    sql_text=${1}
fi

v1=$(echo -e -n "$sql_text" | md5sum | sed 's/  -//' | xxd -r -p | od -t x4 |  sed   -n  -e 's/^0\+ //' -e 's/ //gp' | tr 'a-z' 'A-Z')
v2=${v1:(-16):16}
v3=${v2:(-8):8}
# v2=$(echo "obase=16;ibase=16; $v1 % 10000000000000000" | bc| tr -d '\\\r\n')
# v3=$(echo "obase=10;ibase=16; $v1 % 100000000" | bc| tr -d '\\\r\n')

if [ $odebug -eq 1 ] ; then
        echo v1=$v1 v2=$v2 v3=$v3
fi

echo "sql_text = $sql_text"
echo "full_hash_value(16) = $v1 or ${v1,,}"

if [ $oflag -eq 3 ] ; then
    echo "xxxxx_matching_signature(10) = $(( 16#$v2 )) or " $(echo $(( 16#$v2 )) + 2^64|bc )
fi

echo "hash_value(10) = $(( 16#$v3 )) "

BASE32=($(echo {0..9} {a..z} | tr -d 'eilo'))
res=''
for i in $(echo "obase=32;ibase=16; $v2" | bc| tr -d '\\\r\n')
do
        res=${res}${BASE32[$(( 10#$i ))]}
done
echo "sql_id(32) = $(printf "%13s" $res | tr ' ' '0')"
echo "sql_id(32) = $(printf "%013s" $res)"

res1=$(eval $(echo "obase=32;ibase=16; $v2" | bc| tr -d '\\\r\n' | awk 'BEGIN{RS=" +"; printf "echo " }/./{printf "${BASE32[$(( 10#%02d))]}", $1}' ))
echo "sql_id(32) = $(printf "%013s" $res1)"

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3015887/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969593