Sql-Server

AAG 數據庫未備份

  • November 17, 2020

我將以下程式碼與 Ola Hallalengren 的腳本一起使用,在 3 節點 AAG 設置上執行僅複製備份。我已配置為使用“首選輔助”選項執行備份。當我從主副本觸發作業時,只有 AAG 外部的數據庫在備份,當我從輔助副本之一觸發它時,只有 AAG 數據庫在備份。

備份的優先級是這樣的

小學 - 50%

中學 - 50%

中學 1 - 40%

我錯過了什麼?請提出建議。謝謝!

sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d master -Q "EXECUTE [dbo].[DatabaseBackup] @Databases = 'USER_DATABASES', @Directory = N'\\SQL02\Backups', @CopyOnly = 'Y', @BackupType = 'FULL', @Verify = 'Y', @CleanupTime = NULL, @CheckSum = 'Y', @LogToTable = 'Y'" -b

我已配置為使用“首選輔助”選項執行備份。

首選輔助- 將備份在具有最高優先級的輔助上。如果沒有可用的輔助節點,它將在主節點上備份。

當我從主副本觸發作業時,只有 AAG 外部的數據庫在備份,當我從輔助副本之一觸發它時,只有 AAG 數據庫在備份。

首先我想說的是,我試圖以簡潔的方式進行解釋,但由於功能邏輯,請詳細說明。

確定備份首選項和優先級後,就可以設置 SQL Server 代理作業來執行備份了。值得慶幸的是,微軟為我們提供了一個名為sys.fn_hadr_backup_is_preferred_replica. 0如果目前實例不是首選備份位置,或者1根據首選項和優先級設置它是備份的首選副本,則此函式將返回。

IF (NOT sys.fn_hadr_backup_is_preferred_replica(@DBNAME))  
BEGIN  
     Select ‘This is not the preferred replica, exiting with success’;  
     RETURN 0 – This is a normal, expected condition, so the script returns success  
END  
BACKUP DATABASE @DBNAME TO DISK=<disk>  
  WITH COPY_ONLY; 

根據此處的 MSDB BOL要考慮給定可用性組的自動備份首選項,在託管備份優先級大於零 (>0) 的可用性副本的每個伺服器實例上,您需要為數據庫中的備份作業編寫腳本可用性組。要確定目前副本是否是首選備份副本,請使用sys.fn_hadr_backup_is_preferred_replica備份腳本中的函式。如果目前伺服器實例託管的可用性副本是備份的首選副本,則此函式返回1. 如果不是,則函式返回0. 通過在查詢此函式的每個可用性副本上執行一個簡單的腳本,您可以確定哪個副本應該執行給定的備份作業。

使用此邏輯編寫備份作業的腳本使您可以安排作業在同一時間表上在每個可用性副本上執行。這些作業中的每一個都會查看相同的數據以確定應該執行哪個作業,因此只有一個計劃作業實際上會進入備份階段。

注意:- 沒有執行 AutomatedBackupPreference。此首選項的解釋取決於您為給定可用性組中的數據庫編寫備份作業的邏輯(如果有)。自動備份首選項設置對臨時備份沒有影響。

正如,我想說的是,當您通過“主副本”中的維護計劃配置 AAG 的自動備份時,以及當您的備份首選項將是“首選輔助副本”時,在這種情況下,非 AAG 數據庫也將在主副本中備份副本備份位置,在執行維護計劃計劃備份之後。和可用性數據庫你不會在主副本的備份位置找到。但是當您通過“顯示儀表板”檢查“同步狀態”時,您會發現,兩個副本都處於“同步狀態”。

作為參考,我正在編寫最後一個腳本,該腳本已在我的伺服器中執行(日期為 ‘15-10-2016’)至'maintenance plan backup'. 哪個腳本如下:-

DECLARE @preferredReplica int

SET @preferredReplica = (SELECT [master].sys.fn_hadr_backup_is_preferred_replica(''Database1''))

