[20210903]探究mutex的值.txt --//前一段时间做library_cache转储时,在bucket后面跟着Mutex,类似信息如下。 Bucket: #=102650 Mutex=0x80528f40(0, 19, 0, 6) --//注:11g 下每个library cache bucket占用16字节,后面跟着mutex,mutex结构占用24字节,这样整个占用40字节。可以参考我前面 --//的测试 [20210524]分析library cache转储 3.txt --//我可以通过oradebug poke相应地址,然后dump确定mutex地址后面括号的值来自那里。 --//在测试前先贴一个以前的oradebug peek的内容: SYS@book> oradebug peek 0x80528f40 40 [080528F40, 080528F68) = 00000001 00000000 0000092B 00042180 000190FA 00000006 80528F58 00000000 80528F58 00000000 --//我当时推断0000092B=>表示get, 00042180=>表示sleep,000190FA=102650=>表示bucket值,最后00000006 不知道. --//前面括号里面的内容猜测应该对应00000001,0000092B,00042180,00000006,也就是0~3,8~11,12~15,20~23字节. --//我记忆里0-3=>表示mutex阻塞的sid,4~7=>表示并发访问的数量。 --//通过例子验证看看. 1.环境: SCOTT@book> @ ver1 PORT_STRING VERSION BANNER ------------------------------ -------------- -------------------------------------------------------------------------------- x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production SCOTT@book> select * from dept where deptno=20; DEPTNO DNAME LOC ---------- -------------- ------------- 20 RESEARCH DALLAS --//执行5次以上。 SCOTT@book> @ hash HASH_VALUE SQL_ID CHILD_NUMBER HASH_HEX ---------- ------------- ------------ --------- 95129850 80baj2c2ur47u 0 5ab90fa --//95129850%131072 = 102650 SYS@book> @ tix New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_27978_0001.trc SYS@book> oradebug setmypid Statement processed. SYS@book> oradebug dump library_cache 10; Statement processed. 2.测试: --//首先我不知道为什么最后1个值总是6,可以简单通过如下命令验证。 $ awk '/^Bucket:/{print $6}' book_ora_27978_0001.trc | uniq -c 4322 6) --//以前的测试我就知道这样的情况,为什么是6我不是很清楚,表示什么更加不清楚。 $ awk '/^Bucket:/{print $3}' book_ora_27978_0001.trc | cut -d"(" -f2|uniq -c 4322 0, --//第1个总是0.我估计表示阻塞会话的sid. --//检索转储文件.查询字串Bucket: #=102650,发现如下: Bucket: #=102650 Mutex=0x80528f40(0, 5, 0, 6) SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000000 00000000 00000005 00000000 000190FA 00000000 --//执行如下: oradebug poke 0x0000000080528f40 4 0x00000000 oradebug poke 0x0000000080528f44 4 0x00000000 oradebug poke 0x0000000080528f48 4 0x00000030 oradebug poke 0x0000000080528f4c 4 0x00000004 oradebug poke 0x0000000080528f50 4 0x000190FA oradebug poke 0x0000000080528f54 4 0x00000007 --//注:我反复测试多次,前面两个poke如果不是0,dump library_cache时挂起!! SYS@book> @ spid SID SERIAL# PROCESS SERVER SPID PID P_SERIAL# C50 ---------- ---------- ------------------------ --------- ------ ------- ---------- -------------------------------------------------- 44 33 27977 DEDICATED 27978 27 11 alter system kill session '44,33' immediate; --//打开新会话执行如下: SYS@book> @ wait P1RAW P2RAW P3RAW P1 P2 P3 SID SERIAL# SEQ# EVENT STATUS STATE WAIT_TIME_MICRO SECONDS_IN_WAIT WAIT_CLASS CLIENT_INFO ---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------------------------------- -------- ------------------- --------------- --------------- -------------------- -------------------- 0000000000019000 0000000200000001 000000000000001F 102400 8589934593 31 44 33 83 library cache: mutex X INACTIVE WAITING 2633137 3 Concurrency --//8589934593 = /2^16 %2^16 (Type | Mode) = 131072,1 = 0x200000001(与我poke的值一样) SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000000 00000000 00000030 00000004 00019000 00000007 ############################################# --//小插曲,前面有一次计算地址错误,修改oradebug poke 0x0000000080528f4d 4 0x00000004,导致修改错误. SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000000 00000000 00000030 00000400 000190FA 00000007 ~~~~~~~~ --//注意看下划!!!! ############################################# SYS@book> oradebug poke 0x0000000080528f4c 4 0x00000004 BEFORE: [080528F4C, 080528F50) = 00000004 AFTER: [080528F4C, 080528F50) = 00000004 SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000000 00000000 00000030 00000004 000190FA 00000007 SYS@book> @ tix New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_27978_0003.trc SYS@book> oradebug dump library_cache 10; Statement processed. --//检索转储文件.查询字串Bucket: #=102650,发现如下: Bucket: #=102650 Mutex=0x80528f40(0, 50, 4, 6) SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000000 00000000 00000036 00000004 000190FA 00000000 --// 0x36 = 54 3.继续重来: SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000000 00000000 0000003B 00004890 000190FA 00000000 oradebug poke 0x0000000080528f44 4 0x00000002 oradebug poke 0x0000000080528f48 4 0x00000055 oradebug poke 0x0000000080528f4c 4 0x00200004 oradebug poke 0x0000000080528f50 4 0x000190FA oradebug poke 0x0000000080528f54 4 0x00000077 SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000000 00000002 00000055 00200004 000190FA 00000077 SYS@book> @ tix New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_28288_0001.trc SYS@book> oradebug dump library_cache 8; --//挂起. --//打开新session. SYS@book> @ wait P1RAW P2RAW P3RAW P1 P2 P3 SID SERIAL# SEQ# EVENT STATUS STATE WAIT_TIME_MICRO SECONDS_IN_WAIT WAIT_CLASS CLIENT_INFO ---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------------------------------- -------- ------------------- --------------- --------------- -------------------- -------------------- 00000000000190FA 0000000200000000 000000000000001F 102650 8589934592 31 44 35 78 library cache: mutex X INACTIVE WAITING 20259070 20 Concurrency SYS@book> select * from v$mutex_sleep_history where mutex_identifier=102650 2 @ prxx ============================== MUTEX_IDENTIFIER : 102650 SLEEP_TIMESTAMP : 2021-09-07 10:10:24.439911 MUTEX_TYPE : Library Cache GETS : 85 --//85 = 0x55 SLEEPS : 1589412 --//1589412 = 0x1840a4 REQUESTING_SESSION : 44 BLOCKING_SESSION : 2 LOCATION : kgldmc1 31 --//我总感觉这个location不熟悉缩略写,很难猜测问题在那里. MUTEX_VALUE : 0000000200000000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ P1 : 0 P1RAW : 00 P2 : 0 P3 : 0 P4 : 0 P5 : --//在打开新会话,执行如下: SYS@book> oradebug setmypid Statement processed. SYS@book> oradebug poke 0x0000000080528f44 4 0x00000000 BEFORE: [080528F44, 080528F48) = 00000002 AFTER: [080528F44, 080528F48) = 00000000 SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000000 00000000 00000056 0020225A 000190FA 00000000 --//检索转储文件.查询字串Bucket: #=102650,发现如下: Bucket: #=102650 Mutex=0x80528f40(0, 86, 2105946, 6) --//86 = 0x56 --//2105946 = 0x20225a --//可以基本确定8~11,12~15 对应gets,sleep3.似乎转储后最后4位会变成0.我估计后面6应该就是对应20~23字节. --//基本可以确定mutex括号里面的内容猜测应该对应第一位不知道,8~11,12~15,20~23字节. SCOTT@book> select * from v$mutex_sleep_history where mutex_identifier=102650 2 @ prxx ============================== MUTEX_IDENTIFIER : 102650 SLEEP_TIMESTAMP : 2021-09-07 09:47:26.770924 MUTEX_TYPE : Library Cache GETS : 57 SLEEPS : 1580510 REQUESTING_SESSION : 44 BLOCKING_SESSION : 2 LOCATION : kgldmc1 31 MUTEX_VALUE : 0000000200000000 P1 : 0 P1RAW : 00 P2 : 0 P3 : 0 P4 : 0 P5 : PL/SQL procedure successfully completed. 4.继续: SYS@book> oradebug setmypid Statement processed. SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000000 00000000 00000059 00202A39 000190FA 00000000 SYS@book> oradebug poke 0x0000000080528f40 4 0x0000001 BEFORE: [080528F40, 080528F44) = 00000000 AFTER: [080528F40, 080528F44) = 00000001 SYS@book> oradebug peek 0x80528f40 24 [080528F40, 080528F58) = 00000001 00000000 00000059 00202A39 000190FA 00000000 --//59 = 89 --//00202A39 = 2107961 --//打开新session: SCOTT@book> @ spid SID SERIAL# PROCESS SERVER SPID PID P_SERIAL# C50 ---------- ---------- ------------------------ --------- ------ ------- ---------- -------------------------------------------------- 295 11 28515 DEDICATED 28516 21 6 alter system kill session '295,11' immediate; SCOTT@book> select * from dept where deptno=20; --//挂起. SYS@book> select * from v$mutex_sleep_history where mutex_identifier=102650 2 @ prxx MUTEX_IDENTIFIER : 102650 SLEEP_TIMESTAMP : 2021-09-07 10:33:43.614413 MUTEX_TYPE : Library Cache GETS : 89 SLEEPS : 2077854 REQUESTING_SESSION : 295 BLOCKING_SESSION : 0 LOCATION : kglhdgn1 62 MUTEX_VALUE : 0000000000000001 P1 : 0 P1RAW : 00 P2 : 0 P3 : 0 P4 : 0 P5 : PL/SQL procedure successfully completed. SYS@book> @ wait P1RAW P2RAW P3RAW P1 P2 P3 SID SERIAL# SEQ# EVENT STATUS STATE WAIT_TIME_MICRO SECONDS_IN_WAIT WAIT_CLASS CLIENT_INFO ---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------------------------------- -------- ------------------- --------------- --------------- -------------------- -------------------- 00000000000190FA 0000000000000001 000000000000003E 102650 1 62 295 11 63427 library cache: mutex X ACTIVE WAITING 666 0 Concurrency --//放弃,探究有点乱. 5.总结: --//前面两个poke如果不是0,dump library_cache时总是挂起!! --//基本确定8~11,12~15 对应gets,sleep3,也就是例如:Bucket: #=102650 Mutex=0x80528f40(0, 19, 0, 6),第2,3数字表示gets,sleeps数量.
[20210903]探究mutex的值.txt
来源:这里教程网
时间:2026-03-03 17:00:18
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- Oracle 21C下载和安装
Oracle 21C下载和安装
26-03-03 - oracle11g安装 单实例 系统centos7
oracle11g安装 单实例 系统centos7
26-03-03 - Oracle 19c- 19.8应用32242453补丁
Oracle 19c- 19.8应用32242453补丁
26-03-03 - 延迟块清除导致rac节点传输undo header块
延迟块清除导致rac节点传输undo header块
26-03-03 - 怎么给多个视频添加相同的滚动字幕内容呢
怎么给多个视频添加相同的滚动字幕内容呢
26-03-03 - 有什么简单快速获取天猫上商品详情图的方法吗?
有什么简单快速获取天猫上商品详情图的方法吗?
26-03-03 - 商家如何制作互动小游戏活跃气氛 吸引粉丝?
商家如何制作互动小游戏活跃气氛 吸引粉丝?
26-03-03 - kill session ORA-00031
kill session ORA-00031
26-03-03 - 农夫山泉挺赚钱
农夫山泉挺赚钱
26-03-03 - 中通财报:“增收不增利”怪圈难破
中通财报:“增收不增利”怪圈难破
26-03-03
