Sql-Server-2019

輔助伺服器上的 SQL 2019 高可用性儲存過程問題

  • August 10, 2022

我剛剛將我的高可用性環境從 SQL 2017 升級到 2019 版本 15.0.4236.7 我在兩台伺服器上都有相同的 SQL 代理作業,並帶有一個初始子句來確定作業是否應該執行(如果伺服器是主伺服器)。這在過去一直有效,但我遇到了錯誤。現在,如果輔助伺服器上的同一作業呼叫儲存過程,它就會失敗。如果作業具有對只讀表的內聯選擇,則作業執行沒有問題,但 proc 會拋出“目標數據庫目前是……”的錯誤。就好像在執行之前讀取了過程,而在呼叫該行之前不會讀取行內選擇。這是一個適用於 2017 年輔助伺服器但不適用於 2019 年的簡單測試。不確定它是錯誤還是功能。

   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
use master; 
Declare @AGName varchar(20)  = 'MY-SQLAGNAME'

declare @ret bit

   SELECT
       @ret = count(AGC.name)
   FROM
    sys.availability_groups_cluster AS AGC
     INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS RCS ON RCS.group_id = AGC.group_id
     INNER JOIN sys.dm_hadr_availability_replica_states AS ARS ON ARS.replica_id = RCS.replica_id
   WHERE
    ARS.role_desc = 'PRIMARY' and AGC.name = @AGName and RCS.replica_server_name = @@ServerName 


if @ret = 1
begin;

Select 'Shouldt go in here'

select top 1 * from MyDby.dbo.MyTable -- This works

exec MyDb.dbo.AnyProcedure -- This Bombs 

end

我建議改變你的流程。

  1. 將主要檢查邏輯從過程中移到作業的第一步。如果該步驟失敗,則退出報告成功的作業。這樣,不會執行其他步驟,並且您不必重複邏輯。
  2. 您可以使用函式sys.fn_hadr_is_primary_replica而不是查詢 DMV 。

一個數據庫只能屬於一個 AG。所以這裡有一個第一步邏輯的例子。然後,當然,您也可以將其包裝在一個過程中。

IF sys.fn_hadr_is_primary_replica ('MyDb') <> 1
   RAISERROR('Not a primary replica.', 16, 1)

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