添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
捣蛋的针织衫  ·  【sun.rmi.transport.tcp】·  1 月前    · 
爱喝酒的火车  ·  启动Spring ...·  1 月前    · 
飘逸的登山鞋  ·  数据划分 - Apache Doris·  1 月前    · 
淡定的梨子  ·  UE4+vs2017 ...·  11 月前    · 
有胆有识的小蝌蚪  ·  BookFusion·  1 年前    · 
image
圖片來源:https://pixabay.com/en/key-tag-security-label-symbol-2114047/

任何一個比較大一點的系統都會需要使用到SQL,而以.Net開發為主最長用的資料庫基本上都是MSSQL。

不過MSSQL不一定是我們裝的,因此常遇到的問題就是給的 資訊不夠完整 ,或者 裝的時候缺少一些步奏 ,導致花費很多時間在找出為什麼MSSQL連線不到。

這篇希望提供一個故障排除指南,方便未來如果又連不到的時候可以依照這個項目來排除問題。

關鍵字:troubleshooting guide for MSSQL Database connection problem.

排除清單 - TL;DR

以下清單提供一步一步的排除步奏,基本上如果都做完之後連線基本上沒有什麼問題。

檢查項目 檢查方式 是否通過?
檢查服務是否有啟動? 透過 Sql Server Configuration Manager -> Sql Server Services 確認狀態是 Running
確定連線的DB Server Name

有兩種Instance名稱:

  1. Default Instance - MSSQLSERVER - 連線就是 {computername}
  2. Named Instance - 例如 SQLEXPRESS - 連線就是 {computername}\SQLEXPRESS
用local檢查tcp是否有通

使用Sql Server Management Studio(以下簡稱SSMS)連線的時候,在 Server Name 之前加上 tcp:

例如:假設Server Name是 localhost\SQLEXPRESS ,那麼連線就是用 tcp:localhost\SQLEXPRESS

如果連線不到, Sql Server Configuration Manager -> SQL Server Network Configuration - 確定 TCP/IP 是啟動的

用local檢查Database的port

可以先透過local連線過去(不要用tcp模式),然後檢查log看看目前在聽那個port 如果要調整port可以透過: Sql Server Configuration Manager -> SQL Server Network Configuration -> TCP/IP 右鍵 -> 內容 確認 IP Addresses 頁簽裡面最後一項 IP All TCP Port 數字。

如果不是 1433 ,就在 DB Server Name 後面加上 ,{port} ,例如假設port是50021,那麼整個就是 tcp:localhost\SQLEXPRESS,50021

用local檢查sql帳號登入是否通過 有幾個部分可以檢查:
  1. 如果出現18456 - 表示沒有開啟 Mixed mode (允許sql帳號和windows帳號登入)
  2. 如果出現 預設db 開啟不了 - 檢查這個使用者的權限
用remote測試連線 - 防火墻

使用遠端要連到db的那台測試 - 可以使用 .udl 檔案來做

注意防火墻設定,要開啟上面找到的port

排除問題的詳細步奏

接下來將會對於每一個步奏會有更加詳細的介紹。

檢查服務是否有啟動?

開始 裡面找到安裝的SQL Server版本,展開之後選擇 Configuration Tools -> Sql Server Configuration Manager

image
開啟Sql Server Configuration Manager

從左邊選取 SQL Server Services ,然後檢查右邊 SQL Server 的狀態處於 Running

image
確認Sqlexpress這個instance狀態處於Running

確定連線的DB Server Name

需要先確認DB的Instance名稱。

從上一個步奏確認服務是否有啟動的部分,可以看到在括弧裡面的就是DB的Instance名稱。以剛剛那個為例子,就是 SQLEXPRESS

Instance名稱有分為2種:

  1. Default Instance - MSSQLSERVER 是Default Instance
  2. Named Instance - 其他設定都是Named Instance

如果是 Default Instance ,那麼連線的DB Server Name就是 {電腦名稱} ,如果是 Named Instance ,那麼就是 {電腦名稱}\{Instance名稱}

以剛剛那個instance為例,因為它是Named Instance,因此它的Server Name是 localhost\SQLEXPRESS

image
測試的連線畫面

Network:用local檢查tcp是否有通

當上面步奏連線成功的時候,走的是 Shared Memory 的通道,因此 不表示tcp連線 (因為從另外一台連過來走的通道)是可以通。

為了避免其他network的問題,可以先在local(DB在的那台)測試tcp通道是否有問題。

做法很簡單,就是把上一步取得的DB Server Name的前面加上 tcp: 即可,因此最後的結果是: tcp:localhost\SQLEXPRESS

image
測試tcp連線的畫面

如果連線失敗,用 Sql Server Configuration Manager -> Sql Server Network Configuration 裡面的 Protocols for {instance name}

確定 TCP/IP 處於 Enabled 的狀態。

image
確認TCP/IP是啟用的狀態

