怎么查看用户的SQL执行历史
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么查看用户的SQL执行历史相关的知识,希望对你有一定的参考价值。
参考技术A 【方法一】查询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(历史数据)
【方法三:session trace】
SQL> execute dbms_session.session_trace_enable(true,true);
PL/SQL procedure successfully completed.
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 completed.
$ 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> commit;
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,scn,timestamp,sql_redo from v$logmnr_contents where table_name='TEST2';
SQL> select username,scn,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,所以能查看的内容有限。
查看oracle 用户执行的sql语句历史记录
select * from v$sqlarea t order by t.LAST_ACTIVE_TIME desc
注意 :执行此语句等等一些相关的语句 必须具有DBA 的权限 虽然这条语句很普通 但是需要的时候很管用 能够及时查出一个人执行sql语句情况
-------oracle 查看已经执行过的sql 这些是存在共享池中的 --------->
select * from v$sqlarea t order by t.LAST_ACTIVE_TIME desc
-----------查看oracle会话----------------------------》
select * from v$session t order by t.LAST_ACTIVE_TIME desc
-------------查看oracle的权限角色------------------------------>
select * from dba_role_privs; 授予用户和其他角色的角色
select * from dba_sys_privs; 授予用户和其他角色的系统权限
select * from dba_tab_privs; 数据库中对象的所有授权
select * from user_role_privs; 查看当前用户的角色
以上是关于怎么查看用户的SQL执行历史的主要内容,如果未能解决你的问题,请参考以下文章