如何按用户名查找最近的10个Oracle查询?

10

不确定是否可能。我在使用 10g 版本。最终的结果应该是这样的:

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查询,但我该连接什么来获取用户名和日期?


1
V$SESSION维护用户名。http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2088.htm - ukhardy
2个回答

6
如果你拥有企业版和性能调整包(否则查询AWR表将违反你的许可证),V$ACTIVE_SESSION_HISTORY视图将是你能得到的最接近的内容。这将在每秒钟捕获每个活动会话正在执行的内容。然而,如果你有一个用户每秒执行多个SQL语句,或者你的SQL语句足够快以至于它们不会跨越特定的秒边界处于活动状态,那么并不是每个查询都会被捕获。如果你只是想获取特定用户最近做过的10件事情的一般抽样(有偏向于捕获运行时间较长的查询),那么AWR应该就足够了。但是,如果你想要像跟踪用户会话一样追踪用户在做什么,那么AWR就不适用了。
如果你想捕获用户所做的每一件事情,你需要跟踪会话。这将导致在服务器上生成一个相当庞大的跟踪文件,你可以使用tkprof实用程序对其进行总结。但这需要在执行感兴趣的SQL之前为特定会话启用跟踪,它不是可以事后完成的。
如果你只对会话所做的更改感兴趣,你可以使用LogMiner查看重做日志,以了解用户在做什么。这可以事后完成,但由于SELECT语句不会生成REDO,它们将不会被写入重做日志,并且对LogMiner来说是不可见的。

1
如果您正在使用JDBC,您可以随时使用Log4jdbc包装库。它会将所有jdbc活动记录到-log4j中。
您可以为多个事件类型配置日志级别,它显示发出的SQL(用绑定变量替换其值)和时间信息。我一直在使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接