sys.dm_hadr_database_replica_states (Transact-SQL)

适用于: SQL Server Azure SQL 托管实例

为参与 AlwaysOn 可用性组(SQL Server 的本地实例在托管其可用性副本)的每个数据库都返回一行。 此动态管理视图公开与主副本和辅助副本有关的状态信息。 在辅助副本上,此视图为服务器实例上的每个辅助数据库都返回一行。 在主副本上,此视图为每个主数据库返回一行,并为相应的辅助数据库返回额外的行。

重要

根据操作和更高级别的状态,数据库状态信息可能不可用或过期。 此外,这些值仅具有本地相关性。 例如,在主副本上,该列的值 last_hardened_lsn 反映了有关当前可用于主副本的给定辅助数据库的信息,而不是辅助副本当前可能具有的实际强化日志序列号(LSN)。

列名称 Data type 说明(针对主副本)
database_id int 数据库的标识符,在 SQL Server 的实例内是唯一的。 此值与 sys.databases 目录视图中显示的值相同。
group_id uniqueidentifier 数据库所属的可用性组的标识符。
replica_id uniqueidentifier 可用性组内可用性副本的标识符。
group_database_id uniqueidentifier 可用性组内数据库的标识符。 在此数据库联接到的每个副本上,该标识符都是相同的。
is_local bit 可用性数据库是否是本地的,可以是下列值之一:

0 = 数据库不是 SQL Server 实例的本地数据库。
1 = 数据库是服务器实例的本地数据库。
is_primary_replica bit 返回 1 副本是主要副本还是 0 次要副本。

适用于:SQL Server 2014 (12.x) 及更高版本。
synchronization_state tinyint 数据移动状态,以下值之一。

0 = 未同步。 对于主数据库,指示数据库尚未准备好将其事务日志与相应的辅助数据库同步。 对于辅助数据库,此值指示由于连接问题、挂起或正在启动启动或角色切换期间正在经历转换状态,数据库尚未启动日志同步。

1 = 正在同步。 对于主数据库,指示此数据库已做好接受来自辅助数据库的扫描请求的准备。 对于辅助数据库,指示对于该数据库正在发生活动数据移动。

2 = 已同步。 主数据库显示 SYNCHRONIZED 代替 SYNCHRONIZING。 同步提交辅助数据库在以下情况下将显示已同步:本地缓存指示数据库副本可供故障转移并且数据库正在同步。

3 = 正在还原。 指示撤消进程中辅助数据库主动从主数据库获取页时的阶段。

注意: 当辅助副本上的数据库处于 REVERTING 状态时,强制故障转移到辅助副本会使数据库处于无法作为主数据库启动的状态。 数据库需要重新连接为辅助数据库,或者需要从日志备份中应用新的日志记录。

4 = 正在初始化。 指示在正在辅助副本上传送和强制写入辅助数据库跟上撤消 LSN 所需的事务日志时的撤消阶段。

注意: 当辅助副本上的数据库处于 INITIALIZING 状态时,强制故障转移到辅助副本会使数据库处于无法作为主数据库启动的状态。 数据库需要重新连接为辅助数据库,或者需要从日志备份中应用新的日志记录。
synchronization_state_desc nvarchar(60) 数据移动状态的说明,可以是下列值之一:

NOT SYNCHRONIZING
SYNCHRONIZING
SYNCHRONIZED
REVERTING
INITIALIZING
is_commit_participant bit 0 = 此数据库不同步事务提交。

1 = 事务提交与此数据库同步。

对于异步提交可用性副本上的数据库,此值始终 0为 < a0/>。

对于同步提交可用性副本上的数据库,该值仅在主数据库上是准确的。
synchronization_health tinyint 反映已加入可用性副本上可用性组的数据库的同步状态的交集,以及可用性副本的可用性模式(同步提交或异步提交模式)。 可以是以下值之一。

0 = 不正常。 数据库 synchronization_state0NOT SYNCHRONIZING)。

1 = 部分正常。 如果 synchronization_state 1 为 (SYNCHRONIZING),则同步提交可用性副本上的数据库被视为部分正常。

2 = 正常。 如果synchronization_state为 (SYNCHRONIZED),则同步提交可用性副本上的数据库被视为正常运行;如果synchronization_state 1 为 (),则异步提交可用性副本上的数据库被视为正常(SYNCHRONIZING)。2
synchronization_health_desc nvarchar(60) synchronization_health可用性数据库的说明。

