如何跟踪由ArcGIS Server(ArcSDE)发送到Oracle数据库的SQL查询?


12

我想生成一个日志文件,其中包含由ArcGIS Server(ArcSDE)发送到Oracle数据库的所有SQL查询。有办法吗?我在Windows上使用Oracle 11g和ArcGIS Server 10.0。ArcSDE用于直接连接。


3
您可以使用Oracle的跟踪和审计。看一下这个问题:stackoverflow.com/questions/7914354/oracle-sql-query-logging
Devdatta Tengshe

您可以将Toad Quest用于实时跟踪日志。

Answers:


13

实际上,有许多方法可以跟踪任何ArcSDE连接。客户端应用程序和ArcSDE客户端之间的调用记录在SDE跟踪文件中,而SDE Intercept文件中的ArcSDE客户端和服务器之间的调用记录在案,ArcSDE服务器将在服务或直接连接日志中记录某些事件,并记录数据库调用DBMS日志文件。

-------------------------------------------------------------
|                                                           |
|  Client (ArcObject, ArcCatalog, ArcGIS Server, ArcIMS...) |
|                                                           |
-------------------------------------------------------------
      |
      |
     \|/
------------------ --------> SDE Trace
|                |  
|  ArcSDE Client |
|                |  
------------------ --------> SDE Intercept
      |
      |
     \|/
------------------- --------> SDE Intercept
|                 | 
|  ArcSDE Server  | --------> ArcSDE Service Logfile, or direct connect log
|                 |  
------------------- 
      |
      |
     \|/
------------------
|                |  
|  DBMS          | -----------> DBMS logfiles or trace
|                |  
------------------      

ArcSDE跟踪文件记录对ArcSDE客户端的每次调用。这些文件通常很大且嘈杂。在dbinit帮助中查看SDETraceLoc和SDETraceMode 。在启动应用程序之前,也可以将这些值设置为环境变量,这适用于应用程序和直接连接。

通常,ArcSDE Intercept文件更有用。他们将显示在通话中花费了多少时间。提醒一下,SDE遵循流的概念。某些命令(例如插入,更新和删除)在流上设置信息,然后执行该命令。通常,流号是截取文件中命令后的第一个整数。如果您有很多流,这可能会造成混淆(我看过多达26个流)。您可以在dbinit帮助中查看SDEIntercept和SDEInterceptLoc,或者在SDE Intercept文件上查看此知识库文章,以获取更多信息和示例。

%SDE_HOME%\ etc文件夹中的ArcSDE服务日志文件,或%SDE_HOME%\ etc或%TEMP%文件夹中的直接连接日志文件,包含有关服务或连接进行情况的常规信息。可以使用SDEVerbose变量(dbinit help)增加所记录的信息量。

DBMS日志文件和跟踪非常有用。但是它们只会给您部分图片。此外,某些数据库(例如Oracle)实际上并未在DBMS跟踪中包括所有类型的错误。启用S​​QL跟踪的方法有很多,Devdatta的上面的评论链接到更多信息。

其他链接: 深入挖掘–使用ArcSDE数据时解决地理处理错误


该图中的“跟踪”和“拦截”位置不正确(跟踪位于ArcSDE客户端和ArcSDE服务器之间的API中,而拦截位于服务器和RDBMS之间)。应用程序日志记录(例如ArcGIS Server的输出)位于客户端应用程序和ArcSDE API之间。
文斯2013年

@Vince,我认为这里有些混乱。我更新了图表以试图更好地说明我的观点。跟踪列表命令(通过SDE API)发给SDE客户端,但不一定发给SDE服务器(例如SE_coordref_free,SE_shape_get_binary_size)。拦截包含触发往返SDE服务器的命令,但不一定触发DBMS(例如QueryWithInfo,StreamSetState)。SDE和DBMS之间的日志记录取决于DBMS和连接类型(OCI,OleDB,ODBC)。
travis

当然,ASCII并不是绘制此图的最佳方法,但是如果将两个“ ArcSDE客户端”标记为“ ArcSDE客户端API”和“ ArcSDE服务器”,则将有所帮助。SDETRACE是在客户端应用程序和API之间的接口处捕获的(在它们沿任一方向越过API时回送参数)。我相信SDEINTERCEPT驻留在gsrvr DLL中的SES功能接口的两侧(由应用程序服务器或Direct Connect表示),并且包括从API接收到的消息以及对DBMS的调用(在上层客户端上进行拦截)到较低的底部)。
文斯

是的,两个SDE客户端都是复制粘贴错误。在运行时,实际上并没有一个API ...只是客户端(线程和内存)和服务器(线程和内存)。但是我同意SDETRACE会在参数交叉时回显它们。我可以肯定地说,默认情况下,SDEINTERCEPT不会直接记录与DBMS有关的任何事情(例如SQL)。可能还有其他启用SQL日志记录的参数,但是它们将针对每个DBMS独立实现。而且我不知道它们是什么。
travis

我通常不看拦截输出,但我只运行了一组简单的API调用(“ sdelist -o层”),同时启用了跟踪和拦截功能,它似乎确实生成了两个拦截文件(没有进行SQL交互)记得),所以看起来我们可以就此达成共识:)
文斯(Vince)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.