[Azure][VM]Azure SQL VM 上面的 SQL Agent 無法正常啟動 ?

Azure 上建立 VM 的時候可以透過 Marketplace 雖然有很多種的 SQL VM 的環境可以選擇,但並不是每個都可以運作正常

最近遇到一個 SQL Server 發生異常的狀況,因為情況有點緊急,因此就想說直接在 Azure 上面直接選擇一個 SQL VM 來做使用,而非自己在 Windows VM 下面手動去安裝 SQL Server,原本想說這種 Lab 已經做了超過 100 多次,熟悉到不能再熟悉,一定是萬無一失。

但就在當我們建立好 VM 之後,把相關資料庫移轉上去,並且開啟防火牆對外服務之後,沒有想到問題就出現了,我們沒有辦法啟動 SQL Agent ,也就沒有辦法建立維護計畫,因此 SQL Server 就在沒有備援的環境下運行,這實在是很令人害怕的一件事情。

我先透過 SSMS 去手動啟動 SQL Agent,但就是沒有任何反應;因此我又開啟伺服器管理員,看他的狀態是 Stopped,但一樣無法手動將 SQL Agent 給啟動。

 

因為沒有任何相關錯誤訊息,所以我直接到預設 SQL Server 2019 的 Log 下面去查看,雖然有看到 SQL Server 的 Error Log,但卻沒有看到 SQL Agent 的相關 Log,莫非 SQL Agent 的 Error Log 不是放在這裡嗎 ?

既然這裡沒有辦法找到 Log,因此我試著去找 Event Viewer ( 事件檢視器 ),看有沒有辦法找到相關的蛛絲馬跡,進而來解決問題。因為資料很多,所以我這裡只看 Error 和 Warning 的相關資訊,很快地就可以找到 SQL Agent 的錯誤,這裡顯示錯誤的原因是 Access is denied,因此就會懷疑是否是要寫入 Log 因為沒有權限所造成的問題。

因此我想先確定 SQL Agent 會把 Log 放在哪裡,因此我使用 msdb 下面的預存程序來進行處理 

EXEC msdb.dbo.sp_get_sqlagent_properties

但上述語法因為 SQL Agent 沒有正常啟動,因此會出現以下錯誤訊息

Msg 15281, Level 16, State 1, Procedure msdb.dbo.sp_get_sqlagent_properties, Line 0 [Batch Start Line 0]
SQL Server blocked access to procedure 'dbo.sp_get_sqlagent_properties' of component 'Agent XPs' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Agent XPs' by using sp_configure. For more information about enabling 'Agent XPs', search for 'Agent XPs' in SQL Server Books Online.

因此我們要先設法使用 sp_configure 來設定 Agent XPs

EXEC SP_CONFIGURE 'Agent XPs',1
GO
RECONFIGURE

設定好之後我們就可以重新用 sp_get_sqlagent_properties 來抓設定,從下圖中我們可以看到,目前 SQL VM 裡面的 SQL Server Agent 的 Error log 並沒有更改路徑,還是放在預設的位置

如果懶得下指令,此時也已經可以查看 SQL Agent 的屬性,同樣也可以查到 SQL Agent Error Log 的目錄

因此接下來我們有幾個方式,一種是更改該目錄的權限,一種是變更 SQL Agent 的 Log 存放目錄。這裡我們先朝向方法一的方式來進行,如果真的不行再來更改預設目錄。當我開啟 Log 目錄的察看 Security ( 安全性 ) 的設定,可以看到有 MSSQLSERVER 的虛擬帳號的權限,但卻沒有 SQL Agent 的虛擬帳號的權限,因此我們選擇 Edit 來進行修改

進入後看到跟之前相同的畫面,這裡我們選擇 Add 新增帳號

這裡我加入 SQL Agent 的虛擬帳號 「NT Services\SQLServerAgent」,輸入完之後按下旁邊的 Check Names 來做檢查

此時帳號會變成 SQLSERVERAGENT,表示有正確對應要該帳號,因此就可以按下 OK

此時賦予 SQLSERVERAGENT 對於 Log 目錄可以有完整的權限

當完成上述設定之後,SQL Agent 果然就可以正常運作了,我也可以繼續使用維護計畫來進行相關設定,又再度完成一個簡單任務。