我们的文章会在微信公众号IT民工的龙马人生和博客网站 ( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
前天发布了Oracle获取绑定变量的字面SQL文本版本更新,其中有朋友在说这种方式获取到的是历史的绑定变量值,无法复原当前会话运行的SQL的信息。虽然说在一些特殊的情况下确认会存在这种信息,比如关闭绑定变量窥探后,就有可能因为值的分布不均衡导致走错执行计划的情况。
要想获得当前会话正在执行SQL的执行计划,在Oracle中常见有两种方法,1,SQL MONITOR功能,但是是针对运行大于几秒的SQL语句才有效,不过想看当前正在运行的SQL的绑定变量,那基本上SQL运行的时间都是大于10秒以上了。2,通过dump session的方式,我们知道会话级别的绑定变量信息回存放在PGA中,所以通过dump session的方式可以获得绑定变量。
文中的脚本获取可关注公众号后回复”脚本“获得
SQL MONITOR方式运行
当前生产环境基本上都是大于11G的版本了,通过SQL MONITOR方式来获取是最为方便的。
下面简单的模拟一下通过脚本怎么快速的获取到SQL文本。
模拟会话执行SQL:
模拟SQL长时间运行。
VARIABLE b1 NUMBER;
VARIABLE b2 NUMBER;
EXEC :b1 := TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'));
EXEC :b2 := TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'));
select count(*) from t1 a,t1 b,t1 c where a.created<TO_DATE(:b2, 'YYYYMMDDHH24MISS') and a.last_ddl_time<TO_DATE(:b1, 'YYYYMMDDHH24MISS') and a.object_id = b.object_id and a.object_id = c.object_id
获取文本
再新开一个窗口
选择PDB
SQL> @container.sql
LOGGING
FORCE
I C NAME NO FORCE OPEN_MODE STATUS OPEN_TIME SIZE_G RECOVERY_S
- - --------------- --------------- ---------- ---------- ------------------- ------- ----------
1 3 HTZ LOGGING.NO.NO READ WRITE NORMAL 2025-08-21 21:54:39 11 ENABLED
2 PDB$SEED LOGGING.NO.NO READ ONLY NORMAL 2025-08-21 21:54:39 0 ENABLED
1 CDB$ROOT .. READ WRITE 2025-08-21 21:54:39 0 ENABLED
Enter value for con_name: htz
Session altered.
查询当前活动的会话,定位前面模拟的会话,获取到sid。
SQL> @we.sql
USERNMAE
LAST_CALL SESS_SERIAL STATUS BLOCK_SESS RUN CLIENT ROW_WAIT
C I EVENT PROGRAM SEQ# OSPID STATE COM SQL_ID INST:SESS TIME OSUSER_MACHINE_PRO FILE#:OBJ#:BLOCK#:ROW#
- -- ------------------ ----------------------- ---------------------- ------------------------- ---------- --- ------------------ --------------- ----- -------------------------------- ----------------------
0 1 OFS idle oracle@arm01 (OFSD) SYS|7.0K|2.3K 129:7516:122959 A.W.1.0S UNK P.dzbggb6bmyfdx: 7.04K oracle@arm01@122959_1229.SYSB -1:0:0:0
1 [CPU]: sqlplus@arm01 (TNS V1- SYS|0|121 401:13702:207953 A.S.0MS SEL C.8and70m9xxm3x:0 0 oracle@arm01@207952.SYSU -1:0:0:0
3 [CPU]: sqlplus@arm01 (TNS V1- SYS|5|847 157:26857:194957 A.S.4525MS SEL C.46tx8ah1fx2un:0 5 oracle@arm01@194956.htz 11735:3:64494:0
获取到文本信息
SYS@HTZ@ARM19C> @sql_fulltext_mem_by_sqlid.sql
Enter value for sqlid: 46tx8ah1fx2un
Enter value for sid: 157
SYS
select from t1 a,t1 b,t1 c where a.created<TO_DATE(20250821235152, 'YYYYMMDDHH24MISS') and a.last_ddl_time<TO_DATE(5152,
'YYYYMMDDHH24MISS') and a.object_id = b.object_id and a.object_id = c.object_id
PL/SQL procedure successfully completed.
这里通过脚本sql_fulltext_mem_by_sqlid.sql可以快速的获取到当前正在执行的SQL的绑定变量的值。
——————作者介绍———————–
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)
DBA必备脚本:Oracle获取正在运行SQL的字面SQL文本:等您坐沙发呢!