我试图找到一个将数据插入特定表的 Spring 计划进程, 但找不到运行 spring 应用程序的 WAS 服务器。
所以我尝试通过运行查询来跟踪 Spring 应用程序, 它可以与会话表 (v$session) 结合以获取机器名称或其他信息。
SELECT
v.SQL_TEXT,
v.PARSING_SCHEMA_NAME,
v.LAST_LOAD_TIME,
v.DISK_READS,
v.ROWS_PROCESSED,
v.ELAPSED_TIME,
v.service,
v.MODULE
FROM
v$sql v
WHERE
to_date(v.FIRST_LOAD_TIME, 'YYYY-MM-DD hh24:mi:ss')>ADD_MONTHS(trunc(sysdate, 'MM'),-2)
AND LOWER(SQL_TEXT) LIKE '%[the_table_name]%'
AND LOWER(SQL_TEXT) LIKE '%insert %'
ORDER BY
FIRST_LOAD_TIME DESC
预定进程每分钟运行一次, 但我找不到将数据插入目标表的查询。
我做错了什么吗? 或者有没有办法不用登录v$sql表就可以插入数据?
正如 pmdba 提到的,
v$sql
是不稳定的。 DDL 永远不会出现,其他游标会根据需要删除。但是正如您所说的每分钟都在查询,您当然应该看到您的 SQL。
首先,您只询问最近加载的游标。您的插入可能在几个月前首先被解析并加载到共享池中。我不记得
LAST_ACTIVE_TIME
是否已经在 11.2 中引入,但如果是,请改用它并查看最后几分钟。否则,删除日期过滤器。
其次,您提到您正在加入
v$session
,尽管您上面的SQL 没有显示这一点。不要加入 v$session
- 插入会话可能非常短并且不再存在。如果您需要查看(最近的)历史记录,您可以在知道v$active_session_history
后查询SQL_ID
。
第三,查看是否是集群RAC数据库(查询
gv$instance
,如果超过一行,说明是RAC)。如果是,则需要使用 gv$sql
,而不是 v$sql
,因为您可能在与应用程序连接到的实例不同的实例上进行查询。
第四,您可以使用
MERGE
语句插入行,因此也要检查这些行......而不仅仅是 INSERT
.
第五,你要找的是表名,但是你可以通过同义词或者视图来插入。查找指向表的任何同义词,或表上的任何视图,并检查插入或合并到它们中。
最后,检查 v$sql_plan 这样你就可以在实际的物理表名称上得到一个肯定的匹配:
SELECT *
FROM v$sql_plan
WHERE (operation LIKE '%INSERT%' OR operation LIKE '%LOAD%' OR operation LIKE '%MERGE%' OR operation LIKE '%UPSERT%')
AND object_name = '[table name]'
如果找到它,请获取
sql_id
并查看 gv$sql
然后弄清楚为什么您的查询没有找到它。
希望这些想法有所帮助。