java 正在插入数据,但在v$sql表中找不到查询历史记录,(Oracle 11 g 11.2.0.2.0)

relj7zay  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(288)

我试图找到一个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表的情况下插入数据?

wwwo4jvm

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,这样你就可以在实际的物理表名上得到一个正匹配:

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中查找,然后找出为什么查询找不到它。
希望这些想法有所帮助。

相关问题