Oracle 19c实时SQL监控跟踪存储过程执行进度
Oracle19c中SQL监控视图只自动监控执行时间超过5秒、并行执行或添加监控提示的SQL,不直接显示存储过程整体进度。可通过相关视图查看已处理行数来近似判断进度,使用跟踪工具可进行事后分析。真正可靠的方法是在存储过程中调用DBMS_APPLICATION_INFO设置进度信息。
如何判断存储过程是否被SQL Monitor自动捕捉
首先明确核心要点:Oracle 19c 的 v$sql_monitor 并不会追踪所有存储过程,它仅对满足特定条件的SQL自动启用监控。判断依据非常清晰:单条SQL的CPU+I/O时间若达到或超过5秒,或者使用了并行执行,又或者显式添加了 /*+ MONITOR */ 提示——只要满足任意一条,监控便会自动启动。

这里有一个容易忽略的陷阱:如果存储过程中全是短小快速的DML语句,例如每条UPDATE仅运行几毫秒,即使整个存储过程执行了十几分钟,也可能完全不会出现在 V$SQL_MONITOR 中。原因很简单——监控触发点在于「单条语句」层面,而非「整个过程」层面。
- 想知道当前哪些会话正在被监控?直接查询:
SELECT sql_id, status, elapsed_time, cpu_time, sql_text FROM v$sql_monitor WHERE status = 'EXECUTING'; - 确认某条SQL是否带有MONITOR提示:
SELECT sql_fulltext FROM v$sql WHERE sql_id = 'xxx';,查看开头是否存在/*+ MONITOR */ - 如果未命中自动条件,但又必须监控,可以在调用前手动添加提示,例如:
EXEC /*+ MONITOR */ your_procedure_name;
如何通过V$SQL_MONITOR查看正在执行的语句位置
坦白说,V$SQL_MONITOR 并不直接告诉你“执行到了第几行”,但它能清晰反映当前正在运行哪条SQL、卡在哪一步、消耗了多少资源。真正意义上的“进度”,是通过 sql_id 和 sql_exec_start 对应的那条语句来体现的,而不是看存储过程名称。
很多人误以为查询 V$SQL_MONITOR 时使用 sql_text LIKE '%过程名%' 就能捕捉到,结果往往为空。原因很简单:这里存储的是最终解析后的SQL文本,而非PL/SQL源码。存储过程体中的 INSERT INTO t SELECT ... 才能被监控,而 FOR i IN 1..1000 LOOP 这类循环控制逻辑,根本不会进入视图。
- 定位当前执行语句:
SELECT sql_id, sql_text, status, elapsed_time/1000000 elapsed_sec, px_servers_requested FROM v$sql_monitor WHERE session_id = SYS_CONTEXT('USERENV', 'SID') AND status = 'EXECUTING'; - 配合
V$SQL_PLAN_MONITOR查看具体操作步进:SELECT operation, options, start_time, end_time, output_rows FROM v$sql_plan_monitor WHERE sql_id = 'xxx' AND plan_line_id > 0 ORDER BY first_refresh_time; - 特别注意
output_rows字段:对于INSERT/SELECT类语句,它代表已处理行数;对于UPDATE/DELETE则代表已修改行数——这应该是目前最接近“进度”概念的量化指标了
为什么TKPROF或SQL_TRACE无法实时看到进度
ALTER SESSION SET SQL_TRACE = TRUE; 生成的 .trc 文件本质上是用于事后分析的,内容需要等执行完全结束后才会落盘。当你在运行存储过程时打开该文件,只能看到零星的初始化记录,真正的SQL执行块、绑定变量、统计信息都要等到过程结束后才能写入。
更麻烦的是,.trc 文件的默认路径由 user_dump_dest 决定,但19c默认启用了ADRCI和自动诊断库,跟踪文件实际存放在 $ORACLE_BASE/diag/rdbms/ 下,文件名形如 ,不再是以前那种直观的 ora*.trc 了。
- 想确认当前会话的跟踪文件路径?执行:
SELECT value FROM v$diag_info WHERE name = 'Default Trace File'; - 不要指望在运行过程中 tail -f 该文件——即使文件在写入,内容也是按块缓冲的,并且完全没有结构化进度标记
- 真正想实时抓取中间状态,唯一可靠的方法是让存储过程自己主动输出:使用
DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS在循环中更新sofar字段,然后查询V$SESSION_LONGOPS
DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS 是唯一可靠的进度反馈方式
Oracle官方并未提供类似“查看PL/SQL行号执行位置”的接口。V$SESSION_LONGOPS 是目前唯一支持主动上报进度的机制,但它有一个硬性前提:你必须提前在存储过程中埋下监控点,而不是开启一个开关就能生效。
典型用法是:在大循环开始时调用 SET_SESSION_LONGOPS 进行初始化,每次迭代后调用它更新 sofar,最后再调用一次标记完成。如果未做这些操作,那么查询 V$SESSION_LONGOPS 返回的结果将为空。
- 初始化示例:
DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS(rindex => longops_rindex, slno => 0, opname => 'MY_PROC', target_desc => 'Processing records', sofar => 0, totalwork => 10000); - 循环中更新:
DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS(rindex => longops_rindex, sofar => i); - 查询进度:
SELECT opname, target_desc, sofar, totalwork, round(sofar/totalwork*100,1) pct_done FROM v$session_longops WHERE sofar < totalwork; - 注意:rindex 是返回值,必须在后续调用中复用;totalwork 必须是确定值,不能是动态的 COUNT(*) 结果——否则无法预估进度
如果没有预先埋点,只能退而求其次:使用 V$SQL_MONITOR 查看当前SQL的耗时和输出行数,或者依靠 V$SESSION 的 last_call_et 粗略判断“该会话已经运行了多久”。但要精确知道执行到了哪一行逻辑——抱歉,这是无法实现的。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
自增主键值从何而来?深入理解原理,告别只会auto_increment
KingbaseES推荐使用serial、bigserial、显式sequence或identity列实现自增主键。serial创建integer并关联序列,bigserial对应bigint;显式sequence可自定义起始值等参数;identity有generatedbydefault(允许指定值)与always(禁止)两种模式。
Linux下瀚高数据库授权文件过期及替换解决方案
在银河麒麟系统下,瀚高数据库hgdb-4 5试用授权20天到期后需替换正式授权文件。正确操作:停止服务,备份旧文件,将授权文件复制到 opt highgo hgdb-4 5 etc lic 并命名为hgdb lic,设置权限600和属主highgo:highgo,再启动服务。禁止直接修改data目录下的license info文件。
Oracle BLOB实时同步的5大技术挑战与难点解析
OracleBLOB实时同步面临分片组装、多列隔离、长事务跨窗口、事务回滚及大对象资源控制等技术挑战,必须在日志中精确还原完整字段值,才能保证源端与目标端数据完全一致,这对同步系统的稳健性提出了高要求。
MySQL禁用redo日志导致全备失败
MySQL全量备份失败是由于数据定义语言操作触发排序索引构建,禁用重做日志导致XtraBackup无法获取一致性备份。测试验证表明,优化表语句即使无数据也会触发该问题。根本原因在于排序索引构建过程跳过了重做日志记录,破坏了备份的一致性。
Kafka架构图优化与改进的全面详细步骤与实践指南
Kafka作为实时数据流处理的核心中间件,其底层架构虽已相当成熟,但在实际生产环境中,要充分发挥其性能潜力,仍需落实到具体的调优与架构改造上。核心目标可归纳为三点:如何承载更高的吞吐量、如何保障数据不丢失、以及故障发生时如何快速恢复。本文将从这几个关键方向出发,深入探讨如何真正榨干Kafka集群的性
- 热门数据榜
相关攻略
2026-07-25 22:22
2026-07-25 22:22
2026-07-25 22:22
2026-07-25 20:35
2026-07-25 20:35
2026-07-25 20:35
2026-07-25 20:35
2026-07-25 19:38
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

