我们有一个系统,它有一个我们可以访问(虽然可能不是管理访问)的 Oracle 后端和一个我们没有源代码的前端。数据库很大而且不容易理解——我们没有文档。总的来说,我对 Oracle 也不是特别了解。
前端的一个方面在数据库中查询一组特定的数据并显示它。我们需要确定正在进行的查询,以便我们可以在没有前端的情况下复制和自动化它(例如,通过定期生成 csv 文件)。
您将使用什么方法来确定检索这组数据所需的 SQL?
目前我倾向于使用 EeePC、Wireshark 和集线器(在客户端机器上安装 Wireshark 可能是不可能的),但我很想听听任何其他想法以及是否有人能想到任何陷阱用这种特殊的方法。
最佳答案
显然有很多方法。我发现最简单的一个是:
(1)以SYS或SYSTEM连接数据库
(2) 查询 V$SESSION 以确定您感兴趣的数据库 session 。 记录 SID 和 SERIAL# 值。
(3) 执行以下命令激活 session 跟踪:
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) 终止数据库 session (例如通过关闭客户端)或停用跟踪(exec sys.dbms_system.set_ev( sid, serial#, 10046, 0, '' ) )
(6) 找到数据库服务器上的udump 文件夹。数据库 session 将有一个跟踪文件,显示执行的语句和每次执行中使用的绑定(bind)值。
此方法不需要对客户端计算机进行任何访问,这可能是一个好处。它确实需要访问数据库服务器,如果您不是 DBA 并且他们不让您进入机器,这可能会有问题。此外,如果您有许多客户端或客户端应用程序打开多个 session ,则识别要跟踪的正确 session 可能很困难。
关于sql - 如何在不访问源代码的情况下确定 Oracle 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/442634/