記錄昨天踩到的地雷。在進行資料庫移轉作業,有幾台網站主機採用機器別名連線 MSSQL,做法是在 C:\Windows\System32\drivers\etc\hosts 加入一筆 IP 與機器名稱映(例如下圖的 NewSQL),設定連線字串時寫成 Data Source=NewSQL 不寫 IP。這麼做的好處是若日後 SQL 換 IP,只需修改 hosts 設定,連線字串不用換。

本次剛好就是 SQL 主機遷移要換 IP,這招的確幫上一些忙,少改了一些資料庫連線字串,但也讓我們摔坑,耗去好幾個小時的青春。

接到回報,某幾次機器在 hosts 改了新 IP,但網站卻一直連到舊 SQL 主機。但最吊詭的是,改完 hosts 後 ping 機器名稱有回應,telent 機器名稱 1433 或跑 Powershell tnc 機器名稱 -port 1433 也都通:(以下畫面來自在測試環境重現問題所做的現場模擬)

1433 測試 OK 理論上就該通,但使用 Data Source=NewSQL 連不到資料庫,開 SSMS 連 NewSQL 也得到網路不通的錯誤,但改用 IP 就可正常連上資料庫,十分吊詭:

歷經數小時奮戰,反覆檢查測試,同事 T 福至心靈,說他想到還有個地方可以設定別名:

暗暗暗暗暗,茶包居然藏在這裡。心中的萬頭羚羊擠破柵欄傾巢而出,四散奔逃,我趕得不亦樂乎 Orz

原來還有這一手。經過實測,當 hosts 與 Sql Server Configuration Manager / SQL Native Client Configuration 裡的別名同時存在時,以 SQL Native Client Configuration / Aliases 裡的設定為準(注意:它有 32bit 跟 64bit 兩個版本之分,SSMS 是用 32bit 設定)。有問題的機器就是原本有設定別名還指向舊 IP,這就可以解釋為什麼改 hosts IP 後,ping 跟 telnet 1433 測試都沒問題,但 ADO.NET 跟 SSMS 卻一直連到舊主機。

不經一事不長一智,下回遇到改 SQL hosts 後,用 IP 可通但用機器名稱卻不行的狀況,要記得先確認是否 SQL Native Client Configuration 的 Alias 在做怪。延伸閱讀:Overview of SQL Server Aliases

A case that I learned that SQL native client configuration alias wile overwrite system32/drivers/hosts setting while connecting SQL servewr.


Comments

# by ByTIM

不知道您知不知道,幫您補充: 資料庫名稱:.\SQLXXXXXX 若非預設執行個體,須加具名執行個體,如上 可以從 C:\Program Files\Microsoft SQL Server ,看到自己的名稱,如下 MSSQL14.SQLXXXXXX

# by Jeffrey

to ByTIM,感謝補充。

# by 好慘的新人

黑大: 請問如果 Sql Server NETWORK Configuration 的子節點的機碼都顯示空白,但值有出現,要怎麼修復呢?

# by Jeffrey

to 好慘的新人, 我的 SQL 技能只到玩票的水準,知識經驗有限,推薦可到 SQL Pass 向專家們請益 https://www.facebook.com/sqlpass.tw

Post a comment