这几天对一个自己不熟悉的应用程序,写调试脚本,我知道这个应用程序只是个壳,里头都是调用的存储过程或sql,但没有设计文档,无法知道内部都是怎么调用的,都做了些什么操作,所以只好一步步跟踪了,记录了跟踪流程,供自己日后参考。
1、找出应用的sid和serial#
SQL> select sid,serial# from v$session where lower(program) like '%isap_client%';
SID SERIAL#
---------- ----------
78 1703
SQL>
2、开始跟踪
SQL> exec sys.DBMS_SYSTEM.set_sql_trace_in_session(78,1703,true);
PL/SQL procedure successfully completed.
SQL>
3、期间做点关于这个应用的操作(保证和数据库能有交互)
4、停止跟踪,在user_dump_dest目录下会生成跟踪的trace文件
SQL> exec sys.DBMS_SYSTEM.set_sql_trace_in_session(78,1703,false);
PL/SQL procedure successfully completed.
SQL>
5、找出并进入user_dump_dest目录,最后生成那个文件就是要用的trace文件
SQL> set lines 1024
SQL> show parameter user_dump_dest
NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
user_dump_dest string /opt/oracle/db01/app/oracle/ad
min/ORCL/udump
SQL> exit
$ cd /opt/oracle/db01/app/oracle/admin/ORCL/udump
$ ls -otr | tail -1
-rw-r----- 1 oracle 576097 Jan 8 16:15 orcl_ora_24884.trc
$
6、使用tkprof格式化trace文件,sys=no的意思是不查看sys用户的操作,看了也没啥用
$ tkprof orcl_ora_24884.trc report.txt sys=no
TKPROF: Release 9.2.0.4.0 - Production on Tue Jan 8 16:19:35 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
$
7、查看格式化后的文件report.txt,里头就有跟踪期间发生的所有存储过程(存储过程中执行的sql操作也会逐条显示)和sql操作,还有各sql执行的统计数据,可以了解哪些sql快,哪些慢了
$ more report.txt
8、也可以使用tkprof格式化时使用insert参数生成sql文件
$ tkprof orcl_ora_24884.trc report.txt insert=insert.sql
TKPROF: Release 9.2.0.4.0 - Production on Tue Jan 8 16:21:56 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
$
9、执行生成的sql文件并提交,会把应用执行生成的sql信息插入到刚建立的tkprof_table表里,如果先前有过类似操作,则先drop掉tkprof_table表
SQL> drop table tkprof_table;
Table dropped.
SQL> @insert.sql
。。。
SQL> commit;
Commit complete.
SQL>
10、查看tkprof_table数据,但里头没有存储过程的信息,user_id<>0意思是不查看sys用户下发生的操作,看了也没用
SQL> select sql_statement from tkprof_table where user_id<>0;
可惜无法查看到各个绑定变量的具体值,如果还需要知道各参数或绑定变量的信息,可能只得
通过LogMnr来分析归档日志和redolog了。
--END--