20180427通過SQL_ID查出執行該SQL客戶端IP
[20180427]通過SQL_ID查出執行該SQL的客戶端IP.txt
--//論壇上鍊接http://www.itpub.net/thread-2101733-1-1.html的問題.自己測試看看.
1.環境:
SCOTT@book> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SYS@book> alter database add supplemental log data;
Database altered.
$ sqlplus -s scott/book<<< "@@ &r/pt2 'select * from v\$database'" | grep -i supp
30 SUPPLEMENTAL_LOG_DATA_MIN YES
31 SUPPLEMENTAL_LOG_DATA_PK NO
32 SUPPLEMENTAL_LOG_DATA_UI NO
40 SUPPLEMENTAL_LOG_DATA_FK NO
41 SUPPLEMENTAL_LOG_DATA_ALL NO
47 SUPPLEMENTAL_LOG_DATA_PL NO
SCOTT@book> @ &r/spid
SID SERIAL# PROCESS SERVER SPID PID P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
54 327 21565 DEDICATED 21566 28 151 alter system kill session '54,327' immediate;
SCOTT@book> select count(*) from emp,emp,emp,emp,emp,emp,emp;
COUNT(*)
----------
105413504
--//sql_id=gau6fcukuvcz7
2.測試:
SCOTT@book> select session_id,session_serial#,sql_id,client_id,machine from V$ACTIVE_SESSION_HISTORY where sql_id='gau6fcukuvcz7' and IS_AWR_SAMPLE='Y';
SESSION_ID SESSION_SERIAL# SQL_ID CLIENT_ID MACHINE
---------- --------------- ------------- ----------- ---------
54 327 gau6fcukuvcz7 xxxx4
--//首先說明一點,執行的sql語句一定要被awr抓取,否者無法發現.從sid,serial#看,確實能對上,但是僅僅知道機器名.
3.關閉附件日誌看看:
SCOTT@book> alter database drop supplemental log data;
Database altered.
SCOTT@book> select count(*) from emp,emp,emp,emp,emp,emp,emp;
COUNT(*)
------------
105413504
SCOTT@book> column SAMPLE_TIME format a24
SCOTT@book> select SAMPLE_TIME, session_id,session_serial#,sql_id,client_id,machine from V$ACTIVE_SESSION_HISTORY where sql_id='gau6fcukuvcz7' and IS_AWR_SAMPLE='Y';
SAMPLE_TIME SESSION_ID SESSION_SERIAL# SQL_ID CLIENT_ID MACHINE
------------------------ ------------ --------------- ------------- --------- -------
2018-04-27 09:05:47.837 54 327 gau6fcukuvcz7 xxxx4
2018-04-27 08:50:26.653 54 327 gau6fcukuvcz7 xxxx4
--//不管開啟附加日誌與否,僅僅知道機器名.可以通過變通的方法給client_id加入ip地址,這樣就可以通過sql_id知道是那個IP執行的.
4.通過觸發器給client_id賦值IP 地址:
--//我以前寫的指令碼,僅僅取出關鍵部分:
CREATE OR REPLACE TRIGGER SYS.ENABLE_IP_address
AFTER LOGON
ON DATABASE
DECLARE
v_exe v$session.program%TYPE;
v_client_info v$session.client_info%TYPE;
v_sid v$session.SID%TYPE;
v_osuser v$session.osuser%TYPE;
v_machine v$session.machine%TYPE;
v_module v$session.module%TYPE;
v_ok VARCHAR (10);
BEGIN
SELECT NVL (SYS_CONTEXT ('userenv', 'ip_address'), '127.0.0.1')
INTO v_client_info
FROM DUAL;
-- add and set clint_ip to application_info
DBMS_APPLICATION_INFO.set_client_info (v_client_info);
--增加的程式碼
DBMS_SESSION.set_identifier (v_client_info);
END;
/
5.退出繼續測試:
SCOTT@78> @ &r/spid
SID SERIAL# PROCESS SERVER SPID PID P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
80 19 6220:3344 DEDICATED 21800 30 10 alter system kill session '80,19' immediate;
SCOTT@book> select count(*) from emp,emp,emp,emp,emp,emp,emp;
COUNT(*)
------------
105413504
SCOTT@book> select SAMPLE_TIME, session_id,session_serial#,sql_id,client_id,machine from V$ACTIVE_SESSION_HISTORY where sql_id='gau6fcukuvcz7' and IS_AWR_SAMPLE='Y' order by SAMPLE_TIME desc;
SAMPLE_TIME SESSION_ID SESSION_SERIAL# SQL_ID CLIENT_ID MACHINE
------------------------ ---------- --------------- ------------- ------------ --------------------
2018-04-27 09:21:09.006 80 19 gau6fcukuvcz7 192.168.xx.x WORKGROUP\YYYY
2018-04-27 09:05:47.837 54 327 gau6fcukuvcz7 xxxx4
2018-04-27 08:50:26.653 54 327 gau6fcukuvcz7 xxxx4
--//這樣client_id就記錄IP資訊.通過增加DBMS_SESSION.set_identifier (v_client_info);就可以在client_id記錄IP.
--//不過我也遇到一個問題,我不知道為什麼我們應用這樣做產生大量的跟蹤檔案,我最終取消這個設定.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2153413/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 走近原始碼:Redis命令執行過程(客戶端)原始碼Redis客戶端
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- Django透過request獲取客戶端IPDjango客戶端
- java web 通過request獲取客戶端IPJavaWeb客戶端
- Squirrel: 通用SQL、NoSQL客戶端UISQL客戶端
- 9i and 10g 透過SQL_ADDRESS 或sql_id查詢執行計劃SQL
- c# 獲取客戶端IPC#客戶端
- 獲取客戶端真實IP客戶端
- Oracle檢視sql_id 的歷史執行計劃OracleSQL
- .net 獲取客戶端真實ip客戶端
- 利用執行緒池給客戶端傳檔案執行緒客戶端
- spring boot 獲取客戶端ip資訊Spring Boot客戶端
- 服務端如何獲取客戶端請求IP地址服務端客戶端
- VNC客戶端是Windows,VNC客戶端是Windows如何進行操作VNC客戶端Windows
- 請求更改狀態介面後,執行 sql 查出來狀態不對SQL
- 「Oracle」客戶端 PL/SQL DEVELOPER 安裝使用Oracle客戶端SQLDeveloper
- 伺服器獲取真實客戶端 IP伺服器客戶端
- 一次獲取客戶端 IP 記錄客戶端
- 如何使用python爬蟲直接返回客戶端IP?Python爬蟲客戶端
- Istio 中實現客戶端源 IP 的保持客戶端
- 【物件儲存】Minio本地執行和 golang客戶端基本操作物件Golang客戶端
- Steam客戶端發現遠端程式碼執行漏洞:已放補丁客戶端
- socket實現服務端多執行緒,客戶端重複輸入服務端執行緒客戶端
- [20220111]該語句的sql_id如何計算的.txtSQL
- 「美餐客戶端 3.0」設計過程客戶端
- 在OwinSelfHost專案中獲取客戶端IP地址客戶端
- 在SelfHost專案中獲取客戶端IP地址客戶端
- 查詢SQLServer的客戶端IP和主機名SQLServer客戶端
- Windows下同時安裝執行多個版本的jmeter客戶端WindowsJMeter客戶端
- Oracle - 執行過的SQL、正在執行的SQL、消耗資源最多的SQLOracleSQL
- .net socket.io客戶端使用過程客戶端
- 阿里雲CDN + nginx多級代理獲取客戶端IP阿里Nginx客戶端
- tomcat採集阿里雲slb真實客戶端ip🫚Tomcat阿里客戶端
- Nginx 反向代理後如何獲取真實客戶端 IPNginx客戶端
- Java面試題-如何獲取客戶端真實IPJava面試題客戶端
- Spring 客戶端 IP 地址獲取及儲存細節Spring客戶端
- dubbo客戶端客戶端
- Pulsar客戶端客戶端