標籤:
前兩天在一個朋友QQ集團提出了一個問題。背景例如,下面的:
繼續問後,有例如以下回複:
1、對方server串連無問題。
2、從client能夠telnetserver的1521port。
3、tnsping正常。
4、對方server沒有設定IP信任。
5、windows 2003 server,Oracle 10.1.0.2.0
但從clientsqlplus就是逾時,無法串連。
首先,看下ORA-12170的定義:
oerr ora 12170
12170, 00000, "TNS:Connect timeout occurred"// *Cause: The server shut down because connection establishment or communication with a client failed to complete within the allotted time interval. This may be a result of network or system delays; or this may indicate that a malicious client is trying to cause a Denial of Service attack on the server.
// *Action: If the error occurred because of a slow network or system, reconfigure one or all of the parameters SQLNET.INBOUND_CONNECT_TIMEOUT, SQLNET.SEND_TIMEOUT, SQLNET.RECV_TIMEOUT in sqlnet.ora to larger values.
If a malicious client is suspected, use the address in sqlnet.log to identify the source and restrict access. Note that logged addresses may not be reliable as they can be forged (e.g. in TCP/IP).
大致意思就是因網路或系統問題逾時。
然後建議他能sqlnet.ora加入trace配置,看下sqlplus的跟蹤:
TRACE_LEVEL_CLIENT=16
TRACE_FILE_CLIENT=CLIENT
TRACE_TIMESTAMP_CLIENT=ON
trace_directory_client=一個路徑
但此時反饋說服務端的技術服務人員已經開啟了Oracle共用串連。如今能夠sqlplus。
如今問題就出來了。什麼是Oracle共用串連?做了什麼配置就能夠從client訪問了?為什麼會出現這個問題?
總結來說,這個問題是和Oracle執行於Windows平台相關的。
對於執行於Windows平台的。從client發起一個串連請求時,服務端監聽會讓client重新導向另外一個隨機port。既然是一個隨機port。那麼防火牆自然不會同意這個串連。因此會出現從client能夠telnet監聽port,但sqlplus就是逾時。無法串連。
究其原因就是由於client真正和Oracle線程通訊時使用的隨機port會被防火牆拒絕。這樣的情況僅僅會發生在Windows平台,由於UNIX之類的平台是預設支援port共用的,不會出現port被防火牆拒絕的現象。
可行的解決方式有兩種。
1. 使用包括內建SQL*Net代理的防火牆。
流程:
1. 串連代理。將串連傳給監聽。
2. 發送client重新導向地址。
3. 通過代理串連重新導向地址。
4. Oracle接受串連。
2. 升級資料庫到8.0.x以上,設定注冊表中USE_SHARED_SOCKET變數值為TRUE。
監聽器會在“listener.ora”檔案裡指定的地址上綁定和建立一個socket。在這個socket中,監聽器的監聽狀態是ACTIVE。
當監聽器接收串連請求時。監聽器會在監聽port派生一個Oracle線程。這樣的情況會重複產生。以至於最後形成了一個監聽器和一些已建立的串連都在使用1521port的閉環。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlzYWw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
從10.2以上的。USE_SHARED_SOCKET就已經是預設值為TRUE了,無需再改動。
MOS的124140.1文章具體介紹了這部分內容,翻譯原文例如以下:
目的:執行於Windows NT,Windows 2000。或興許版本號碼的作業系統,串連Oracle資料庫的Oracle Net或Net 8串連。可能會讓client重新導向串連一個短port範圍中的一個port號(除非碰到以下”特殊備忘“節中的問題)。微軟WINSOCK V1.1 API不同意進程將一個TCP的socket傳給還有一個進程。也就是不同意像UNIX系統中的port共用。為了讓Oracle串連能夠執行於防火牆環境中。客戶不得不使用包括內建SQL*Net代理的防火牆。或者使用Windows NT 4.0(可從Service Pack#3中獲得)、Windows 2000以上的版本號碼的WINSOCK V2 API,或者Windows 2000以上的版本號碼。這樣的特性也能通過在Windows注冊表中使用"USE_SHARED_SOCKET"參數在Oracle資料庫中實現。
範圍:這篇文章主要是提供給須要通過防火牆使用SQL*Net,Net8或Oracle Net串連訪問執行在Windows作業系統的Oracle資料庫的DBA和網路系統管理員。
具體描寫敘述:正如66382.1描寫敘述的。有兩種方法能夠讓Oracle資料庫執行於使用防火牆的環境中。
1. 使用包括內建SQL*Net代理的防火牆。SQL*Net代理能夠開啟還有一個讓client串連的監聽進程(通常在1610port)。然後這個監聽進程會代理到資料庫的串連,並處理防火牆內部的port重新導向。不會觸發禁止訪問的規則。此時防火牆就像正在執行Oracle連線管理員(Connectiong Manager或多協議交換器,Multi Protocol Interchange)。
有一點不同的就是。在防火牆和資料庫之間安裝了連線管理員Connection Manager。而且安裝防火牆時同意他能夠串連到連線管理員。那麼防火牆就不須要Oracle Net或SQL*Net了。2. 另外一種方法是升級到8.0.x或以上版本號碼,並在注冊表中設定參數USE_SHARED_SOCKET。目的就是為了啟用port共用(在Oracle 10.2及以上中該值預設是TRUE)。
這個參數在Windows NT 4.0(SP3或更高),Windows 2000,或Winsock V2支援的更高版本號碼中可以設定。
通過該參數,也可以使用僅支援port過濾以及沒有SQL*Net代理(至少是專用連線)的防火牆。多線程server(MTS)仍舊須要將串連重新導向到一個動態port,因此也須要SQL*Net代理。當Oracle執行於Windows作業系統時,能夠通過在系統內容或Windows注冊表中設定這個參數變數來啟用port共用。推薦最好在Windows注冊表中設定:USE_SHARED_SOCKET = TRUE。在Windows NT設定系統內容變數的方式:控制台-系統-環境。
Windows 2000以上,也能夠使用控制台的系統button。但環境變數須要點擊”進階”button來找到並設定。
亦能夠使用Windows注冊表設定:In Oracle release 8.0 \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLEIn Oracle release 8.1 \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME<#>
In Oracle release 9 or later \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\Key_<Home>添加一個STRING_VALUE值(注冊表表單右側)。不是KEY值(注冊表表單左側)。全部這些方法都須要Oracle進程的重新啟動,以使進程重新啟動時能夠讀取到注冊表。
Troubleshoot備忘:能夠使用‘netstat -a’命令查看配置。他應該展示全部的client串連。以及監聽的port。
C:\>netstat -anActive ConnectionsProto Local Address Foreign Address StateTCP 0.0.0.0:1521 0.0.0.0:0 LISTENINGTCP 198.51.100.9:1521 198.51.100.6:55769 ESTABLISHEDTCP 198.51.100.9:1521 198.51.100.91:13452 ESTABLISHEDTCP 198.51.100.9:1521 198.51.100.92:13203 ESTABLISHEDTCP 198.51.100.9:1521 198.51.100.92:13202 ESTABLISHEDTCP 198.51.100.9:1521 203.0.113.166:12331 ESTABLISHEDTCP 198.51.100.9:1521 203.0.113.10:12123 ESTABLISHEDTCP 198.51.100.9:1521 203.0.113.10:11252 ESTABLISHEDTCP 198.51.100.9:1521 192.0.2.22:14524 ESTABLISHEDTCP 198.51.100.9:1521 192.0.2.20:13524 ESTABLISHEDTCP 198.51.100.9:1521 192.0.2.102:13452 ESTABLISHEDTCP 198.51.100.9:1521 192.0.2.121:1342 ESTABLISHED
能夠在clientSQLNET.ORA檔案裡設定例如以下參數,來啟用Oracle Netclient跟蹤:TRACE_LEVEL_CLIENT= 16
TRACE_DIRECTORY_CLIENT = <directory>
TRACE_FILE_DIRECTORY= <filename>[Insert code here]通過在追蹤檔案裡搜尋‘port‘字串。能夠定位到詳細的唯一連接埠。
特殊備忘:1. 假設使用TCPS協議或SSL,將會發生port重新導向。解決方式是使用支援Sqlnet或Net8串連的防火牆或配置共用server分發port。
2. 10g及以上,預設USE_SHARED_SOCKET=TRUE。
著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。
Windows平台Oracle使用USE_SHARED_SOCKET角色