我试图找到一个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表的情况下插入数据?
1条答案
按热度按时间wwwo4jvm1#
正如pmdba提到的,
v$sql
是不稳定的。DDL永远不会出现,其他游标会根据需要删除。但是正如您所说的,您每分钟都在查询,您当然应该看到您的SQL。1.首先,你只要求最近加载的游标。有可能你的insert是在几个月前第一次被解析并加载到共享池的。我不记得
LAST_ACTIVE_TIME
是否已经在11.2中引入了,但是如果是,请使用它并查看最近几分钟。否则,请删除日期过滤器。1.其次,你提到你正在加入
v$session
,尽管你上面的SQL没有显示。不要加入v$session
-插入会话可能很短并且不再存在。如果你需要查看(最近的)历史记录,你可以在知道SQL_ID
后查询v$active_session_history
。1.第三,找出它是否是一个集群RAC数据库(查询
gv$instance
,如果你得到多个行,你在RAC中)。如果你是,你将需要使用gv$sql
,而不是v$sql
,因为你可能是在一个不同的示例上查询,而不是应用程序连接到。1.第四,您可以使用
MERGE
语句插入行,因此也要检查这些行......而不仅仅是INSERT
。1.第五,您正在查找表名,但您可以通过同义词或视图插入。查找指向表的任何同义词,或表上的任何视图,并检查插入或合并到其中。
1.最后,检查v$sql_plan,这样你就可以在实际的物理表名上得到一个正匹配:
如果找到了它,获取
sql_id
并在gv$sql
中查找,然后找出为什么查询找不到它。希望这些想法有所帮助。