NOT_HEALTHY
PARTIALLY_HEALTHY
HEALTHY
database_state tinyint 0 = Online
1 = 还原
2 = 正在恢复
3 = 恢复挂起
4 = 可疑
5 = 紧急
6 = 脱机

注意:state 列中的列相同 sys.databases.
database_state_desc nvarchar(60) database_state可用性副本的说明。

ONLINE
RESTORING
RECOVERING
RECOVERY_PENDING
SUSPECT
EMERGENCY
OFFLINE

注意:state_desc 列中的列相同 sys.databases.
is_suspended bit 数据库状态,可以是下列值之一:

0 = 恢复
1 = 已挂起
suspend_reason tinyint 如果数据库处于已挂起状态,则为已挂起状态的原因,可以是下列值之一:

0 = 用户操作
1 = 从合作伙伴暂停
2 = Redo
3 = 捕获
4 = 应用
5 = 重启
6 = 撤消
7 = 重新验证
8 = 辅助副本同步点计算中的错误
suspend_reason_desc nvarchar(60) 数据库挂起状态的原因的说明,可以是下列值之一:

SUSPEND_FROM_USER = 用户手动挂起的数据移动

SUSPEND_FROM_PARTNER = 强制故障转移后数据库副本挂起

SUSPEND_FROM_REDO = 重做阶段发生错误

SUSPEND_FROM_APPLY = 将日志写入文件时出错(请参阅错误日志)

SUSPEND_FROM_CAPTURE = 捕获主副本上的日志时出错

SUSPEND_FROM_RESTART = 数据库副本在重新启动数据库之前挂起(请参阅错误日志)

SUSPEND_FROM_UNDO = 撤消阶段发生错误(请参阅错误日志)

SUSPEND_FROM_REVALIDATION = 重新连接时检测到日志更改不匹配(请参阅错误日志)

SUSPEND_FROM_XRF_UPDATE = 找不到常见日志点(请参阅错误日志)
recovery_lsn numeric(25,0) 在主副本上,在恢复或故障转移之后、在主数据库写入任何新日志记录之前事务日志的结尾。 对于给定的辅助数据库,如果此值小于当前强化的 LSN (last_hardened_lsn), recovery_lsn 则表示此辅助数据库需要重新同步的值(也就是说,要还原到并重新初始化)。 如果此值大于或等于当前强化的 LSN,则不需要重新同步,并且不会发生。

反映 recovery_lsn 用零填充的日志块 ID。 这不是实际的 LSN。 有关如何派生此值的信息,请参阅 本文后面的“了解 LSN 列值”。
truncation_lsn numeric(25,0) 在主副本上,对于主数据库,反映了所有相应辅助数据库中的最小日志截断 LSN。 如果阻止本地日志截断(例如由备份操作阻止),则该 LSN 可能高于本地截断 LSN。

对于给定的辅助数据库,反映了该数据库的截断点。
truncation_lsn 反映用零填充的日志块 ID。 它不是实际的日志序列号。
last_sent_lsn numeric(25,0) 查询主副本时, last_sent_lsn 会针对每个次要副本数据库行报告。 指示一个点(在该点前的所有日志块都已由主数据库发送)的日志块标识符。 这是发送的下一个日志块的 ID,而不是最近发送的日志块的 ID。

last_sent_lsn 反映用零填充的日志块 ID。 它不是实际的日志序列号。
last_sent_time datetime 查询主副本时, last_sent_time 会针对每个次要副本数据库行报告。 发送最后一个日志块的时间。
last_received_lsn numeric(25,0) 查询辅助副本时, last_received_lsn 会报告本地辅助副本数据库行。 标识一个点的日志块 ID,在该点之前,所有日志块都已由承载此辅助数据库的辅助副本接收。

反映 last_received_lsn 用零填充的日志块 ID。 它不是实际的日志序列号。
last_received_time datetime 查询辅助副本时, last_received_time 会报告本地辅助副本数据库行。 在辅助副本上读取最后接收的消息中的日志块 ID 的时间。
last_hardened_lsn numeric(25,0) 包含辅助数据库上最后强化 LSN 的日志记录的日志块的开始。

在异步提交主数据库或当前策略为 delay的同步提交数据库上,值为 NULL。 对于其他同步提交主数据库, last_hardened_lsn 指示所有辅助数据库的强化 LSN 的最小值。

