如何通过用户名查找最近10个oracle查询?

时间:2011-03-21 20:40:12

标签: sql oracle

不确定这是否可行。我10克。最终结果如下:

Username      | Date/Time            | sqltext 
jdoe          | 3/21/11 10:32:27     | select sum(total) from sales where in_date > '08-JAN-11' 
jdoe          | 3/21/11 10:32:21     | delete from products_old 
jdoe          | 3/21/11 10:32:18     | select item, description from products where item = 'blah' 
jdoe          | 3/21/11 10:32:06     | select count(item) from products 
jdoe          | 3/21/11 10:31:44     | describe products

看起来v $ sql几乎(?)存储了所有发送过的sql查询,但我加入了什么来获取用户名和日期?

2 个答案:

答案 0 :(得分:6)

如果您拥有企业版和性能及调优包(否则查询AWR表会违反您的许可),V$ACTIVE_SESSION_HISTORY视图将是您最接近的视图。这将每秒捕获每个活动会话正在执行的内容。如果您的用户每秒执行许多SQL语句,或者您的SQL语句足够快以至于它们在特定的第二个边界内不活动,则不会捕获每个查询。如果您只是尝试对特定用户已完成的最后10件事进行一般性抽样(偏向于捕获更长时间运行的查询),那么AWR应该足够了。但是,如果您正在尝试执行跟踪用户在会话中执行的操作,则AWR将不合适。

如果要捕获用户所做的一切,您需要跟踪会话。这将导致在服务器上生成相当庞大的跟踪文件,您可以使用tkprof实用程序进行汇总。但这要求您在执行感兴趣的SQL之前启用特定会话的跟踪 - 这不是可以追溯执行的事情。

如果您只对会话所做的更改感兴趣,可以使用LogMiner浏览重做日志以查看用户正在执行的操作。这可以追溯完成,但由于SELECT语句不会生成REDO,因此它们不会写入重做日志,并且对LogMiner不可见。

答案 1 :(得分:1)

如果您使用的是JDBC,则始终可以使用Log4jdbc wrapper library。它将所有jdbc活动记录到 - 你猜对了 - log4j。

您可以为多种事件类型配置日志级别,它显示发出的sql(将绑定变量替换为其值)和计时信息。我一直都在使用它。