Sql-Server-2016
2016 年的 SSISDB AlwaysOn 支持 - SSIS 故障轉移監視器作業在不可讀的輔助節點上失敗
在 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
注:編輯腳本