oracle - 会话执行指定的查询

Posted

技术标签:

【中文标题】oracle - 会话执行指定的查询【英文标题】:oracle - Session execute a specified query 【发布时间】:2014-03-07 03:18:16 【问题描述】:

今天,我系统中有人更新了意外声明。所以这使我的系统运行不正确。 现在,我想看看是谁(或哪个会话)做了它。我可以在 AWR 报告中找到它吗?如果我能在 AWR 报告中找到它,它特别在哪里? 非常感谢!

【问题讨论】:

如果启用此功能,请以v$active_session_history开头 【参考方案1】:

更改可能来自多个来源,具体取决于更改方式。只有最后一个选项 Log Miner 会为您提供您想要的一切。但这也需要最大的努力。一些消息来源不会告诉你会话,但也许仅仅查看相关的 SQL 就足以找出是谁做的。

    V$SQL - 所有的 SQL 语句都进入了那里,但是它们在共享池中过期了,所以你需要快速搜索。如果他们使用了一个独特的查询,您也许可以通过 select * from v$sql where lower(sql_text) like '%table_name%'; 之类的内容找到它。 AWR - 你可能会在select * from dba_hist_sqltext where lower(sql_text) like '%table_name%'; 中找到SQL,然后如果幸运的话,你可以从select * from dba_hist_active_sess_history where sql_id = '<sql id>'; 中找到一些会话信息。仅活动会话历史记录样本活动,如果查询运行得非常快,则很有可能不会出现在其中。 闪回查询 - 如果幸运的话,UNDO 仍然存在,您可以准确地看到它与闪回查询的变化。这可能会给你准确的时间,以及发生了什么变化。 select VERSIONS_STARTSCN, VERSIONS_STARTTIME, VERSIONS_ENDSCN, VERSIONS_ENDTIME, VERSIONS_XID, VERSIONS_OPERATION, your_table.* from your_table versions between scn minvalue and maxvalue; Log Miner - 我没用过这个,但据说它是完成这项工作的完美工具。在the documentation 中了解更多信息。

【讨论】:

我发现 V$SQL 最适合我的情况。但是,我找不到谁或哪个会话执行了查询。也许是 SERVICE 专栏? 该信息不存储在 V$SQL 中。当它执行时,您可以在 V$SESSION 中找到 SQL_ID。但一般来说,这类信息只存储在 REDO 日志中,这是 Log Miner 读取的内容。它可能在其他一些来源中,但只能靠运气。 Oracle 不能将所有这些信息记录两次。

以上是关于oracle - 会话执行指定的查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 提示:ORA-00054: 资源正忙,要求指定 NOWAIT

oracle查看历史session

获取查询的运行时执行计划

oracle 怎样使用并行查询

Oracle定时查询结果输出到指定的log文件

oracle修改表字段名时报错:ORA-00054:资源正忙,但指定以NOWAIT方式获取资源,或者超时失效的问题