IF (@preferredReplica = 1)
BEGIN
   BACKUP DATABASE [Database1] TO  DISK = N''H:\SQLSRV-N01_Backup_Files\Automatic Backup\Database1_backup_2016_10_15_000001_6209992.bak'' WITH  COPY_ONLY, NOFORMAT, NOINIT,  NAME = N''Database1_backup_2016_10_15_000001_6209992'', SKIP, REWIND, NOUNLOAD,  STATS = 10
END

GO
DECLARE @preferredReplica int

SET @preferredReplica = (SELECT [master].sys.fn_hadr_backup_is_preferred_replica(''Database2''))

IF (@preferredReplica = 1)
BEGIN
   BACKUP DATABASE [Database2] TO  DISK = N''H:\SQLSRV-N01_Backup_Files\Automatic Backup\Database2_backup_2016_10_15_000001_7520058.bak'' WITH  COPY_ONLY, NOFORMAT, NOINIT,  NAME = N''Database2_backup_2016_10_15_000001_7520058'', SKIP, REWIND, NOUNLOAD,  STATS = 10
END

GO
DECLARE @preferredReplica int

SET @preferredReplica = (SELECT [master].sys.fn_hadr_backup_is_preferred_replica(''Database3''))

IF (@preferredReplica = 1)
BEGIN
   BACKUP DATABASE [Database3] TO  DISK = N''H:\SQLSRV-N01_Backup_Files\Automatic Backup\Database3_backup_2016_10_15_000001_7770006.bak'' WITH  COPY_ONLY, NOFORMAT, NOINIT,  NAME = N''Database3_backup_2016_10_15_000001_7770006'', SKIP, REWIND, NOUNLOAD,  STATS = 10
END

GO
BACKUP DATABASE [Database4] TO  DISK = N''H:\SQLSRV-N01_Backup_Files\Automatic Backup\Database4_backup_2016_10_15_000001_8030022.bak'' WITH  COPY_ONLY, NOFORMAT, NOINIT,  NAME = N''Database4_backup_2016_10_15_000001_8030022'', SKIP, REWIND, NOUNLOAD,  STATS = 10

GO
BACKUP DATABASE [Database5] TO  DISK = N''H:\SQLSRV-N01_Backup_Files\Automatic Backup\Database5_backup_2016_10_15_000001_8280125.bak'' WITH  COPY_ONLY, NOFORMAT, NOINIT,  NAME = N''Database5_backup_2016_10_15_000001_8280125'', SKIP, REWIND, NOUNLOAD,  STATS = 10

GO

在這裡,我只更改了數據庫名稱,否則一切都是腳本。如您所見,上面的程式碼 Database1、Database2 和 Database3 是 AAG 數據庫。這就是為什麼它會自動檢查“標量值函式”(即;sys.fn_hadr_backup_is_preferred_replica)。對於 database4 和 database5 ,它不會檢查該功能,因為這些數據庫是非 AAG 數據庫。因此,在執行我的“主伺服器副本”“維護計劃計劃備份”後,只有我在指定的備份位置找到了非 AAG 數據庫。

所以,我可以說你在 Ola Hallalengren 的劇本中沒有遺漏任何東西。

備份參與 AlwaysOn 可用性組和活動輔助伺服器的 SQL Server 數據庫:備份輔助副本(Always On 可用性組)

您可以在代理作業中配置多個步驟,分別備份數據庫 AG 和 NON AG。

1.作業的第一步應該檢查首選副本。如果首選副本為真,則應轉到第二步,如果首選副本為假,則應轉到第三步

  1. 如果工作進入第二步,您已經使用的腳本應該很方便。因為它必須與AG一起備份所有數據庫
  2. 如果工作進入第三步,您可以通過修改腳本中的@databases 來@Databases = 'USER_DATABASES, -AVAILABILITY_GROUP_DATABASES', 排除 AG 數據庫並僅備份非 AG 數據庫,這將排除 AG 數據庫並僅備份非 AG 數據庫,

注意 - 如果完全備份發生在輔助伺服器中,它將是一個 copy_only 備份。所以請確保您檢查正確。如果首選是次要的,也不要配置增量。

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