Sql-Server-2016

2016 年的 SSISDB AlwaysOn 支持 - SSIS 故障轉移監視器作業在不可讀的輔助節點上失敗

  • May 12, 2020

在 SQL 2016 Enterprise 中使用新的 AlwaysOn 支持設置 SSISDB。這將創建兩個作業,其中之一是 SSIS 故障轉移監視器作業。二級不可讀。這項工作的程式碼是:

DECLARE @role int
DECLARE @status tinyint
SET @role = (SELECT [role] FROM [sys].[dm_hadr_availability_replica_states] hars INNER JOIN [sys].[availability_databases_cluster] adc ON hars.[group_id] = adc.[group_id] WHERE hars.[is_local] = 1 AND adc.[database_name] ='SSISDB')
IF @role = 1
BEGIN
   EXEC [SSISDB].[internal].[refresh_replica_status] @server_name = N'SQL2', @status = @status OUTPUT
   IF @status = 1
       EXEC [SSISDB].[catalog].[startup]
END

每次執行此作業時,由於 SSISDB 在此輔助實例上未聯機,我都會收到以下錯誤。這是因為 SQL Server 必須解析查詢的所有部分,無論條件程式碼路徑目前是否有效。由於 SSISDB 處於離線狀態,因此無法對其進行解析。

以使用者身份執行:##MS_SSISServerCleanupJobLogin##。目標數據庫“SSISDB”正在參與可用性組,目前無法訪問以進行查詢。數據移動已暫停,或者可用性副本未啟用讀取訪問。要允許對該可用性組中的此數據庫和其他數據庫進行只讀訪問,請啟用對該組中一個或多個輔助可用性副本的讀取訪問權限。有關詳細資訊,請參閱 SQL Server 聯機叢書中的 ALTER AVAILABILITY GROUP 語句。

$$ SQLSTATE 42000 $$(錯誤 976)。注意:該步驟已重試請求的次數 (3),但未成功。步驟失敗。

這段程式碼是由 SQL Server 生成的,而且由於它的設置如此簡單,我很難相信這是一個錯誤。但我不知道 1)它還能是什麼,以及 2)如何解決它並提供設計的功能,而輔助元件不可讀。

考慮將語句包裝在BEGIN END內部的塊中,sp_executeSQL以便它繞過語法檢查,直到執行時。

DECLARE @role int
SET @role = (SELECT [role] FROM [sys].[dm_hadr_availability_replica_states] hars INNER JOIN [sys].[availability_databases_cluster] adc ON hars.[group_id] = adc.[group_id] WHERE hars.[is_local] = 1 AND adc.[database_name] ='SSISDB')
IF @role = 1
BEGIN
   exec sp_executeSQL N'DECLARE @status tinyint;
   EXEC [SSISDB].[internal].[refresh_replica_status] @server_name = N''YourServerName'', @status = @status OUTPUT
   IF @status = 1
       EXEC [SSISDB].[catalog].[startup]'
END

注:編輯腳本

引用自:https://dba.stackexchange.com/questions/184579