SQL Server 可用性組和備份
SQL Server 可用性組備份首選項。
我們的 AG 有 3 個節點。
我想在主伺服器上進行完整備份和差異備份,在輔助伺服器上進行日誌備份。
當我配置“任何副本”時,所有副本的備份優先級為 50,日誌備份未在輔助副本上執行。
如果我確實更喜歡輔助完整備份,則不會在主數據庫上執行。
如何配置為僅在主伺服器上獲取完整/差異並僅在輔助伺服器上進行日誌備份?
我們想要將備份解除安裝到輔助副本的原因是為了在高峰時段提高主副本的性能。
我們目前的設置每 3 天完成一次,並且每天下班後都會有差異,我們每 15 分鐘執行一次日誌備份。它是通過帶有自定義 SP 的 SQL 代理作業。
備份偏好
在可用性組屬性中設置備份首選項只會影響
sys.fn_hadr_backup_is_preferred_replica
函式的輸出。如果您的備份作業沒有引用該函式,那麼無論您的偏好設置如何,它們都會在執行的任何地方進行備份。此設置也適用於呼叫此函式的任何備份類型。因此,您必須使用自定義程式碼來操作日誌備份首選項,使其與您的完整和差異備份首選項不同。用於解除安裝日誌備份的自定義儲存過程
要將日誌備份解除安裝到進行完整和差異備份的首選副本以外的副本,您需要檢查兩個值以確定目前副本是否是日誌備份的候選者。
sys.fn_hadr_backup_is_preferred_replica
確保它不是完整/差異備份的首選回复的結果。- 中
backup_priority
目前副本的sys.availability_replicas
,這樣您就不會盲目地對所有輔助副本進行日誌備份。您希望將其創建為儲存過程並在日誌備份作業中引用它。下面是一個概念儲存過程,您可以使用它來完成此操作。** 注意,我只是把這個放在一起作為例子,沒有測試過。使用風險自負!
CREATE FUNCTION is_preferred_replica_for_log_backup ( @DatabaseName ) RETURNS bit BEGIN IF sys.fn_hadr_backup_is_preferred_replica (@DatabaseName) = 1 BEGIN /* Is preferred for Diff/Full, skip log backup */ RETURN 0 END IF sys.fn_hadr_backup_is_preferred_replica (@DatabaseName) = 0 BEGIN IF @@SERVERNAME = ( /* If the replicase contains more than one Availability Group, some additional code would be needed here to filter to the correct one */ SELECT TOP 1 replica_server_name FROM sys.availability_replicas ORDER BY backup_priority ) BEGIN /* Replica is preferred for Log backups */ RETURN 1 END ELSE BEGIN RETURN 0 END END /* Failsafe: DB not in AG or status not be determinable, take log backup. */ RETURN 1 END
拆分備份和首選項的風險
可以在可用性組中的任何和所有副本上進行日誌備份,無論在哪裡進行完整備份。這是因為
log chains
在可用性組中的所有副本中都保持不變。例如,假設您按此順序執行以下備份。
- 主副本上的完整備份 1
- 在主副本上記錄備份 1
- 在輔助副本上記錄備份 2
- 在主副本上記錄備份 3
次要副本上的日誌備份 2完成後,主要副本將能夠截斷其事務日誌直到該時間點。因此,當主副本執行日誌備份 3 時,它將無法在輔助副本上備份日誌備份 2期間已備份的日誌數據。
要在這種情況下執行時間點還原,您需要還原在主數據庫上進行的完整備份,以及在所有副本上進行的所有三個日誌備份。
出於這個原因,我不建議將備份分佈在多個副本上。事實上,我實際上建議在主副本上進行所有備份,以幫助避免潛在的數據失去。我在最近關於將數據庫備份解除安裝到輔助副本的博文中更詳細地討論了這些潛在的數據失去問題。如果您的真正問題是高峰時段的性能,請考慮在 SQL Server 上添加額外資源以支持高峰時段在主副本上執行的所有備份類型。