在教授 SQL 課程的時候,時常遇到一些要練習安裝 AlwaysON 的學生,在設定的時候常犯的權限問題,因此把問題整理一下,讓同學可以參考一下。
當有些朋友開始架設 AlwaysON 的時候,因為不大熟悉網域的運作,有時會犯了一些設定上的錯誤,因此整理一下問題發生的原因和處理方式
在下面我們的案例當中,會有兩台 SQL Server 的主機,分別是 LabA 和 LabB 這兩台,並且架設在 myLab.com 的網域當中。
一般來說,在 Windows Server 設定 AlwaysON 的時候,大家都會記得把 SQL Server 新加入到網域中,並且設定好容錯移轉叢集。然後在 SQL Server 設定管理員內,去勾選加入 AlwaysON 可用性群組,完成相關前置作業。接著使用 SSMS ,透過「新增可用性群組精靈」來完成相關的設定。當看到類似下圖的步驟後,通常會感覺就完成相關設定,應該可以正常來使用了。
但當我們實際檢查可用性群組的狀況時,卻會發現在 SSMS 上所呈現的似乎有點不正常。
看起來只有建立起來,但 主要伺服器 和 次要伺服器 之間卻沒有辦法正常進行連結,也造成資料庫沒有進行同步處理。
從上述的敘述中,其實是很不容易看到錯誤發生的原因,只能知道兩者之間可以建立 ( 因此看起來並不是防火牆之類的問題 ),但卻沒有辦法同步。因此我們查看一下 SQL Server 的錯誤紀錄檔中的錯誤訊息,可以看到會有非常多類似以下的錯誤訊息
日期 2020/5/5 下午 05:58:11
記錄檔 SQL Server (封存 #5 - 2020/5/5 下午 07:01:00)
來源 Logon
訊息
Database Mirroring login attempt by user 'MYLAB\LABB$.' failed with error: 'Connection handshake failed. The login 'MYLAB\LABB$' does not have CONNECT permission on the endpoint. State 84.'. [CLIENT: 10.0.1.8]
因此很多時候看到上述的訊息,我們會覺得應該是權限沒有設定好,因此會造成從 LabA 的電腦上,看到有個電腦帳號( Computer Account ) MYLAB\LABB$ 來連接 LabA 的時候,因為沒有 connect 的權限導致無法連接。看到這樣的訊息時,您會怎麼樣的來處理呢 ? 我想大部分人看到這樣的訊息時,多半都會想那我們就在 LabA 和 LabB 這兩台 SQL Server 上,互相把對方的電腦帳號給加上,並且給予 public 的權限應該就沒有問題了。但當我們加入這個帳號之後,也賦予了 public 的權限,但似乎錯誤訊息還是依然持續發生,可是從訊息中看到的權限我們都已經加入了啊 ?
其實這個部分是我們大部分常會被那個錯誤訊息給誤導,其實對 LabA 來說,電腦帳號 MYLAB\LABB$ 要連接的其實不是 TSQL 的端點,而是要連接的是資料庫鏡像的端點,所以我們不只是要在前面的步驟先把電腦帳號給加入,還要賦予那個電腦帳號可以連接資料庫鏡像的端點,因此我們需要用類似以下的語法來進行
當設定好之後,再過一下( 要看您的資料庫的大小和加入到可用性資料庫的數目會相對增加一些時間 )的時間,透過高可用性群組的儀表板,我們可以發現資料庫已經可以順利完成同步了。
其實在上述的過程當中,最主要的問題在於我們測試的兩台 SQL Server ,我們是使用安裝時候預設的虛擬帳號去啟動 SQL Server Engine 的服務,並沒有特別去建立一個網域使用者來啟動 SQL Server 的服務,或者是使用網域的 受管理服務帳號 ( Managed Service Account ) 來啟動 SQL Server Engine 的服務( 受管理帳號可以參考 「SQL Server Cluster 安裝在 CSV ( Cluster Shared Volumes ) 上的注意事項 」)
所以如果我們查看 SQL Server伺服器管理員的時候,我們如果在安裝的時候沒有特別調整,那麼預設的會採用虛擬帳號來啟動服務。
如果我們在網域上建立一個 sqluser 的帳號,並且設定使用這個網域帳號來啟動 SQL Server 的服務,要記住不要用 Windows 下的服務管理來設定,一定要使用 SQL Server 的伺服器管理員來做設定。
當我們透過伺服器管理員設定好之後,那個網域使用者的相關權限設定就會自動設定好了。而後續如果再去建立 AlwaysON 的時候,則也就不會有相關的權限問題發生了。
因此我們總結一下前面的處理步驟,比較簡單的方式就是讓兩台 SQL Server 使用網域帳號或受管理服務帳號,但如果沒有做那樣的設定的話,那麼要記得當你使用虛擬帳號啟動 SQL Server 服務的時候,則要記得將其他會連接的電腦帳號,要賦予資料庫鏡像端點的連結權限,才能順利讓 AlwaysON 的服務可以順利同步資料庫。