最近项目需要,让小弟跟踪进程调用的SQL,在网上浏览了一下,有几个工具,发现有几个问题,还是无法解答我的问题,列举一下:
1、Tord For Oracle中的 SQL Monitor。
大部分的进程都可以跟踪到,但是也有一部分无法跟踪,SQL Monitor跟踪调用,是在哪里访问到SQL文件的,数据库连接池中吗?2、Qracle Enterprise Management Packs 中的 TopSessions。
怎样跟踪生命周期只有几秒的进程?调整了刷新速率也不行,还没有等我继续操作,进程就在列表中消失了,有什么解决方法?
3、SQL_TRACE。
AUTOTRACE功能,我按照网上的方法配置以后获取不到跟踪文件,有没有实际的使用例子可以教导一下?
4、总结一下,哪个方法比较好?为什么?能否说明一下跟踪SQL文件的工作原理?本人比较白痴,问的问题有些不靠谱,大家没看明白可以跟帖提问,需要我贴截图或代码也请提出。
很需要解决这个问题,我一直在等,大家多多包涵以上,多谢多谢
1、Tord For Oracle中的 SQL Monitor。
大部分的进程都可以跟踪到,但是也有一部分无法跟踪,SQL Monitor跟踪调用,是在哪里访问到SQL文件的,数据库连接池中吗?2、Qracle Enterprise Management Packs 中的 TopSessions。
怎样跟踪生命周期只有几秒的进程?调整了刷新速率也不行,还没有等我继续操作,进程就在列表中消失了,有什么解决方法?
3、SQL_TRACE。
AUTOTRACE功能,我按照网上的方法配置以后获取不到跟踪文件,有没有实际的使用例子可以教导一下?
4、总结一下,哪个方法比较好?为什么?能否说明一下跟踪SQL文件的工作原理?本人比较白痴,问的问题有些不靠谱,大家没看明白可以跟帖提问,需要我贴截图或代码也请提出。
很需要解决这个问题,我一直在等,大家多多包涵以上,多谢多谢
这个没有用过,估计这个应该是用oracle里的v$sql动态视图来进行监控的。这里可以查看运行的sql。但是有一定的局限,share词小的话,会没有了,实例重启也会没有了。SQL_TRACE
sql trace有直接在sqlplus环境里用的,这样只能看到自己session的。也可以通过全局设置的,但是都需要服务器里的udump文件,这个方法,没有上面的局限,但是有本地文件的局限。方法没有最好,最有最合适。
SQL*Plus: Release 9.2.0.1.0 - Production on 星期二 9月 8 09:44:07 2009Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - ProductionSQL> set autotrace trace
SP2-0618: 无法找到会话标识符。启用检查 PLUSTRACE 角色
SP2-0611: 启用STATISTICS报告时出错
SQL> conn system/manager
ERROR:
ORA-01017: invalid username/password; logon denied
警告: 您不再连接到 ORACLE。
SQL> conn tj_mis/ok
已连接。
SQL> @$ORACLE_HOME/sqlplus/admin/plustrce.sql;
SP2-0310: 无法打开文件"$ORACLE_HOME/sqlplus/admin/plustrce.sql"
SQL> drop roleplustrace;
drop roleplustrace
*
ERROR 位于第 1 行:
ORA-00950: 无效 DROP 选项
SQL> select sid,serial#,username from v$session;
select sid,serial#,username from v$session
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
SQL> select sid,serial#,program,user,osuser from v$session;
select sid,serial#,program,user,osuser from v$session
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
SQL> exec dbms_system.set_sql_trace_in_session(16,1281,true);
BEGIN dbms_system.set_sql_trace_in_session(16,1281,true); END; *
ERROR 位于第 1 行:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须说明标识符 'DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
SQL> conn system/system
已连接。
SQL> select sid,serial#,program,user,osuser from v$session; SID SERIAL#
---------- ----------
PROGRAM
----------------------------------------------------------------
USER OSUSER
------------------------------ ------------------------------ 16 1281
GateCtrl.exe
SYSTEM YANGJIN\YanGin 17 183
sqlplusw.exe已选择14行。SQL> grant execute on dbms_system to system;授权成功。SQL> exec sys.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(16,1281,true);PL/SQL 过程已成功完成。SQL> select sid,serial# from v$session where username ='GateCtrl.exe'
2
SQL> /未选定行SQL> exec sys.dbms_system.set_sql_trace_in_session(21,777,true);PL/SQL 过程已成功完成。SQL> grant select on v_$sesstat to plustrace;授权成功。SQL> grant select on v_$statname to plustrace;授权成功。SQL> grant select on v_$mystat to plustrace;授权成功。SQL> grant plustrace to dba with admin option;授权成功。
我也觉得用auto_trace比较好
select
b.sql_text
from
v$session a,
v$sqltext b,
v$sqlarea c
where
a.sql_address = b.address
and b.address = c.address
and a.username ='TJ_PLAN'
and a.program ='GateCtrl.exe'v$sqltext.sql_text 也有字段长度限制,要怎么解决呢?
查询结果:
SQL_TEXT
1.banner like 'Oracle%'
2.select '00.00.0000 '||banner, user, 99/100 from v$version where 感觉好像没有抓到因为什么都不懂,所以找不到最好的方法
就是我说的方法:
1.exec sys.dbms_system.set_sql_trace_in_session(21,777,true);
2.exec sys.dbms_system.set_sql_trace_in_session(21,777,false);
3.执行:
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_'
|| p.spid
|| '.trc' trace_file_name
FROM (SELECT p.spid
FROM v$session s, v$process p
WHERE p.addr = s.paddr and s.sid=&sid) 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 v$parameter
WHERE NAME = 'user_dump_dest') d;
执行时输入跟踪的sid,如这里的21以上都是sys执行。
这样做实时监控,消耗太大了哟,执行一个sql,就去trc文件你查一把,好像不是一个好方法。你是实时的可以用通过v$sql动态表的数据监控来查看。