如何在不访问源代码的情况下确定Oracle查询?

时间:2009-01-14 11:21:28

标签: sql oracle networking

我们有一个系统,其中包含我们可以访问的Oracle后端(尽管可能不是管理访问权限)以及我们没有源代码的前端。数据库非常庞大,不易理解 - 我们没有文档。我对甲骨文一般也不是特别了解。

前端的一个方面向数据库查询特定数据集并显示它。我们需要确定正在进行的查询,以便我们可以在没有前端的情况下复制和自动化它(例如,通过定期生成csv文件)。

您将使用哪些方法来确定检索此数据集所需的SQL?

目前我倾向于使用EeePC,Wireshark和集线器(在客户端机器上安装Wireshark可能无法实现),但我很想听到任何其他想法以及是否有人能想到任何陷阱用这种特殊方法。

7 个答案:

答案 0 :(得分:12)

显然有很多方法。我觉得最容易的是:

(1)以SYS或SYSTEM

的身份连接到数据库

(2)查询V $ SESSION以识别您感兴趣的数据库会话。      记录SID和SERIAL#值。

(3)执行以下命令以激活会话的跟踪:

exec sys.dbms_system.set_bool_param_in_session( *sid*, *serial#*, 'timed_statistics', true )
exec sys.dbms_system.set_int_param_in_session( *sid*, *serial#*, 'max_dump_file_size', 2000000000 )
exec sys.dbms_system.set_ev( *sid*, *serial#*, 10046, 5, '' )

(4)在客户端应用程序中执行一些操作

(5)终止数据库会话(例如,通过关闭客户端)或停用跟踪(exec sys.dbms_system.set_ev( sid serial#,10046, 0,''))

(6)在数据库服务器上找到udump文件夹。将有一个数据库会话的跟踪文件,显示执行的语句和每次执行中使用的绑定值。

此方法不需要任何访问客户端计算机,这可能是一个好处。它确实需要访问数据库服务器,如果您不是DBA并且他们不允许您进入计算机,这可能会有问题。此外,如果您有许多客户端或客户端应用程序打开多个会话,则识别正确的跟踪会话可能很困难。

答案 1 :(得分:6)

首先查询Oracle系统视图,例如V $ SQL,v $ sqlarea和 V $ SQLTEXT。

答案 2 :(得分:2)

Wireshark确实是一个好主意,它有Oracle支持并很好地显示整个对话。

如果您没有管理员访问数据库服务器但是您可以访问网络(例如因为以太网交换机上有端口镜像),那么像Wireshark这样的数据包嗅探器尤其有用。

答案 3 :(得分:2)

哪个版本的Oracle?如果它是10+并且您具有管理访问权限(sysdba),那么您可以通过Oracle企业管理器相对容易地找到执行的查询。

对于旧版本,您需要访问tuinstoel在其答案中提到的观点。

您可以通过TOAD for oracle获得相同的数据,这是一个非常强大的软件,但价格昂贵。

答案 4 :(得分:1)

我已多次成功使用这些说明: http://www.orafaq.com/wiki/SQL_Trace#Tracing_a_SQL_session

答案 5 :(得分:1)

“虽然可能不是管理访问”。有人应该具有管理访问权限,可能是谁负责备份。至少,我希望您的用户具有运行oracle数据库的计算机的root / Administrator访问权限。管理员应该能够使用 “SQLPLUS / AS SYSDBA”语法将提供完全访问权限(这可能非常危险)。 root可以“su”到oracle用户并执行相同操作。

如果您真的无法获得管理员权限,那么作为wireshark的替代方案,如果您的前端通过Oracle客户端连接到数据库,请查找文件sqlnet.ora。您可以设置trace_level_client,trace_file_client和trace_directory_client,并使其记录客户端和数据库服务器之间的Oracle网络流量。

但是,客户端可能会调用存储过程并将数据作为输出参数或引用游标进行检索,这意味着您可能看不到通过该机制执行的查询。如果是这样,您将需要对数据库服务器的管理员访问权限,并根据Dave Costa的答案进行跟踪

答案 6 :(得分:0)

如果你能捕获行为中的SQL语句,那么快速而肮脏的方法就是在SQL * Plus中运行它: -

set verify off lines 140 head on pagesize 300

column sql_text format a65
column username format a12
column osuser format a15

break on username on sid on osuser

select S.USERNAME, s.sid, s.osuser,sql_text
from v$sqltext_with_newlines t,V$SESSION s
where t.address =s.sql_address
and t.hash_value = s.sql_hash_value 
order by s.sid,t.piece
/

您需要访问这些v $视图才能使用此功能。通常这意味着连接为系统。