2013-02-25 68 views
4

在開發過程中我發現,數據庫必須通過大量的生活連接:獲取建立連接的IP地址到Oracle 11

SELECT username, COUNT(*) FROM v$session GROUP BY username; 

爲了找到究竟是誰持有方面,我想獲得IP地址的列表。

在通用網絡搜索和閱讀official docs我建立查詢:

SELECT username, seconds_in_wait, machine, port, terminal, program, module, service_name 
    FROM v$session 
    WHERE type = 'USER'; 

其中machineselect最重要的部分。但不幸的是machine字段顯示客戶端操作系統已知的主機名稱

互聯網充滿推薦使用UTL_INADDR.GET_HOST_ADDRESS這是不適用於我的情況。首先是因爲ORA-24247:網絡訪問的訪問控制列表(ACL)並否認其次是因爲客戶端操作系統的主機名通常的/ etc /主機名定義,在我們的內部網不提供給DNS服務器.. 。

任何其他方式來檢索Oracle數據庫的開放會話的IP(數據庫實例在任何情況下都保存有關它的套接字的信息...)。

UPDATE

下我信任內網,但未知的網絡層次。

而我試圖找到哪些應用程序使用我的表(幾個應用程序服務器,我不知道他們全部)。其中一些過度使用連接並需要修復。但首先他們應該被確定...

+0

您可以查詢'sys_context('USERENV','IP_ADDRESS')',但只能在用戶的會話中使用 - 所以對您嘗試執行的操作沒有幫助我想,除非您能夠添加登錄觸發器會將包含該值的會話信息記錄到您自己的審計表中? – 2013-02-25 14:38:37

+0

嗯...我希望Oracle有一些易於查詢的內置解決方案... – gavenkoa 2013-02-25 14:46:14

+0

獲取ACL的權限有什麼問題? – tbone 2013-02-25 14:47:34

回答

4

請記住,Oracle會話不需要知道,並且當然不需要信任您來自的客戶端名稱/ IP地址;它位於網絡傳輸層之上,並不關心你是否通過TCP/IP或其他方式連接。 (我甚至不確定聽衆是否必須傳遞信息,或者如果它實際上傳遞了現成的套接字)。正如您所看到的,machine正是客戶聲明的內容,如programv$session視圖中的其他字段;它可能不會與DNS或服務器的/etc/hosts可以解決的任何事情相似,特別是如果客戶端是Windows盒子。你可以做的是,在Unix/Linux級別(因爲你指的是/ etc/hosts,我假設你不在Windows上),查找port並查看顯示的地址;例如v$session顯示了我port50527,所以如果我做netstat -an | grep 50527我看到:

tcp 0 0 192.168.1.1:1521 192.168.1.23:50527 ESTABLISHED 

所以,我可以看到我從192.168.1.23連接。如果您在服務器上運行SQL * Plus,則可以使用host命令執行此操作,但這樣做仍然有點不方便。如果您需要定期執行此操作,並且添加登錄觸發器以將其捕獲到審計表不是一種選擇,並且您實際上必須從數據庫內部執行此操作,您可能需要編寫Java存儲過程來執行查找那個港口給你。但編寫shell腳本來查詢v$session中的port號碼並進行查找可能更容易。

+0

我是否正確理解你建議在Oracle服務器上運行'netstat'?我只是無法訪問它(當我向他請求這樣的許可時,DBA會被嘲笑......)。感謝我的問題! +1 – gavenkoa 2013-02-25 19:09:20

+0

@gavenkoa - 是的,在服務器上;我從中得知,你並沒有在服務器上運行SQL * Plus。您可以獲得在數據庫中運行Java以獲取該信息的權限,但可能不會。我不確定我是否理解您的最終目標是什麼,爲什麼實時連接的數量很重要,或者您將如何處理IP。也許DBA可以監控這個(如果你提供了一個腳本!?),並將你需要的輸出發送給你,特別是如果它是一次性調查? – 2013-02-25 19:15:01

+0

@AlexPloole我嘗試查找導致連接泄漏的服務器。似乎是DBA的工作,而不是我的工作。再次感謝您的解釋! – gavenkoa 2013-02-25 19:20:08

2

感謝所有挖掘到我的問題(這仍然是通用的,不完全是我的!!)。

只是簡短的回答:你不能從Oracle系統表中獲得真正的IP。

對於此任務,您可以使用通用實用程序,如netstatlsof -p <pid-of-oracle>,但僅限於服務器端

一些幫助可以來自v$session.port值...從助手

一個很好的建議 - 使用來自DB客戶端的好名字。它們填充到v$session錶行:

machine, terminal, program, module, service_name 

,使他們能夠幫助確定客戶...

2

傳入連接的IP地址,通常可以在監聽器日誌中找到。這就是我在需要時追蹤這些信息的方式。

+0

感謝您的信息!但我是常規開發人員,並沒有SSH訪問服務器((無論如何+1! – gavenkoa 2013-03-23 19:49:57

1

我發現我的審計腳本從2001年登錄觸發器不存在AFAIK。它解析SYS.AUD $的COMMENT $ TEXT列,其中ACTION#= 100以獲取客戶端的IP地址。該列仍包含身份驗證者:DATABASE;客戶端地址:(ADDRESS =(PROTOCOL = tcp)(HOST = a.a.a.a)(PORT = p))在我們的環境中。