Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在不访问源代码的情况下确定Oracle查询?_Sql_Oracle_Networking - Fatal编程技术网

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

Sql 如何在不访问源代码的情况下确定Oracle查询?,sql,oracle,networking,Sql,Oracle,Networking,我们有一个系统,它有一个Oracle后端,我们可以访问该后端(尽管可能没有管理权限),还有一个前端,我们没有源代码。数据库相当大,不容易理解-我们没有文档。一般来说,我对甲骨文也不是特别了解 前端的一个方面是查询数据库中的特定数据集并显示它。我们需要确定正在进行的查询,以便在不使用前端的情况下复制和自动化查询(例如,通过定期生成csv文件) 您将使用什么方法来确定检索这组数据所需的SQL 目前我倾向于使用EeePC、Wireshark和hub(在客户端机器上安装Wireshark可能不太可能),

我们有一个系统,它有一个Oracle后端,我们可以访问该后端(尽管可能没有管理权限),还有一个前端,我们没有源代码。数据库相当大,不容易理解-我们没有文档。一般来说,我对甲骨文也不是特别了解

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

您将使用什么方法来确定检索这组数据所需的SQL


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

从查询Oracle系统视图开始,例如V$SQL、V$sqlarea和 v$sqltext

的确是个好主意,它有Oracle的支持,并且很好地显示了整个对话


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

哪一版本的Oracle?如果是10+并且您具有管理权限(sysdba),那么您可以通过Oracle enterprise manager相对轻松地找到执行的查询

对于旧版本,您需要访问tuinstoel在其回答中提到的视图


同样的数据,你可以通过它获得,这是一个非常有能力的软件,但昂贵。

显然有很多方法。我发现最简单的是:

(1) 以SYS或SYSTEM连接到数据库

(2) 查询V$SESSION以确定您感兴趣的数据库会话。 记录SID和序列值

(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,并且他们不允许您进入计算机,这可能会有问题。此外,如果您有多个客户端,或者客户端应用程序打开了多个会话,则很难确定要跟踪的正确会话。

我已多次成功使用这些说明:

如果您能在act中捕捉到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$视图才能使其工作。通常这意味着作为系统连接。

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

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


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

这肯定是一种可行的方法,但根据系统上的活动级别,可能很难确定您感兴趣的特定语句。如果您想了解最近执行的所有语句的概述,这非常好。我还不知道是否能够访问数据库机器本身-我将在几周后(希望)了解我们何时开始。这和tuinstoel的回答给了我很多尝试,谢谢。