【问题标题】:Oracle Query HistoryOracle 查询历史
【发布时间】:2017-05-11 08:16:04
【问题描述】:

我的这个 Java 应用程序仍在通过 JDBC 代码与 Oracle 11g 通信。话虽如此,想在 Oracle 历史记录中检查此应用程序的查询(如果已存在)。

要查看的关键项目

  1. 完整查询(带有参数值(已解析而不是?),通过java.sql.PreparedStatement 传递)
  2. 查询时间
  3. 使用的架构
  4. 用户发起了查询

预期结果:

  • 通过 SQL Developer 运行的 SQL 查询(具有或不具有 SYSDBA 权限)返回所有关键项的键

尝试使用下面的查询,但它没有返回上面列出的关键项目:

select * from v$sql order by last_load_time desc

【问题讨论】:

  • 查看 V$SQL_BIND_CAPTURE 和 V$SQLAREA
  • 可以查询oracle历史视图。查询 v$active_session_history:这需要大约 1 小时的数据。对于较长时间的数据查询 dba_hist_active_sess_history。 sql 文本位于 dba_hist_sql_text 上。对于绑定变量,dba_hist_sqlbind 也会有所帮助。
  • 有什么快捷方式吗?还是要查看的确切查询?

标签: sql oracle jdbc oracle11g


【解决方案1】:

正如其他成员已经指出的那样,V$SQLV$SQL_BIND_CAPTUREV$SQLAREA 应该会为您提供大量关于 Java 应用程序触发的查询的信息。

请注意,它可能不是完整的年代历史。假设 Java 应用程序对数据库进行大量查询,则可能并非所有查询都存在于 V$SQL 中(例如:解析失败的查询、仅使用一次且不再在缓存中的查询等可能会丢失出去)。此外,如果查询被触发两次(使用相同或不同的绑定变量集),您将在 V$SQL 中找到最新的执行条目

如果您的目标是以完美的时间顺序查找所有查询(作为对 Java 应用程序的某种黑盒研究),那么我建议您启用特定会话的跟踪(由 V$SESSION 中的 SID, SERIAL# 标识)。这将提供多个方面的信息,包括查询触发顺序、绑定变量、查询性能等。查看this 链接以获取更多信息。可以进行不同类型和级别的信息收集。此外,它的性能开销,如果您打算在任何生产系统上使用它,请考虑这个因素

【讨论】:

  • 感谢您提供的信息,但没想到事情会如此复杂。但不能接受这个答案,因为它不足以满足 Expect Result 中所写的内容
  • 没问题,很高兴此信息可以为您指明正确的方向或帮助解决您的问题。我的意图是指出,V$SQL 可能不包含您正在寻找的所有答案。
【解决方案2】:

下面的查询应该返回您需要的信息

    select vsql.sql_text, vses.SCHEMANAME, vsql.ELAPSED_TIME, vses.USERNAME
    from v$session vses join v$sql vsql
    on vses.sql_id=vsql.sql_id
    where contdition;

【讨论】:

  • 不满足 item#1,不返回完整的 SQL 语句。不能使用SQL_FULLTEXT 列,因为它不会将通过java.sql.PreparedStatement 传递的参数转换为处理java.sql.ResultSet
  • 进一步,您能否在上面的 SQL 查询中指明要放置在 condition 上的参数,并列出关键项。
猜你喜欢
  • 2021-12-11
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多