常見的數據庫連接問題無外乎是在數據庫服務器本地可以連接SQL Server,但通過其他服務器就不可以連接。但這次我卻碰到了相反的情況,在服務器本地無法通過IP/實例名連接,但從其他服務器卻可以。而且每次重啟后問題短暫消失,不多久后,又重現。我還是第一次碰到這樣的問題。通過深究后找到了根本原因:竟然是某殺毒軟件惹的禍。。。。。
報錯截圖
下面分享下我的排錯過程:
一.本地使用IP/實例名無法訪問服務器,但通過機器名可以;
我們知道,使用IP/實例名訪問SQL Server時所采用的協議與使用機器名或者"."是不一樣的,前者是通過SQL Server的TCP/IP方式訪問,后兩者是通過命名管道的方式訪問,既然命令管道的方式可以訪問,說明數據庫用戶沒有被禁用或者沒有被拒絕遠程連接,而且問題應該在tcp/ip上,也就是說這應該是一個網絡問題,而不是SQL Server的配置問題。
二.外部機器可以連接進來,也可以telnet DB服務器IP的1433端口;
這說明DB服務器的防火牆應該沒有問題,再說,防火牆是防外不防內,內部不能訪問肯定跟防火牆沒有關系。
另外,我在其他服務器和DB服務器上的cmd中執行netstat -ano|findstr 1433,可以看到實際上兩台服務器建立了tcp連接;
三.在數據庫服務器本地telnet 1433端口,telnet不成功;
分析到這里的時候,我突然想起來了之前處理的一個問題,就是服務器本地的使用的tcp端口太多了,達到了上限(65536),導致應用程序新的TCP請求沒法分配到TCP端口,因此無法網絡通訊。這個現象跟這個情況很類似,數據庫服務器本地發起數據庫連接時,SSMS要分配一個本地的隨機TCP端口,如果端口不夠用了,肯定就不能連接SQL Server了,至於外部機器為什么能夠連接進來,是因為他們使用的是自己的TCP端口來連接SQL Server的1433端口,並不需要數據庫服務器單獨再開TCP端口。
根據這個思路,我通過tcpview查看數據庫服務器的端口使用情況,結果令我失望了,竟然很正常,難道是我判斷出錯了,可是按照現象應該就是這樣的呀,無意中看到服務器右下角某數字公司的安全衛士,豁然開朗,安全軟件經常干影響網絡通訊的事情,將其卸載后一切正常。。。。。
PS:本文並不是黑某殺毒軟件,只是想說市面常見的這些防護軟件這都是為個人電腦設計的,服務器的使用情況跟個人電腦有很大不同,請不要輕易在服務器上安裝殺毒軟件,以免帶來一些意想不到的壞影響。