您现在的位置是:首页 >

被执行人会有什么影响 怎么查看用户的SQL执行历史

火烧 2022-05-27 23:56:50 1070
怎么查看用户的SQL执行历史 如何知道一个 e io 都执行过哪些SQL语句?(查看当前比较容易,历史的呢?怎么复原 ql的执行场景——事务关系、执行序列、单SQL还是存储过程)【方法一】查询v$ q

怎么查看用户的SQL执行历史  

如何知道一个session都执行过哪些SQL语句?(查看当前比较容易,历史的呢?怎么复原sql的执行场景——事务关系、执行序列、单SQL还是存储过程)

【方法一】查询v$sqltext、v$sqlarea、v$sqlstats视图

select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('schema') order by t.LAST_ACTIVE_TIME desc;

#对v$sqltext、v$sqlarea查看的是shared pool中的SQL,其时间索引是其解析历史,因为共享的问题这个查询可能并不能完整地反映出执行的历史。

#v$sqlstats信息保留时间比v$sql、v$sqltext、v$sqlarea长,及时SQL已经换出shared pool仍然可查到

【方法二】

联合v$active_session_history和v$sqlarea

#v$active_session_history 这个表只是个取样数据,按秒进行,只有在那一秒采样点处于on cpu或非idle等待的session统计在内。

所以可能会不全,有些执行很短的SQL会忽略。

这个视图无法还原完整的session历史。

#v$sqlarea中有执行过的SQL语句,但并无到session的关联信息,v$session中只关联了当前的sql,所以也不行。

查看视图:dba_hist_sqlstats、dba_hist_sqltext(历史数据)

被执行人会有什么影响 怎么查看用户的SQL执行历史

【方法三:session trace】

SQL> execute dbms_session.session_trace_enable(true,true);

PL/SQL procedure successfully pleted.

SQL> select count(*) from dba_hist_sqltext;

COUNT(*)

----------

478

SQL> select * from V$sesstat where rownum=1;

SID STATISTIC# VALUE

---------- ---------- ----------

134 0 1

SQL> execute dbms_session.session_trace_disable;

PL/SQL procedure successfully pleted.

$ cd $ORACLE_HOME/admin/test/udump

$ ls -lrt

$ tkprof test_ora_2195620.trc report.txt sys=no explain=no aggregate=yes

$ more report.txt --这个文件包括了启停trace之间所有SQL语句的执行信息,执行计划、统计

【方法四:logminer】

只包含DML与DDL语句,不能查询select语句。

另外需要开启supplemental logging,默认是没有开启的。

conn / as sysdba

--安装LOGMINER

SQL> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql;

SQL> @$ORACLE_HOME/rdbms/admin/dbmslm.sql;

SQL> @$ORACLE_HOME/rdbms/admin/dbmslms.sql;

SQL> @$ORACLE_HOME/rdbms/admin/prvtlm.plb;

--开启附加日志

alter database add supplemental log data;

--模拟DML操作

conn p_chenming/...

SQL> select * from test2;

SQL> insert into test2 values(7,77);

SQL> mit;

conn / as sysdba

--切归档

SQL> alter system switch logfile;

SQL> select name,dest_id,thread#,sequence# from v$archived_log; --最后一个即为新的归档

--新建LOG MINER

SQL> execute dbms_logmnr.add_logfile(logfilename=>'/oracle/archive_10g/test/test_1_138_786808434.arc',options=>dbms_logmnr.new);

--开始miner

SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

--查看结果

SQL> col username format a8;

SQL> col sql_redo format a50

SQL> select username,s,timestamp,sql_redo from v$logmnr_contents where table_name='TEST2';

SQL> select username,s,timestamp,sql_redo from v$logmnr_contents where username='P_CHENMING';

--关闭MINER

SQL> execute dbms_logmnr.end_logmnr;

--关闭辅助日志

SQL> alter database drop supplemental log data;

【总结】

查看v$sqlarea只能查看粗略的历史,因为很多SQL是共享的。

查看ASH也不全,因为这是采样数据。

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

查看logminer不能查看select语句,而且默认的系统没有开启supplementing log,所以能查看的内容有限。

  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码