当前位置: 首页 > SQL > 正文

我们的文章会在微信公众号IT民工的龙马人生博客网站 ( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

一、脚本背景与历史

1.1 开发背景

今天这个脚本是在Oracle数据库中用得最多的一个脚本,也是我学习其它数据库时,会写的第一个脚本,它就是we.sql,查询活动会话的信息和统计活动会话的信息。这个脚本是在原来OLM公司的we.sql的脚本的基础上修改而来的。在Oracle数据库环境中,实时了解当前活跃会话的状态、等待事件、资源消耗、运行时长等信息对于性能调优和故障诊断至关重要。特别对于初中级的Oracle DBA,认真研究这个脚本,并弄明白显示的每一列的含义,对于我们数据库运维的提升是有非常大帮助的。

1.2 兼容性支持

此脚本支持Oracle数据库的多个版本,目前对于我自己来上,最少也在上千个数据库环境中运行过,个人觉得是非常好用的。

  • Oracle 10g (10.2及以上)
  • Oracle 11g (11.2及以上)
  • Oracle 12c (12.1及以上)

1.3 脚本的目的

此脚本的目的是帮助我们提升工作的效率,而非帮助我们解决故障和处理性能。

1.4 脚本的获取

关注公众号,后台回复“脚本”二字,已经关注并回复过的就直接群里面下载即可。

二、核心功能特性

2.1 实时会话监控

we.sql脚本的核心功能是提供Oracle数据库活动会话的实时监控,主要包括:

  1. 会话状态监控:显示当前所有活跃会话的详细状态
  2. 等待事件分析:识别会话正在等待的资源或事件
  3. 资源消耗统计:监控会话的CPU使用情况和执行时间
  4. 阻塞关系分析:显示会话间的阻塞关系
  5. 多维度统计:按程序、用户、机器、事件等维度进行统计

2.2 过滤条件

脚本内置了一些过滤机制,自动排除了一些没有太多监控的干扰进程,如果特殊情况下需要开启,请自行修改脚本。

  • 系统后台进程(LogMiner、OGG等)
  • 自身监控会话
  • 无意义的等待事件

三、脚本的执行结果

脚本在编写过程中考虑到14寸屏幕大小,所以对现实的每一列都进行了慎重的考虑,精挑细选的,基本上选出来的每一列都有其很重的价值。

10:59:09]                                                USERNMAE
[10:59:09]                                                LAST_CALL              SESS_SERIAL               STATUS                            BLOCK_SESS      RUN   CLIENT                           ROW_WAIT
[10:59:09]C  I EVENT              PROGRAM                 SEQ#                   OSPID                     STATE      COM SQL_ID             INST:SESS       TIME  OSUSER_MACHINE_PRO               FILE#:OBJ#:BLOCK#:ROW#
[10:59:09]- -- ------------------ ----------------------- ---------------------- ------------------------- ---------- --- ------------------ --------------- ----- -------------------------------- ----------------------
[10:59:09]0  1 [CPU]:             oracle@19crac1 (PPA7)   SYS|0|14               252:63393:13627           A.S.0MS    SEL C.8and70m9xxm3x:0                  0     oracle@19crac2@13627.SYSU        -1:0:0:0
[10:59:09]     OFS idle           oracle@19crac1 (OFSD)   SYS|5.0K|1.7K          1587:12836:6335           A.W.2.2S   UNK P.dzbggb6bmyfdx:                   4.99K oracle@19crac1@6335_6336.SYSB    -1:0:0:0
[10:59:09]0  2 [CPU]:             oracle@19crac2 (PPA7)   SYS|0|2                1347:54672:27057          A.S.0MS    SEL C.8and70m9xxm3x:0                  0     oracle@19crac2@27057.SYSU        -1:0:0:0
[10:59:09]     PX Deq: Execute Re sqlplus@19crac2 (TNS V  SYS|0|1.2K             2202:51495:27752          A.W.0MS    SEL C.8and70m9xxm3x:0                  0     oracle@19crac2@27751.SYSU        5214:1:12689:0
[10:59:09]     enq: TX - row lock sqlplus@19crac2 (TNS V  SYS|125|31             2079:47766:27712          A.W..12KS  UPD C.advv9x87qu2z5:0  F.1.1229        125   oracle@19crac2@27711.SYSU        74452:7:372:4
[10:59:09]     enq: TX - row lock sqlplus@19crac2 (TNS V  SYS|135|113            1957:9963:27689           A.W..13KS  UPD C.f0nmj1qk2tawj:0  F.1.1229        135   oracle@19crac2@27688.SYSU        74452:7:372:3
[10:59:09]     OFS idle           oracle@19crac2 (OFSD)   SYS|253|124            1587:4163:26535           A.W.532MS  UNK P.dzbggb6bmyfdx:                   241   oracle@19crac2@26535_265.SYSB    -1:0:0:0
[10:59:09]
[10:59:09]7 rows selected.
[10:59:09]
[10:59:09]
[10:59:09]C  I PROGRAM                        USERNAME            HCOUNT
[10:59:09]- -- ------------------------------ --------------- ----------
[10:59:09]0  1 oracle@19crac1 (OFSD)          SYS                      1
[10:59:09]     oracle@19crac1 (PPA7)          SYS                      1
[10:59:09]0  2 oracle@19crac2 (OFSD)          SYS                      1
[10:59:09]     oracle@19crac2 (PPA7)          SYS                      1
[10:59:09]     sqlplus@19crac2 (TNS V1-V3)    SYS                      3
[10:59:09]
[10:59:09]
[10:59:09]C  I MACHINE                  HCOUNT
[10:59:09]- -- -------------------- ----------
[10:59:09]0  1 19crac1                       1
[10:59:09]     19crac2                       1
[10:59:09]0  2 19crac2                       5
[10:59:09]
[10:59:09]
[10:59:09]C  I SQL_ID             COMMAND                  HCOUNT
[10:59:09]- -- ------------------ -------------------- ----------
[10:59:09]0  1 5msh29mwvwkh1      SELECT                        1
[10:59:09]                        UNKNOWN                       1
[10:59:09]0  2 5msh29mwvwkh1      SELECT                        2
[10:59:09]     advv9x87qu2z5      UPDATE                        1
[10:59:09]                        UNKNOWN                       1
[10:59:09]     f0nmj1qk2tawj      UPDATE                        1
[10:59:09]
[10:59:09]6 rows selected.
[10:59:09]
[10:59:09]
[10:59:09]C  I EVENT                                    SQL_ID                 HCOUNT
[10:59:09]- -- ---------------------------------------- ------------------ ----------
[10:59:09]0  1 [CPU]:                                   7ahy1vpa4m69f               1
[10:59:09]     OFS idle                                                             1
[10:59:09]0  2 OFS idle                                                             1
[10:59:09]     enq: TX - row lock contention            advv9x87qu2z5               1
[10:59:09]     PX Deq: Execute Reply                    7ahy1vpa4m69f               1
[10:59:09]     enq: TX - row lock contention            f0nmj1qk2tawj               1
[10:59:09]     [CPU]:                                   7ahy1vpa4m69f               1
[10:59:09]
[10:59:09]7 rows selected.
[10:59:09]
[10:59:09]
[10:59:09]C  I EVENT                                        HCOUNT
[10:59:09]- -- ---------------------------------------- ----------
[10:59:09]0  1 OFS idle                                          1
[10:59:09]     [CPU]:                                            1
[10:59:09]0  2 enq: TX - row lock contention                     2
[10:59:09]     PX Deq: Execute Reply                             1
[10:59:09]     OFS idle                                          1
[10:59:09]     [CPU]:                                            1
[10:59:09]
[10:59:09]6 rows selected.

四、核心列详解

4.1 会话标识信息

CON_ID (容器ID)

  • 作用:在Oracle 12c多租户环境中标识PDB容器
  • 显示格式:C列,显示容器编号
  • 重要性:在多租户环境中区分不同PDB的会话

INST_ID (实例ID)

  • 作用:在RAC环境中标识数据库实例
  • 显示格式:I列,显示实例编号
  • 重要性:在集群环境中定位具体实例

OS_SESS (操作系统会话)

  • 作用:显示Oracle会话对应的操作系统进程信息,主要为后续查询详细的会话和为KILL OS 进程做准备。
  • 显示格式SID:SERIAL#:OSPID
  • 重要性:用于操作系统级别的进程管理

4.2 会话状态信息

STATUS (状态)

  • 作用:主要的目的是了解会话的状态。
  • 状态类型
    • A:ACTIVE(活跃)
    • I:INACTIVE(非活跃)
    • K:KILLED(已终止)
    • C:CACHED(缓存)
    • S:SNIPED(被清理)

STATE (状态详情)

  • 作用:显示会话的详细状态,在这列中需要与后面的数据库的等待事件和等待时间关联起来一起看
  • 状态类型
    • W:WAITING(等待中)
    • U:WAITED UNKNOWN TIME(等待时间未知)
    • S:WAITED SHORT TIME(短时间等待)
    • N:WAITED KNOWN TIME(已知等待时间)

4.3 等待事件信息

EVENT (等待事件)

  • 作用:显示会话当前等待的事件或资源,如果STATE不为WAITING是表示ON CPU上面,所以这里显示CPU。
  • 显示格式:18字符宽度,截断显示
  • 重要性:性能调优的关键指标,帮助识别瓶颈

等待时间显示

  • 微秒级精度:使用wait_time_micro字段提供高精度时间,需要与STATE的状态一起查看,快速识别等待时间的异常。
  • 智能单位转换
    • < 1秒:显示为毫秒(MS)
    • 1秒-100秒:显示为秒(S)
    • 100秒-1000秒:显示为千秒(KS)
    • > 1000秒:显示为小时(H)

4.4 用户和程序信息

U_S (用户信息)

  • 作用:显示用户名、最后调用次数和序列号,将LAST_CALL和SEQ#一起查看,可以快速的定位进程是否异常,等待事件是否异常。
  • 显示格式USERNAME|LAST_CALL|SEQ#
  • 时间单位转换
    • < 1000:直接显示秒数
    • 1000-10000:显示为K(千)
    • > 10000:显示为W(万)

PROGRAM (程序信息)

  • 作用:显示连接程序名称,主要为识别应用程序类型和来源
  • 显示格式:22字符宽度

CLIENT (客户端信息)

  • 作用:显示客户端连接信息
  • 显示格式OSUSER@MACHINE@PROCESS.SERVICE
  • 智能简化
    • Administratoradmin
    • WORKGROUP\W:
    • SYS$USERSSYSU

4.5 SQL执行信息

SQL_ID (SQL标识)

  • 作用:显示当前执行的SQL语句标识
  • 显示格式
    • 当前SQL:C.SQL_ID:CHILD_NUMBER
    • 前一个SQL:P.PREV_SQL_ID:CHILD_NUMBER
  • 重要性:SQL性能分析的关键标识

EXEC_TIME (执行时间)

  • 作用:显示SQL语句的执行时间,快速定位慢SQL语句
  • 计算方式:基于SQL_EXEC_STARTPREV_EXEC_START
  • 时间单位转换
    • < 1000秒:直接显示
    • 1000-10000秒:显示为K
    • > 10000秒:显示为W

4.6 阻塞关系信息

BLOCK_S (阻塞会话)

  • 作用:显示阻塞当前会话的其他会话
  • 显示格式
    • 最终阻塞:F.INSTANCE.SESSION
    • 直接阻塞:INSTANCE.SESSION
  • 重要性:死锁和性能问题诊断的关键信息

ROW_WAIT (行等待信息)

  • 作用:显示等待的具体数据行信息,用于TX行级别所。
  • 显示格式FILE#:OBJ#:BLOCK#:ROW#
  • 重要性:精确定位等待的具体数据

五、统计汇总功能

5.1 按程序统计

脚本提供按程序类型的会话统计,帮助识别:

  • 哪些应用程序连接最多
  • 应用程序的活跃度分布
  • 潜在的连接池问题

5.2 按机器统计

提供按客户端机器的连接统计,用于:

  • 识别高连接数的客户端
  • 网络连接分布分析
  • 客户端负载均衡评估

5.3 按命令统计

按SQL命令类型统计,帮助:

  • 识别最常用的操作类型
  • 分析应用行为模式
  • 优化数据库访问策略

5.4 按事件统计

按等待事件类型统计,用于:

  • 识别系统瓶颈
  • 性能调优重点
  • 资源竞争分析

六、总结

we.sql脚本是一个功能强大、设计精良的Oracle数据库日常运维脚本。它不仅提供了全面的会话监控功能,还通过智能的过滤和格式化机制,使得监控结果更加清晰易读。脚本的版本兼容性设计使其能够在不同版本的Oracle数据库中稳定运行,是Oracle DBA日常运维中不可或缺的脚本。

通过深入理解脚本的核心列和功能特性,数据库管理员可以更好地利用这个工具进行性能监控、故障诊断和系统优化,从而确保Oracle数据库的高效稳定运行。

——————作者介绍———————–
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)


DBA必备脚本:一键掌握数据库实时运行状态的脚本:等您坐沙发呢!

发表评论

gravatar

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen

快捷键:Ctrl+Enter