要使Oracle用戶端能正常串連到設定有防火牆的Oracle伺服器,單開放一個1521或自訂的監聽連接埠是不夠的。
伺服器裝成Windows2003了,並開放了系統內建的防火牆,在串連中發現在防火牆上開啟監聽連接埠1521後還是無法連通,報TNS連線逾時錯誤。於是試將防火牆關閉,就可以連通,說明還有什麼連接埠未開啟所致。
當我開啟1521連接埠時,串連操作仍然失敗。我又懷疑網路有問題,用telnet server_ip:1521嘗試,串連被接受,說明1521連接埠已經被開啟。
沒有辦法,查詢Oracle資料後才明白,network listener 只起一個中介作用,當客戶串連它時,它根據配置尋找到相應的資料庫執行個體進程,然後spawned一個新的資料庫連接,這個串連連接埠由network listener傳遞給客戶機,此後客戶機就不再和打交道了,即使listener停止了工作。這個新的串連連接埠是不可預知的,因而會被防火牆阻止。
Windows Socket2 規範有一個新的特性,就是Shared Socket, 所謂共用通訊端是指一個進程共用另一個進程的通訊端(詳見MSDN相關參考)。如果讓network listener與資料庫服務進程共用通訊端,那麼串連連接埠就不會變化。
如何設定 Shared Socket?
在註冊表:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0上建立一個字串值:USE_SHARED_SOCKET=true。如果安裝了多個目錄,則每個類似的目錄都要設定:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx (x目錄編號)
設定後要求重新啟動執行個體
Oracle 原文:
USE_SHARED_SOCKET
You can set the USE_SHARED_SOCKET parameter to TRUE to enable the use of shared sockets. If this parameter is set to TRUE, the network listener passes the socket descriptor for client connections to the database thread. As a result, the client does not need to establish a new connection to the database thread and database connection time improves. Also, all database connections share the port number used by the network listener, which can be useful if you are setting up third-party proxy servers.
On Windows NT 4.0 Service Pack3 or earlier, enabling this option precludes bringing the network listener up or down in a case where a database connection spawned by the network listener is active. Therefore, you may
need to shut down all of the databases serviced by a network listener before you can bring down and restart a network listener. This results from the way shared sockets have been implemented in WINSOCK2. WINSOCK2 does not
allow a reliable thread to a network listener on any port on which other connections are also active. This is not an issue on Windows NT 4.0 Service Pack 4 orlater. Oracle recommends that you upgrade to Windows NT 4.0 Service Pack 4 if you intend to set this parameter.
This parameter only works in dedicated server mode in a TCP/IP environment. If this parameter is set, you cannot use the 8.1.5 listener to spawn Oracle 7.x databases. To spawn an Oracle 8.0.x database from an 8.1.5 listener
Oracle用戶端串連伺服器,首先去找1521監聽連接埠,伺服器的1521監聽連接埠再向server process進程發出請求,並返回一個隨機連接埠,返回給用戶端,用戶端再來串連這個連接埠。 這樣就給伺服器上的防火牆設定帶來了麻煩,這個連接埠是隨機的,如何開放?
windows 平台上的這個問題成了一大難題,很多論壇都有人問,但很少有人能解決。 unix平台不用擔心,系統自動會解決這個問題.
windows 平台上的這個問題成了一大難題,很多論壇都有人問,但很少有人能解決。 unix平台不用擔心,系統自動會解決這個問題. Matalink上提供了三種解決辦法,實際上USE_SHARED_SOCKET 是最有效最方便的。但經過無數次實現,仍然沒有成功,最後終於發現是Oracle 8.1.7的bug 需要打補丁,升級到Oracle 8.1.7.1.2
需要在MTS模式下(共用模式)
需要在MTS模式下(共用模式) Oracle預設是專用模式。
經實驗發現,如果不在init檔案中設參數的話,Oracle仍然會要求一個隨機連接埠和1521連接埠來共同通訊,只是這個隨機連接埠,並不隨用戶端工作階段和登入的變化而變化,在沒有重啟伺服器時,是固定的。
經實驗發現,如果不在init檔案中設參數的話,Oracle仍然會要求一個隨機連接埠和1521連接埠來共同通訊,只是這個隨機連接埠,並不隨用戶端工作階段和登入的變化而變化,在沒有重啟伺服器時,是固定的。(實驗發現,在專用模式下,每次串連,oracle伺服器會按+1方式,提供一個非1521的連接埠。)所以,還需要在init.ora檔案的最後加上一條參數:
mts_dispatchers="(address=(protocol=tcp)(host=myoradb)(port=1521))(dispatchers=1)"
這樣才真正實現只用一個連接埠,穿過防火牆。
這樣才真正實現只用一個連接埠,穿過防火牆。