如何查看用户的SQL执行历史

我如何知道会话中执行了哪些SQL语句?(现在的情况比较好查,历史的呢?如何还原sql的执行场景——事务关系、执行顺序、单个SQL或存储过程)

方法1:查询v$SQL text、v$SQL area和v$SQL stats视图。

select * from v$sqlarea t其中t . PARSING _ SCHEMA _ NAME in(' SCHEMA ')order by t . LAST _ ACTIVE _ TIME desc;

#对于v$sqltext和v$sqlarea,查看共享池中的SQL,其时间索引就是其解析历史,因为共享问题导致查询可能无法完全反映执行历史。

#v$sqlstats的信息保持时间比v$sql、v$sqltext和v$sqlarea长。即使SQL已经被换出共享池,仍然可以找到它。

方法2

组合v$active _ session _ history和v$sqlarea。

#v$active_session_history这个表只是采样数据,以秒为单位进行,只包括采样点在cpu上或者在那一秒不空闲的会话统计。所以可能会不完整,会忽略一些执行时间短的SQL。此视图无法还原完整的会话历史。

# v$sql area中有已执行的SQL语句,但是没有与会话相关的信息。v$session只与当前的SQL相关联,所以它不起作用。

视图视图:dba_hist_sqlstats,dba_hist_sqltext(历史数据)

方法3:会话跟踪

SQL & gt执行DBMS _ session . session _ trace _ enable(true,true);

PL/SQL过程已成功完成。

SQL & gtselect count(*)from DBA _ hist _ SQL text;

计数(*)

-

478

SQL & gtselect * from V$sesstat其中rownum = 1;

SID统计#值

- - -

134 0 1

SQL & gt执行DBMS _ session . session _ trace _ disable();

PL/SQL过程已成功完成。

$ CD $ ORACLE _ HOME/admin/test/udump

$ ls -lrt

$ tkprof test _ ora _ 2195620 . TRC report . txt sys = no explain = no aggregate = yes

$ TERM报告。txt——该文件包括跟踪开始和停止之间所有SQL语句的执行信息、执行计划和统计信息。

方法4: logminer

只包含DML和DDL语句,不能查询select语句。此外,需要打开补充日志记录,默认情况下是不打开的。

连接/作为系统管理员

-安装LOGMINER

SQL & gt@ $ ORACLE _ HOME/RDBMS/admin/DBMS lmd . SQL;

SQL & gt@ $ ORACLE _ HOME/RDBMS/admin/dbmslm . SQL;

SQL & gt@ $ ORACLE _ HOME/RDBMS/admin/DBMS LMS . SQL;

SQL & gt@ $ ORACLE _ HOME/RDBMS/admin/PRV tlm . plb;

-打开附加日志

更改数据库添加补充日志数据;

-模拟DML操作

陈明港/...

SQL & gtselect * from test2

SQL & gt插入到test2值(7,77);

SQL & gt提交;

连接/作为系统管理员

-剪切并归档

SQL & gt更改系统开关日志文件;

SQL & gt从v$archived_log中选择名称、目标id、线程号、序列号;-最后一个是新档案。

-创建新的日志挖掘器

SQL & gt执行DBMS _ log mnr . add _ log file(log filename = & gt;/Oracle/archive _ 10g/test/test _ 1 _ 138 _ 786808434 . arc ',options = & gtDBMS _ log mnr . new);

-启动矿工

SQL & gt执行DBMS _ log mnr . start _ log mnr(options = & gt;DBMS _ logmnr . dict _ from _ online _ catalog);

-检查结果

SQL & gtcol用户名格式A8;

SQL & gt列sql _重做格式a50

SQL & gtselect用户名,scn,时间戳,SQL _ redo from v$log mnr _ contents其中table _ name = ' TEST2

SQL & gtselect用户名,scn,时间戳,SQL _ redo from v$logmnr _ contents其中用户名= ' P _陈明';

-关闭矿工

SQL & gt执行DBMS _ log mnr . end _ log mnr;

-关闭辅助日志

SQL & gtalter database删除补充日志数据;

摘要

看v$sqlarea只能看一个大概的历史,因为很多SQL是共享的。

查看ASH是不完整的,因为它是采样数据。

查看TRACE应该是最完整的,但是需要在执行SQL之前打开。

查看logminer不能查看select语句,默认系统不打开补充日志,所以可以查看的内容有限。