如果对数据库audit,就可以查到了。
解决方案 »
- Oracle 怎么把存储过程传过来的参数拼接成一个字符串啊!
- 用rs.getStirng();取库里number型字段时,若是小数,小数点前的0会丢掉!为什么?
- 物化视图的刷新机制问题
- [安装问题] Oracle 9i,点击 setup.exe 后毫无反应?
- 关于硬件报价系统数据库底层表结构的建立
- 急切想知道的问题,请大家帮忙!!!
- 大峡帮帮忙!
- 菜鸟求助: 求ORACLE9i的学习方面资料,如怎么建库,连接,。。(思维已经混乱了)
- 如何写过程
- 程序中一次要对多个库表里面的数据进行删除或修改,怎么做最安全,最理想的方法?
- 我刚学oracle,有个问题,从oracle中如何查看当前打开游标数等一些信息?
- 如何重建分区索引?
Alter session set sql_trace true|false
Or
Exec dbms_session.set_sql_trace(TRUE);3用oracle的trace功能,
这是跟踪某个session的语句:1.设置参数
sys.dbms_system.set_bool_param_in_session(
sid => 42,
serial# => 1215,
parnam => 'timed_statistics',
bval => true)sys.dbms_system.set_int_param_in_session(
sid => 42,
serial# => 1215,
parnam => 'max_dump_file_size',
intval => 2147483647)
如果上面的存储过程不运行,将其合并成一行。-- 可以不用设置该参数
'user_dump_dest',2.开始收集
exec sys.dbms_system.set_sql_trace_in_session(8,121,true);
注意,只有跟踪的session再次发出sql语句后,才会产生trc文件
3.等待一段时间,让其收集sql语句4.停止收集
exec sys.dbms_system.set_sql_trace_in_session(8,121,false);5.对产生的trace文件进行收集
tkprof dsdb2_ora_18468.trc dsdb2_trace.out SYS=NO EXPLAIN=SCOTT/TIGER
(a) tkprof tracefile.trc sort_1.prf explain=apps/your_apps_password print=10 sort='(prsqry,exeqry,fchqry,prscu,execu,fchcu)'
(b) tkprof tracefile.trc sort_2.prf explain=apps/your_apps_password print=10 sort='(prsela,exeela,fchela)'
(c) tkprof tracefile.trc sort_3.prf explain=apps/your_apps_password print=10 sort='(prscnt,execnt,fchcnt)'
(d) tkprof tracefile.trc normal.prf explain=apps/your_apps_password你可以使用oracle审计功能
你还可以访问v$sql,v$sqlarea,里面都是最近访问的sql。回复: 在oracle 8.1.7中,如何象sql的事件跟踪器一样实时跟踪应用程序对库的操作?要跟踪全部,最好在应用程序中实现
也可以用审计,logminer
审计只能跟踪sql对数据库对象的访问类型.
要跟踪实时的信息,可以查询v$session,v$sqlarea
Event 10065 - Restrict Library Cache Dump Output for State Object Dumps
The amount of library cache dump output for state object dumps can be limited using event 10065
ALTER SESSION SET EVENTS '10065 trace name context forever, level level';
where level is one of the following
Level Description
1 Address of library object only
2 As level 1 plus library object lock details
3 As level 2 plus library object handle and library object
Level 3 is the default
Event 10704 - Trace Enqueues
This event dumps information about which enqueues are being obtained
When enabled it prints out arguments to calls to ksqcmi and ksqlrl and the return values
ALTER SESSION SET EVENTS
'10704 trace name context forever, level 1';
Event 10706 - Trace Global Enqueue Manipulation
This event allows RAC global enqueue manipulation to be trace
ALTER SESSION SET EVENTS
'10706 trace name context forever, level 1';
The amount of output can be limited using the unsupported parameter '_ksi_trace'.
This parameter specifies the lock types that should be included e.g. TM, TX etc. They are specified as a string e.g. 'TMTX'
The parameter '_ksi_trace' can only be set in the initialisation file.
Event 10053 - Dump Optimizer Decisions
This event can be used to dump the decisions made by the optimizer when parsing a statement. Level 1 is the most detailed
For example
ALTER SESSION SET EVENTS
'10053 trace name context forever, level 1';
Levels are
Level Action
1 Print statistics and computations
2 Print computations only
ORA-10005: trace latch operations for debugging
你可以用
SET SERVEROUTPUT ON
DECLARE
err_msg VARCHAR2(120);
BEGIN
dbms_output.enable (1000000);
FOR err_num IN 10000..10999
LOOP
err_msg := SQLERRM (-err_num);
IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN
dbms_output.put_line (err_msg);
END IF;
END LOOP;
END;
/
来看所有的events,oracle提供了强大的跟踪工具,如果要深入了解内部机制,这些events会有帮助
You can analyze the redo log (online and archived) by using the LogMiner.
1. Create a LogMiner Dictory File
1. Create DBMS_logmnr_d & DBMS_logmnr package
using $ORACLE_HOME/rdbms/admin/DBMSLOGMNRD.sql & $ORACLE_HOME/rdbms/admin/DBMSLOGMNRD.sql
2. Shutdown Database
3. set UTL_FILE_DIR parameter into initSID.ora file
4. Startup Database
5. Create LogMiner File using
begin dbms_logmnr_d.build(
dictionary_filename => 'DB01Dict.ora',
dictionary_location => 'E:\ORANT\logminer');
end;
2. Specifying Log Files
1. New Log File
begin dbms_logmnr.add_logfile(
logfilename => 'E:\ORANT\logminer\s24.arc' ,
Options => dbms_logmnr.New);
end;
2. Add Log Files
begin dbms_logmnr.add_logfile(
logfilename => 'E:\ORANT\logminer\s24.arc' ,
Options => dbms_logmnr.AddFile);
end;
3. Remove log Files
begin dbms_logmnr.add_logfile(
logfilename => 'E:\ORANT\logminer\s24.arc',
Options => dbms_logmnr.RemoveFile);
end;
3. Start LogMiner
begin dbms_logmnr.start_logmnr(dictfilename => 'E:\ORANT\logminer\DB01Dict.ora'); end;
4. Release resource
begin dbms_logmnr.end_logmnr; end;
5. Get Result
Select * from v$logmnr_contents;
回复: 关于PL/SQL语句的跟踪!Run
\\\oracle\RDBMS\ADMIN\utlxplan.sql first
then
sql>set autotrace on
本文就SQL_TRACE的使用作简单探讨,并通过具体案例对sql_trace的使用进行说明.一、 基础介绍(a) SQL_TRACE说明SQL_TRACE可以作为初始化参数在全局启用,也可以通过命令行方式在具体session启用。
1. 在全局启用
在参数文件(pfile/spfile)中指定:
sql_trace =true
在全局启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这通常会导致比较严重的性能问题,所以在生产环境
中要谨慎使用.
提示: 通过在全局启用sql_trace,我们可以跟踪到所有后台进程的活动,很多在文档中的抽象说明,通过跟踪文件的实时变化,我们可以清晰
的看到各个进程之间的紧密协调.2. 在当前session级设置
大多数时候我们使用sql_trace跟踪当前进程.通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效),
研究SQL执行,发现后台错误等.
在session级启用和停止sql_trace方式如下:
启用当前session的跟踪:
SQL> alter session set sql_trace=true;Session altered.此时的SQL操作将被跟踪:
SQL> select count(*) from dba_users; COUNT(*)
----------
34
结束跟踪:
SQL> alter session set sql_trace=false;Session altered.
3. 跟踪其他用户进程
在很多时候我们需要跟踪其他用户的进程,而不是当前用户,这可以通过Oracle提供的系统包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION
来完成SET_SQL_TRACE_IN_SESSION过程序要提供三个参数:SQL> desc dbms_system
…
PROCEDURE SET_SQL_TRACE_IN_SESSION
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SID NUMBER IN
SERIAL# NUMBER IN
SQL_TRACE BOOLEAN IN
…
通过v$session我们可以获得sid、serial#等信息:
获得进程信息,选择需要跟踪的进程:SQL> select sid,serial#,username from v$session
2 where username is not null; SID SERIAL# USERNAME
---------- ---------- ------------------------------
8 2041 SYS
9 437 EYGLE设置跟着:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,true)PL/SQL procedure successfully completed.….
可以等候片刻,跟踪session执行任务,捕获sql操作…
….停止跟踪:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,false)PL/SQL procedure successfully completed.
(b) 10046事件说明
10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强.
10046事件可以设置以下四个级别:
1 - 启用标准的SQL_TRACE功能,等价于sql_trace
4 - Level 1 加上绑定值(bind values)
8 - Level 1 + 等待事件跟踪
12 - Level 1 + Level 4 + Level 8
类似sql_trace,10046事件可以在全局设置,也可以在session级设置。
1. 在全局设置
在参数文件中增加:
event="10046 trace name context forever,level 12"
此设置对所有用户的所有进程生效、包括后台进程.2. 对当前session设置
通过alter session的方式修改,需要alter session的系统权限:
SQL> alter session set events '10046 trace name context forever';Session altered.SQL> alter session set events '10046 trace name context forever, level 8';Session altered.SQL> alter session set events '10046 trace name context off';Session altered.
3. 对其他用户session设置
通过DBMS_SYSTEM.SET_EV系统包来实现:
SQL> desc dbms_system
...
PROCEDURE SET_EV
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SI BINARY_INTEGER IN
SE BINARY_INTEGER IN
EV BINARY_INTEGER IN
LE BINARY_INTEGER IN
NM VARCHAR2 IN...
其中的参数SI、SE来自v$session视图:
查询获得需要跟踪的session信息:SQL> select sid,serial#,username from v$session where username is not null;
SID SERIAL# USERNAME
---------- ---------- ------------------------------
8 2041 SYS
9 437 EYGLE
执行跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,8,'eygle');PL/SQL procedure successfully completed.结束跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,0,'eygle');PL/SQL procedure successfully completed. (c) 获取跟踪文件
以上生成的跟踪文件位于user_dump_dest目录中,位置及文件名可以通过以下SQL查询获得:SQL> select 2 d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name 3 from 4 ( select p.spid 5 from sys.v$mystat m,sys.v$session s,sys.v$process p 6 where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p, 7 ( select t.instance from sys.v$thread t,sys.v$parameter v 8 where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i, 9 ( select value from sys.v$parameter where name = 'user_dump_dest') d 10 /
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/admin/hsjf/udump/hsjf_ora_1026.trc
(d) 读取当前session设置的参数
当我们通过alter session的方式设置了sql_trace,这个设置是不能通过show parameter的方式得到的,我们需要通过dbms_system.read_ev来获取:SQL> set feedback offSQL> set serveroutput on
SQL> declare
2 event_level number;
3 begin
4 for event_number in 10000..10999 loop
5 sys.dbms_system.read_ev(event_number, event_level);
6 if (event_level > 0) then
7 sys.dbms_output.put_line(
8 'Event ' ||
9 to_char(event_number) ||
10 ' is set at level ' ||
11 to_char(event_level)
12 );
13 end if;
14 end loop;
15 end;
16 /
Event 10046 is set at level 1