Oracle

如何擷取所有使用者對 Oracle 數據庫的查詢

  • December 7, 2017

我在 Unix 系統上安裝了一個 Oracle 數據庫。在這個單實例數據庫上,我從應用程序池打開了很多會話(應用程序安裝在另一台伺服器上)。每個會話都使用相同的使用者名打開。由於會話可以被池關閉(真的,它可以)我無法擷取會話 ID 並且 - 對於每個 - 啟用查詢跟踪功能。該應用程序是一個封閉的原始碼(和專有),所以我不能(也不想)對其進行逆向工程。

現在,我需要擷取該使用者執行的每個查詢。理想情況下,我想通過使用者會話獲取一個文件(但如果我得到一個包含所有查詢的文件,那將是完美的)。我的真正目標是獲取查詢,但 session_id 和/或查詢的時間戳可能會受到歡迎。

重要提示:由於我的數據庫是標準版,因此我無法訪問任何 Oracle 高級包,如“Oracle Tuning Pack”、“Oracle Diagnostic Pack”等……我只能訪問 StatPack 和正常 SQL 查詢數據庫字典對象(可能是 sysdba)。

平台資訊:

  • Unix RedHat 6.x
  • Oracle 數據庫 11g 標準版
  • 只有一個數據庫實例
  • 打開的會話數在 150 到 250 之間

謝謝你的想法

托馬斯

據我所知,沒有直接的方法可以實現這一目標。但是,我嘗試編寫以下步驟來滿足要求。

您可以使用以下語句為所有會話啟用跟踪。

alter system set events '10046 TRACE NAME CONTEXT FOREVER, LEVEL 4';

要禁用此跟踪,請使用以下語句。

alter system set events '10046 trace name context off';

腳步:

  • 首先,啟用 10046 事件跟踪。
SQL> conn / as sysdba

SQL> alter system set events '10046 TRACE NAME CONTEXT FOREVER, LEVEL 4';
  • 要獲取這些跟踪文件的名稱,請使用以下查詢,其中 username 應該是應用程序使用的使用者名。
SQL> SELECT LISTAGG(tf, ' ') WITHIN GROUP (ORDER BY tf) "Trace_List"
FROM (
     SELECT sys_context('userenv','instance_name') || '_ora_'|| p.spid || '.trc' as tf FROM 
                                                                                       v$process p join v$session s 
                                                                                       ON (s.paddr=p.addr) 
                                                                                       WHERE s.username='JAY'
);

Trace_List
--------------------------------------------------------------------------------
orcl_ora_3443.trc orcl_ora_3458.trc orcl_ora_3473.trc
  • 之後,去USER_DUMP_DEST查找跟踪文件。
SQL> show parameter user_dump_dest

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest               string  /u01/app/oracle/diag/rdbms/orcl/orcl/trace

現在,您的使用者轉儲目標上分散了多個跟踪文件。為了合併和創建單個跟踪文件,您可以使用trcsess實用程序,它允許辨識來自多個跟踪文件的跟踪資訊並將其合併到單個跟踪文件中。您可以根據以下條件合併這些跟踪文件。選擇對這些所有會話通用的。

  • 會話 ID
  • 客戶編號
  • 服務名稱
  • 動作名稱
  • 模組名稱

在這種情況下,我將使用服務名稱。

SQL> select service_name from v$session where username='JAY';

SERVICE_NAME
----------------------------------------------------------------
SYS$USERS
SYS$USERS
SYS$USERS

讓我們使用該trcsess實用程序。

[server1@oracle ]$ trcsess output=/home/oracle/Desktop/main_trace_file.trc service='SYS$USERS' orcl_ora_3443.trc orcl_ora_3458.trc orcl_ora_3473.trc

我們創建了一個跟踪文件,我們可以使用tkprof實用程序從該跟踪文件創建格式化輸出。

[server1@oracle ]$ tkprof main_trace_file.trc main_formatted_trace.txt

**注意:**如果您使用的是企業版,則可以使用標準版中不提供的細粒度審核

參考:

引用自:https://dba.stackexchange.com/questions/166607