Sql-Server

AlwaysOn AG 中的日誌截斷問題

  • January 28, 2020

我們的 AG 中有四個節點。在每週的索引維護作業之後,日誌驅動器變滿了。我們在其中一個數據庫中啟用了 CDC,因此我們禁用了 CDC 來截斷日誌。然後我們執行“檢查點”並進行日誌備份。但是我們無法截斷日誌文件。log_reuse_wait_desc數據庫狀態顯示AVAILABILITY_REPLICA。我們在日誌發送和重做隊列中看不到任何內容。

是否有另一種解決方案來解決此問題,而不是從 AG 中刪除數據庫?


根據故障排除建議,我已經檢查了所有內容。所有三個輔助節點都沒有阻塞。和都與主副本同步last_redone_timeredo_queue_size

在此處輸入圖像描述

我暫時無法在工作日暫停和恢復數據移動,因為它被大量使用。我檢查了log_reuse_wait數據庫的狀態,它仍然顯示“AVAILABILITY_REPLICA”:

在此處輸入圖像描述

loginfo 顯示 99% 的日誌都被使用了。

這個問題很可能是由於網路延遲或主副本上長時間執行的事務造成的。因此,在生產環境中,最好在每個僅處理數據庫鏡像端點通信的副本中擁有專用 NIC。

但是,在您的情況下,以下步驟可能會有所幫助:

  1. 嘗試暫停特定數據庫的數據移動​​和恢復
  2. 執行LOG備份,檢查是否log_reuse_wait_desc改變

如果AVAILABILITY_REPLICA沒有改變

  1. 可能其中一個副本仍然redo_block可以從受影響的副本的擴展事件 -> 會話 ->“AlwaysOn_health”中辨識

在此處輸入圖像描述 2. 要確認阻塞是原因,您可以執行以下查詢,看看last_redone_time這將表明從何時副本獲得積壓。

select  db.name, db.database_id, 
       ag.name as GroupName, 
       state_desc, 
       recovery_model_desc, log_reuse_wait_desc,
       Rep.replica_server_name,
       rep.endpoint_url,
       DBRepStats.is_primary_replica,
       DBRepStats.synchronization_health_desc,
       DBRepStats.database_state_desc,
       (redo_queue_size / 1024.0) as redo_queue_size_MB,
       last_redone_time,
       last_redone_lsn

from sys.databases as db
   left outer join sys.availability_databases_cluster as AGDB on db.group_database_id = AGDB.group_database_id
   left outer join sys.dm_hadr_database_replica_states as DBRepStats on db.group_database_id = DBRepStats.group_database_id
   left outer join sys.availability_replicas as Rep on DBRepStats.group_id = Rep.group_id and DBRepStats.replica_id = Rep.replica_id 
   left outer join sys.availability_groups as AG on DBRepStats.group_id = AG.group_id
where db.database_id > 4

查詢結果 - 副本積壓了一個多小時

查詢結果

  1. 此時,如果您查看輔助副本中的阻塞,您可能會發現一些導致阻塞的活動程序。最有可能的是讀取操作試圖阻止事物以確保SCH_M對象的模式 () 不能被主副本推送的 DDL 活動更改。
  2. 一旦阻塞程序被殺死或完成。您可以注意到last_redone_timeandredo_queue_size與主副本同步。另外,AVAILABILITY_REPLICA查詢時應該消失
select name, log_reuse_wait_desc from sys.databases` 

所有數據庫都是同步的(箭頭標記的是一個積壓的):

在此處輸入圖像描述

如果沒有任何效果,您已經有了強制修復的方法:

從 AG 中移除 Back-logged Replica 並重新加入,但對可用性組的只讀路由有影響

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