Sql-Server

鏡像上的作業正在針對主節點執行

  • June 19, 2021

我在目前的主要和鏡像故障轉移 SQL Server 設置之間有一組鏡像作業。過去,鏡像伺服器上的作業在啟用時會失敗,因為它們無法打開本地數據庫,因為它處於恢復狀態。但是,我現在看到作業成功並正在轉發到目前的主數據庫。

我已經看到 .Net 使用的 SQL Server 驅動程序的這種行為,因此如果發生故障轉移,它將允許自動重新連接。我以前在 SQL 作業中沒有看到過這種行為,而且我似乎找不到任何關於它的文件。

我發現另外兩個提到此行為()的解決方法,但是我很難找到有關此功能的文件,因此我知道這是我所做的配置更改還是啟用了我安裝的更新。

此功能是否記錄在 Microsoft 的任何參考資料中?

這些作業是 T-SQL 步驟,它們正在讀取和(成功)寫入。有些是內聯 T-SQL,有些是在目標數據庫中呼叫 SP。我使用的是標準鏡像而不是可用性組。

過去似乎有很多人遇到過這個問題,他們都實施了一種或另一種解決方法來擺脫它。未在 Microsoft 網站上記錄或由任何已知的 SME(主題專家)提供。

首先,我會說數據庫鏡像已被棄用,並且在不久的將來微軟不會支持,因此您應該計劃更改它並用另一種方​​法替換。

此功能將在 Microsoft SQL Server 的未來版本中刪除。避免在新的開發工作中使用此功能,併計劃修改目前使用此功能的應用程序。請改用 Always On 可用性組。

如上所述,我認為很少有有趣的解決方法可以用來避免這個問題:

  1. 禁用作為數據庫鏡像一部分的數據庫的 SQL Server 代理作業。這可以使用最後給出的程式碼來完成:
  2. 使用數據庫名稱作為在輔助數據庫上執行的作業的第一步,因為數據庫將處於恢復或待機狀態。作業會失敗。
  3. 如果所有作業都與數據庫鏡像的數據庫部分相關,則停止 SQL Server 代理。
  4. 從中獲取鏡像角色的價值msdb.sys.database_mirroring並將其包含在您的工作步驟中。在此處閱讀更多操作方法。

要禁用作業步驟,如果有很多作業,您可以使用以下腳本:

DECLARE @sql nvarchar(max)
   ;WITH cte AS (
   SELECT  j.job_id,
           j.[name]
   FROM msdb.dbo.sysjobs j
   WHERE j.[name] like 'Job_Name%' 
   )
   SELECT @sql = (
       SELECT 'EXEC msdb.dbo.sp_update_job @job_id = '''+CAST(job_id as nvarchar(max))+''', @enabled = 0;'+CHAR(10)
       FROM cte
       FOR XML PATH('')
   )
   EXEC sp_executesql @sql

希望這可以幫助。

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