常見的資料庫連接問題無外乎是在資料庫伺服器本地可以連接SQL Server,但通過其他伺服器就不可以連接。但這次我卻碰到了相反的情況,在伺服器本地無法通過IP/實例名連接,但從其他伺服器卻可以。而且每次重啟後問題短暫消失,不多久後,又重現。我還是第一次碰到這樣的問題。通過深究後找到了根本原因:竟然....
常見的資料庫連接問題無外乎是在資料庫伺服器本地可以連接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:本文並不是黑某殺毒軟體,只是想說市面常見的這些防護軟體這都是為個人電腦設計的,伺服器的使用情況跟個人電腦有很大不同,請不要輕易在伺服器上安裝殺毒軟體,以免帶來一些意想不到的壞影響。