使用SQL_Trace和10046事件进行数据库诊断
使用SQL_Trace和10046事件进行数据库诊断步骤:
1. 利用top命令找到当前占用cpu资源最高的一个数据库进程的PID。
2. 在数据库中根据PID号找到相应的SID号和SERIAL#
select s.sid, s.serial# from v$session s, v$process p where s.paddr=p.addr and p.spid='[PID]';
或select sid, serial#, username from v$session where username is not null;
3. 使用dbms_system.set_sql_trace_in_session包来对这个session进行trace
exec dbms_system.set_sql_trace_in_session([SID],[SERIAL#],true); 需要sysdba权限
4. 找到生成的trace文件,默认在$Oracle_base/admin/[SID]/[SID]/updump中,也可以用下面语句查询位置和名称:
select d.value||'\'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name from
( select p.spid from v$mystat m, v$session s, v$process p where m.statistic#=1 and s.sid=m.sid and s.paddr=p.addr)p,
(select t.instance from v$thread t, v$parameter v where v.name='thread' and (v.value=0 or t.thread#=to_number(v.value))) i,
(select value from $parameter where name='user_dump_dest') d;
查看路径:show parameter user_dump_dest;
5. 用TKPROF对trace文件格式化:
tkprof test.trc output.txt explain=[username]/[pwd] aggregate=yes sys=no waits=yes sort=fchela;
递归SQL:当发出一条简单的sql命令后,Oracle数据库要在后台解析这条命令,并转换为Oracle数据库的一系列后台操作,这些后台操作被称为递归sql。
查询表结构信息: select index_name, table_name, column_name from user_ind_columns where table_name=upper('test');