注意: 反映 last_hardened_lsn 用零填充的日志块 ID。 它不是实际的日志序列号。 有关详细信息,请参阅 本文后面的 LSN 列值
last_hardened_time datetime 在辅助数据库上,最后一个强化 LSNlast_hardened_lsn()的日志块标识符的时间。 在主数据库上,反映了与最小强制写入的 LSN 相对应的时间。
last_redone_lsn numeric(25,0) 在辅助数据库上重做的上一个日志记录的实际日志序列号。 始终 last_redone_lsn 小于 last_hardened_lsn
last_redone_time datetime 在辅助数据库上重做最后一个日志记录的时间。
log_send_queue_size bigint 尚未发送到辅助数据库的主数据库的日志记录数(KB)。
log_send_rate bigint 主副本实例在上次活动期间发送数据的平均速率(以千字节(KB)/秒为单位。
redo_queue_size bigint 次要副本的日志文件中尚未重做(KB)的日志记录数(KB)。
redo_rate bigint 在给定辅助数据库(KB)/秒内重新创建日志记录的平均速率。

redo_rate 通过除以重做的总日志字节数来计算,因为数据库引擎启动的时间跨度是主动运行的,而不是经过的时间范围。 由于重做可能未连续运行,因此生成的值可能与性能计数器的值 Database Replica:Redone Bytes/sec 不同(高于)。
filestream_send_rate bigint 指定 FILESTREAM 文件寄送到次要副本的速率(KB)/秒。
end_of_log_lsn numeric(25,0) 日志 LSN 的本地结尾。 与主数据库和辅助数据库上日志缓存中的最后一个日志记录相对应的实际 LSN。 在主要副本上,辅助行反映日志 LSN 的末尾,这些日志 LSN 来自发送到主要副本的最新进度消息。

end_of_log_lsn 反映用零填充的日志块 ID。 它不是实际的日志序列号。 有关详细信息,请参阅 本文后面的 LSN 列值
last_commit_lsn numeric(25,0) 与事务日志中的最后提交的记录相对应的实际日志序列号。

主数据库上,这对应于上次处理的提交记录。 辅助数据库的行显示辅助副本发送到主副本的日志序列号。
在辅助副本上,这是已重做的最后一个提交记录。
last_commit_time datetime 与最后一个提交记录对应的时间。

在辅助数据库上,此时间与主数据库上的时间相同。

在主副本上,每个辅助数据库行显示承载辅助数据库的辅助副本报告回主副本的时间。 主数据库行和给定辅助数据库行之间的时间差表示大约恢复点目标(RPO),假设恢复过程已捕获,并且次要副本将进度报告回主副本。
low_water_mark_for_ghosts bigint 针对数据库的单调递增的数字,指示主数据库上虚影清除使用的低水印。 如果这个数字随时间推移没有增加,则意味着幽灵清理可能不会发生。 为了确定要清除的虚影行,主副本会在所有可用性副本(包括主副本)上将该列的最小值用于此数据库。
secondary_lag_seconds bigint 同步期间辅助副本位于主副本后面的秒数。

在主副本上,每个辅助数据库的同步延迟(延迟)计算为自主要副本上最早的强化 LSN 尚未在次要副本上强化以来的秒数。 此值显示为 0 数据移动挂起。 数据移动需要处于非挂起状态,以便此值显示活动滞后时间。

适用于:SQL Server 2016 (13.x) 及更高版本。

了解 LSN 列值

last_hardened_lsnlast_received_lsnlast_sent_lsnrecovery_lsntruncation_lsn列的值end_of_log_lsn不是实际的日志序列号(LSN)。 上述各值反映了用零填充的日志块 ID。

end_of_log_lsnlast_hardened_lsnrecovery_lsn 刷新 LSN。 例如, last_hardened_lsn 指示下一个块的开始时间超过磁盘上已有的块。 因此, last_hardened_lsn 任何 LSN 的值都小于磁盘。 不刷新大于或等于此值的 LSN。

在返回的 sys.dm_hadr_database_replica_statesLSN 值中,只有 last_redone_lsn 真正的 LSN。

权限

SQL Server 2019 (15.x) 和早期版本需要 VIEW SERVER STATE 对服务器具有权限。

SQL Server 2022 (16.x) 及更高版本需要 VIEW SERVER PERFORMANCE STATE 对服务器具有权限。