Oracle
如何擷取所有使用者對 Oracle 數據庫的查詢
我在 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
**注意:**如果您使用的是企業版,則可以使用標準版中不提供的細粒度審核
參考: