[SQL][Troubleshooting]SQL Server 連線問題
最近看到 FB 不時有人在詢問為什麼連不上 SQL Server 的問題,而自己周遭也常遇到有這樣的問題,剛好在 SQL Pass 的 FB 上看到有分享過這樣的資料,因此把這些給整理一下。
一般來說我們大部分的資料庫環境都會類似這樣,因此當我們要來查看連不上 SQL Servr 的時候,則首先我們會先從主機、網路然後 Client 的順序依序來查看。
資料庫主機
- 當我們要來查看連不上資料庫主機的時候,首先必須先確定 SQL Server 的相關服務是否啟動,這個部分可以透過工作管理員或者是 SQL Server 組態管理員 ( SQL Server Configuration Manager ),抑或者是透過 Windows 的服務管理原來查看服務是否正常啟動。如果沒有啟動成功的話,則可以先透過 Windows 的事件檢視器或者是 SQL Server 的 Error Log 來做查看。
- 如果 SQL Server 可以正常啟動的話,則接下來建議查看伺服器的安全性,檢查伺服器驗證是採用哪種模式。如果採用 Windows 驗證的話,那麼就沒有辦法用 SQL Server 密碼驗證的方式,也就是說你用 sa 或者是其他建立在 SQL 內的帳號就無法連連接了。
- 有些時候大家可能比較會注意前面所介紹的狀況,但還有一種是預設採用 Windows 驗證方式,後來改成混合的方式,但此時要注意在這樣的狀況下,sa 或者是其他您所要使用的 SQL 登入帳號是否有被啟用,如果沒有啟用的話,則這個帳號也是無法登入的。
- 檢查完 SQL Server 相關帳號設定,接下來可以再查看一下所使用的通訊協定,此部分可以透過 SQL Server 組態管理員來做查看,查看您要連線所使用的通訊協定和 Port 是否有正常被設定
- 另外也可以透過 SSMS 利用 xp_readerrorlog 的預存程序來查看 SQL Server 是否有正常載入這些設定。如果您主要是採用 TCP/IP 的話,也可以利用 DOS 指令 netstat –an 來檢查是否 SQL Server 的服務有在監聽 ( Listen ) 這些所使用的 Port
網路
- 當檢查完主機的設定之後,如果狀況還沒有改善,則可以來檢查相關的網路設定,一般來說在這裡我們會先利用幾個主要的指令 ping 、telnet 和 tracert 來做查驗。如果無法 Ping 到資料庫主機的話,一般來說如果不是防火牆設定不回應 ICMP,要不然就是網路連線有異常,因此可以先試著把防火牆關閉來做驗證。有些時候我們發覺用 IP 是可以連線,但使用電腦名稱則沒有辦法的話,則建議查看 DNS 主機的設定,或者是 Windows\System32\Drivers\etc 下面的 Hosts 檔案,看看是否有設定正確。
- 而普遍會發生的問題忘記把防火牆開個洞讓 SQL Server 連線,此部分可以透過防火牆設定作業,亦或者是參考微軟官方的設定 ( http://support.microsoft.com/kb/968872/zh-tw ),將以下的 Script 儲存成為一個批次檔 ( ex : sqlport.bat ),執行該批次檔案就會在防火牆上面將一些 SQL Server 會使用到的 Port 給開啟,此部分您可以按照您的環境再做一些調整。
@echo ========= SQL Server Ports =================== @echo Enabling SQLServer default instance port 1433 netsh firewall set portopening TCP 1433 "SQLServer" @echo Enabling Dedicated Admin Connection port 1434 netsh firewall set portopening TCP 1434 "SQL Admin Connection" @echo Enabling conventional SQL Server Service Broker port 4022 netsh firewall set portopening TCP 4022 "SQL Service Broker" @echo Enabling Transact-SQL Debugger/RPC port 135 netsh firewall set portopening TCP 135 "SQL Debugger/RPC" @echo ========= Analysis Services Ports ============== @echo Enabling SSAS Default Instance port 2383 netsh firewall set portopening TCP 2383 "Analysis Services" @echo Enabling SQL Server Browser Service port 2382 netsh firewall set portopening TCP 2382 "SQL Browser" @echo ========= Misc Applications ============== @echo Enabling HTTP port 80 netsh firewall set portopening TCP 80 "HTTP" @echo Enabling SSL port 443 netsh firewall set portopening TCP 443 "SSL" @echo Enabling port for SQL Server Browser Service's 'Browse' Button netsh firewall set portopening UDP 1434 "SQL Browser" @echo Allowing multicast broadcast response on UDP (Browser Service Enumerations OK) netsh firewall set multicastbroadcastresponse ENABLE
使用者
- 當前面所介紹的相關設定都設定好,但仍然無法連線的話,則我們會到使用者的電腦上來做檢查,此時我個人的習慣會去建立一個 UDL 的檔案 ( ex : sqlclient.udl ),然後在該檔案上面 Double Click ,或者是在該檔案按下滑鼠右鍵選擇開啟,此時將您的連線方式和相關參數設定進去,來看看是否可以正常連接。有些時候可能是因為我們前端指定到不正確的通訊協定或者是參數設定錯誤,就可以用這樣的方式去做測試了,而不用一直在應用程式上修改和設定,這樣可能會比較簡單也比較容易有正確的錯誤訊息。
- 另外有些時候有可能是因為安裝了防毒程式或者是其他的資安軟體,限制了連線的能力,此時都可以配合上述的 UDL 方式,將一些懷疑的程式一個一個關閉或者是調整相關設定,才找出有影響的問題。
- 而在個人的經驗中有遇到一些特殊狀況,可能在某些應用程式,在連線的時候無法指定 SQL Server 的連接 Port,但是他的 SQL Server 主機上預設的 1433 已經被其他 Instance 或者是應用程式所使用,不得已一定要使用其他的 Port 來連線的話,此時可以利用組態管理員來建立別名 ( Alias ) 的方式,當然除了可以指定特別的 Port,當你要特別指定通訊協定的話,可以可以使用同樣的方式來進行。
- 如果要使用別名的方式,則要特別注意一點的是要確定您的應用程式是 32 位元或者是 64 位元,這兩者設定的地方和存放機碼的位置也都不同,因此要注意一下。
上述所介紹的方式是參考一些網路文章和自己的經驗所整理出來的一些方法,應該大部分無法連接資料庫的方式應該都可以透過上述這些方式做個初步的判斷和排除,如果各位還有其他不同的方式和建議,也請各位前輩可以給點小弟一些建議囉。