正在插入数据,但在v$sql表中找不到查询历史。 (甲骨文 11g 11.2.0.2.0)

问题描述 投票:0回答:1

我试图找到一个将数据插入特定表的 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表就可以插入数据?

java spring oracle scheduler
1个回答
0
投票

正如 pmdba 提到的,

v$sql
是不稳定的。 DDL 永远不会出现,其他游标会根据需要删除。但是正如您所说的每分钟都在查询,您当然应该看到您的 SQL。

  1. 首先,您只询问最近加载的游标。您的插入可能在几个月前首先被解析并加载到共享池中。我不记得

    LAST_ACTIVE_TIME
    是否已经在 11.2 中引入,但如果是,请改用它并查看最后几分钟。否则,删除日期过滤器。

  2. 其次,您提到您正在加入

    v$session
    ,尽管您上面的SQL 没有显示这一点。不要加入
    v$session
    - 插入会话可能非常短并且不再存在。如果您需要查看(最近的)历史记录,您可以在知道
    v$active_session_history
    后查询
    SQL_ID

  3. 第三,查看是否是集群RAC数据库(查询

    gv$instance
    ,如果超过一行,说明是RAC)。如果是,则需要使用
    gv$sql
    ,而不是
    v$sql
    ,因为您可能在与应用程序连接到的实例不同的实例上进行查询。

  4. 第四,您可以使用

    MERGE
    语句插入行,因此也要检查这些行......而不仅仅是
    INSERT
    .

  5. 第五,你要找的是表名,但是你可以通过同义词或者视图来插入。查找指向表的任何同义词,或表上的任何视图,并检查插入或合并到它们中。

  6. 最后,检查 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
然后弄清楚为什么您的查询没有找到它。

希望这些想法有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.