Network: 用local檢查Database的port

如果上一個步奏 TCP/IP 已經是 Enabled 的情況但是還是連不到,檢查一下port是否正確。

預設port是 1433 ,如果DB不在預設port,那麼連線的時候需要打上port號。

先用local的方式連到DB(不要加上tcp的部分)去檢查log看看目前在聽那個port:

image
檢查步奏
  1. 選擇 Management
  2. 選擇 SQL Server Log
  3. 選擇最新的一筆
  4. 從跳出的畫面選擇 Filter
  5. Message Contains Text 輸入:server is listening on
  6. 勾起來 Apply Filter
  7. 選擇ok
  8. 檢查結果,可以看到這個聽的port是50021

修改port號可以透過 Sql Server Configuration Manager 工具的:

  1. Sql Server Network Configuration -> Protocols for {instance name}
  2. TCP/IP 右鍵 然後選擇 內容
  3. 切換到頁簽 IP Address ,並且卷到做下面,檢查 IP All 的TCP port是不是1433。
image
檢查port的方式
如果有改TCP Port,記得要重啟DB Service才會有作用。
假設port有修改,連線的時候在後面加上 ,{port號} 即可使用哪個port做連線。例如假設port號是 50021 ,那麼連線就是: tcp:localhost\SQLEXPRESS,50021
image
連線畫面

用local檢查sql帳號登入是否通過

一般來說連線的時候都是使用Sql帳號(而不是Windows驗證),因此要用local測試使用Sql帳號是否能夠登入。

假設出現了登入錯誤,Sql Error 18456,表示沒有開啟 Mixed Mode ,解決方式:

  1. 先用Windows驗證連到DB並且對DB點 右鍵 ,選擇 Properties
  2. 切換到 Security 的左邊menu
  3. 選擇 Sql Server and Windows Authentication Mode - 並且記得 重啟DB的Service
image
設定畫面

用remote測試連線 - 防火墻

基本上如果上面都做完,基本上連線就不會有什麼問題,剩下可能會擋的部分就剩下防火墻。

可以先嘗試把DB那台和需要連到DB的那台的防火墻 先關掉 做測試,如果可以連,在把它打開,然後設定允許DB的port連線。

如果AP那台沒有連線工具可以連到DB做測試,那麼可以建立 udl 檔案做連線測試。

詳細做法可以參考: 使用udl檔案測試DB連線是否成功

結語

DB連線不到的問題可能牽扯到很多不同部分的設定,因此希望透過這一篇提供的一步一步排除步奏能夠在未來如果遇到連線不到的情況能夠快速找到問題。

參考資料

官方的troubleshooting guide
Troubleshoot Connecting to the SQL Server Database Engine
介紹設定防火墻
Configure a Windows Firewall for Database Engine Accessä
另外一個的troubleshooting guide
Steps to troubleshoot SQL connectivity issues
  • 微軟雲端 Microsoft Azure 入門 - 快速考到第一張雲端證照 AZ-900
  • 微軟 Azure|通關 AZ-104 認證,邁向雲端 IT 管理之路
  • AZ-204 認證攻略I從Azure著手雲端開發解決方案
  • GitHub Copilot AI賦能開發實戰訓練班
  • 「打造自己的template-建立一致性程式碼」 (13) 「Cognitive Service之Face Api」 (13) 「從 Microsoft Learn 學 Azure」 (11) 「Bot Framework V4」 (10) azure-devops (10) 「證照」 (10) hadoop (9) 「部落格改版學DevOps」 (8) 「Azure DevOps」 (8) best practices (7) custom-vision (7) luis (7) 「開發工具小技巧」 (6) csharp (6) test (6) 「.net core 與 .net standard 實戰教學」 (6) lab (6) wyam (6) apiary (6) code-quality (5) qna-maker (5) code-review (5) 「簡報」 (5) api-blueprint (4) nuget (4) microsoft-teams (4) data processing (4) 「net framework工程師看net core」 (4) asp-net-core (4) 「devdaysasia2019」 (4) r (4) sql (4) 「挑選適合的 Azure 服務」 (4) speech-service (4) computer-vision (4) iis (3) 「回顧」 (3) 「微軟 MVP」 (3) postman (3) ssh (3) autofac (3) entity framework (3) net-standard (3) visual studio team service (3) continuous-delivery (2) netlify (2) azure-app-service (2) refactor (2) bot (2) docker (2) azure-iot-hub (2) security (2) kubernetes (k8s) (2) ml-classifier (2) 書評 (2) cost (1) visual studio code (1) debug (1) network (1) markdown (1) cosmos db (1) 「ebook」 (1) 「AZ-204 在考什麼」 (1) generative-ai (1) ddd (1) cake (1) reliability (1) seo (1) python (1) 「az104-lab」 (1) linq (1) ACS (1) AI (1) ChatGPT (1) application-insight (1) OpenAI (1) semantic-kernel (1) jquery (1)