Sql-Server
AlwaysOn AG 中的日誌截斷問題
我們的 AG 中有四個節點。在每週的索引維護作業之後,日誌驅動器變滿了。我們在其中一個數據庫中啟用了 CDC,因此我們禁用了 CDC 來截斷日誌。然後我們執行“檢查點”並進行日誌備份。但是我們無法截斷日誌文件。
log_reuse_wait_desc
數據庫狀態顯示AVAILABILITY_REPLICA
。我們在日誌發送和重做隊列中看不到任何內容。是否有另一種解決方案來解決此問題,而不是從 AG 中刪除數據庫?
根據故障排除建議,我已經檢查了所有內容。所有三個輔助節點都沒有阻塞。和都與主副本同步
last_redone_time
。redo_queue_size
我暫時無法在工作日暫停和恢復數據移動,因為它被大量使用。我檢查了
log_reuse_wait
數據庫的狀態,它仍然顯示“AVAILABILITY_REPLICA”:loginfo 顯示 99% 的日誌都被使用了。
這個問題很可能是由於網路延遲或主副本上長時間執行的事務造成的。因此,在生產環境中,最好在每個僅處理數據庫鏡像端點通信的副本中擁有專用 NIC。
但是,在您的情況下,以下步驟可能會有所幫助:
- 嘗試暫停特定數據庫的數據移動和恢復
- 執行LOG備份,檢查是否
log_reuse_wait_desc
改變如果
AVAILABILITY_REPLICA
沒有改變
- 可能其中一個副本仍然
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
查詢結果 - 副本積壓了一個多小時
- 此時,如果您查看輔助副本中的阻塞,您可能會發現一些導致阻塞的活動程序。最有可能的是讀取操作試圖阻止事物以確保
SCH_M
對象的模式 () 不能被主副本推送的 DDL 活動更改。- 一旦阻塞程序被殺死或完成。您可以注意到
last_redone_time
andredo_queue_size
與主副本同步。另外,AVAILABILITY_REPLICA
查詢時應該消失select name, log_reuse_wait_desc from sys.databases`
所有數據庫都是同步的(箭頭標記的是一個積壓的):
如果沒有任何效果,您已經有了強制修復的方法:
從 AG 中移除 Back-logged Replica 並重新加入,但對可用性組的只讀路由有影響