log_reuse_wait_desc = AVAILABILITY_REPLICA,日志已 100% 满,但 AG 一切正常

Als*_*sin 2 sql-server availability-groups sql-server-2016

这是一个奇怪的场景。事务日志已满。它等待AG。AG一切都好。无延迟,最后提交/硬化时间在所有节点上几乎都是实时的。预计恢复时间为零。我也从主节点和辅助节点检查了这一点(以防仪表板未更新)。此页面仅列出了此错误的两个原因:传递延迟和重做延迟。没有任何内容适用于我的系统。如何进一步解决这个问题?

编辑 1。我们对环境所做的唯一更改是添加了两个 SQL Server 2019 节点以准备迁移。但它不应该出现这样的问题。

编辑2。我发现的唯一解决方法是将数据库重新添加到AG。

AMt*_*two 6

您应该检查 DMV 以确认 AG 的发送和重做队列运行状况良好。SSMS 中的仪表板在代表真实的发送和重做运行状况方面表现不佳。

作为我的开源 DBA 数据库的一部分,我有一个Check_AGHealth存储过程,您可以使用它来提供更多信息。

如果不使用完整的存储过程,则在主数据库上运行的一些重要语句如下:

查看dm_hadr_database_replica_states

此查询返回一堆数据,但您需要查找的有趣的内容是:

  • 任何报告其已暂停的信息
  • 任何报告它的行为都是不健康的
  • 大型日志发送队列
  • 大型重做队列

关于此的子句ORDER BY应该将这些内容冒泡到结果集的顶部,但是这些内容中的任何一个都会给清除日志带来问题,并且会显示日志重用等待AVAILABILITY_REPLICA

SELECT ServerName         = ar.replica_server_name, 
        AgName             = ag.Name,
        DbName             = db_name(ds.database_id), 
        AgRole             = rs.role_desc,
        rs.role ,
        UnsentLogMB        = ds.log_send_queue_size/1024.0,
        RedoQueueSizeMB    = ds.redo_queue_size/1024.0,
        RedoEstCompletion  = CASE WHEN redo_rate = 0 THEN 0 ELSE ds.redo_queue_size/ds.redo_rate END,
        SynchState         = ds.synchronization_state_desc, 
        AgHealth           = ds.synchronization_health_desc, 
        SuspendReason      = ds.suspend_reason_desc, 
        SynchHardenedLSN   = ds.last_hardened_lsn,
        LastHardenedTime   = ds.last_hardened_time,
        LastRedoneTime     = ds.last_redone_time,
        LastCommitTime     = ds.last_commit_time
FROM sys.availability_groups AS ag
JOIN sys.availability_replicas AS ar ON ar.group_id = ag.group_id 
JOIN sys.dm_hadr_database_replica_states AS ds ON ds.group_id = ar.group_id AND ds.replica_id = ar.replica_id
JOIN sys.dm_hadr_availability_replica_states AS rs ON rs.replica_id = ds.replica_id
ORDER BY 
    CASE 
        WHEN ds.suspend_reason_desc IS NOT NULL THEN 1
        WHEN ds.synchronization_state_desc <> 'HEALTHY' THEN 1
        ELSE 9
    END,
    rs.role DESC,
    ds.log_send_queue_size + ds.redo_queue_size DESC
;
Run Code Online (Sandbox Code Playgroud)