Sybase中查询某个进程在执行哪些查询

sp_who可以查询系统中进程的情况,sp_lock可以查询系统中锁的情况,知道是哪个进程出了问题之后,可以用一下方法查询某个进程在干什么:

dbcc traceon(3604)
go
dbcc sqltext(pid)

其中pid为进程号,输出结果如下:

SQL Text: select xh,gcmc,zbjggsrq,zbtzsrq from gs_zbxx where datediff(dd,zbjggsrq,getdate())<=3 order by zbjggsrq desc

see also:
Sybase FAQ: 6/19 – ASE Admin (3 of 7)
Advanced ASE Administration

Update @ 2007-04-20

其实3604是指定dbcc把信息输出到用户屏幕上,相应的还可以使用dbcc traceon(3604)指定输出到errorlog,不过这些都是针对人为的操作,如果是使用程序,比如php语言来查询dbcc信息的话,php是无法得到这些输出的,这种情况就只能借助外部程序,比如isql或者sqsh来实现了,就像这样:

$sql = '';
$sql .= "dbcc traceon(3604)\n"; 
$sql .= "go\n";
$sql .= "dbcc sqltext($spid)\n";

// Notice, multi-line cmd
$cmd = "sqsh -S $host -U $user -P \"$pass\" -C \"$sql\"";
$rs = shell_exec($cmd);

然后对$rs进行处理,过滤掉dbcc产生的杂乱信息,就得到了实际的进程sql,还有一种dbcc查询方式,不过输出的信息更多更乱:

$sql .= "dbcc pss(0, $spid, 0)";

现在还剩下一个缺点,就是有些sql(可能是多行的)查询出来时会被无端截断,只显示后面一部分,不过大部分情况下还都是好的。

参考:

  • [Undocumented Sybase Flags](http://www.edbarlow.com/document/flags.htm)
  • [How do I capture a process’s SQL?](http://www.isug.com/Sybase_FAQ/ASE/section1.3.html#1.3.10)

Leave a Reply

Your email address will not be published. Required fields are marked *