龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

复杂应用环境下监控Oracle数据库性能(1)(4)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
3. 对各种应用程序中的情况进行监控 假设一个系统中不仅仅有PHP程序,还有C程序与数据库进行连接,那么数据库系统一旦出了问题,如资源消耗过多,造

3. 对各种应用程序中的情况进行监控

假设一个系统中不仅仅有PHP程序,还有C程序与数据库进行连接,那么数据库系统一旦出了问题,如资源消耗过多,造成死锁等,仅凭

ps ax | grep oracleORCL

是看不出什么东西的,因为这个进程是Oracle的shadow进程,命令名字都被改了,从/proc文件系统中提供的信息中也榨不出什么有用的东西了,所以,如果发现一个进程(这是ps ax的实际输出)如下:

10406 ? R 159:10 oracleORCL (DESCRIPTION=(LOCAL=no)(ADDRESS=(PROTOCOL=

确定这个进程长时间处于running状态的肇事者就成为一个难题,首先,进程的运行者是oracle,连接者却可能是来自本机,来自局域网络,来自internet的nobody用户,所以冤无头,债无主。查看v$session,v$process,v$...,也没有关于客户端的足够信息。可以用来缩小范围的是SQL语句,但仍不足以构成充分的说服力让某一应用的开发人员确信是自己的程序出了问题。观察字段丰富的v$session视图,里面有一个十分诱人的client_info字段,顾名思义,不能不让人想入非非:一定是关于ORACLE客户端的信息的,可惜它一般是NULL值:-(,笔者从ORACLE文档中终于发现了。 

dbms_application_info.set_client_info(string);

是用来设置连接ORACLE 的客户端信息的一个包,拿来PRO*C 中运行:

EXEC SQL EXECUTE 
BEGIN 
dbms_application_info.set_client_info(' 某应用程序 : 其 PID, 文件名 , 行号 '); 
END: 
END-EXEC;

运行该PRO*C程序,执行一条SQL语句,并在关闭光标之前故意让它:

sleep(1000);

以腾出足够多的时间来观察v$session中的client_info字段:

[bash$] sqlplus sys/change_on_install@orcl 
SQL> select distinct * from (select a.client_info,b.sql_text,c.spid 
> from v$session a,v$sql b , v$process c where a.client_info is not null
> and a.sql_hash_value=b.hash_value and a.paddr=c.addr);

正是你刚才设定的'某应用程序:其PID,文件名,行号'信息,别嫌短,这个client_info字段是64个字节够了。看能不能让这宝贵功能施于PHP:

到SQLPLUS下一看,果不其然!!!将该功能加入前面的配置文件中,将会对PHP中的SQL语句进行更精确的跟踪定位。

至此,可以将数据库服务器下某一oracle的shadow进程与具体哪一个应用程序,甚至是哪一个源文件,哪一行的信息以及所执行的SQL语句等一一对应起来,有了这根主线,其它问题的分析就可步步深入,耗了多少时间,读了多少个数据块,进行了多少次排序,等等问题,都可通过v$...视图收集到足够的信息。本文重点不在于此,仅作抛砖,就此打住。

(责任编辑 火凤凰 sunsj@51cto.com  TEL:(010)68476636-8007)


精彩图集

赞助商链接