加速数据库恢复
适用于: sql Server 2019 (15.x) 及更高版本
Azure SQL 数据库
Azure SQL 托管实例 Microsoft Fabric 中的 SQL 数据库
加速数据库恢复(ADR)通过重新设计数据库引擎恢复过程,改进了数据库可用性,尤其是在存在长时间运行的事务的情况下。
ADR 是 SQL Server 2019 (15.x) 中引入的新功能,并在 SQL Server 2022 (16.x) 中进行了改进。 ADR 也可在 Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics(仅限专用 SQL 池)和 Microsoft Fabric 中的 SQL 数据库中使用。
注释
ADR 始终在 Azure SQL 数据库、Azure SQL 托管实例和 Fabric 中的 SQL 数据库中启用。
本文概述了 ADR。 要使用 ADR,请查看 管理加速数据库恢复。
有关事务日志和数据库恢复的详细信息,请参阅 SQL Server 事务日志体系结构和管理指南 和 还原和恢复概述(SQL Server)。
概述
ADR 的主要优势在于:
快速且一致的数据库恢复
长时间运行的事务不会对整体恢复时间产生影响,使得数据库恢复既快速又一致,无论系统中的活动事务数量或其大小如何。
即时事务回滚
事务回滚是即时的,无论事务处于活跃状态的时间长短或已进行的更新次数。
主动日志截断
即使存在长时间运行的活动事务,也主动截断事务日志,阻止其失控。
传统的数据库恢复过程
如果没有 ADR,数据库恢复遵循 ARIES 恢复模式,并包含三个阶段,下图对此进行了更详细的说明和说明:
分析阶段
数据库引擎从上次成功检查点(或最早的脏页日志序列号(LSN))开始,向前扫描事务日志直到结束,以确定引擎停止时每个事务的状态。
重做阶段
数据库引擎执行从最早未提交的事务到末尾的事务日志的正向扫描。 此过程会重做所有已提交的操作,以便在崩溃发生时将数据库还原到其状态。
撤消阶段
对于在崩溃时处于活动状态的每个事务,数据库引擎会向后遍历日志,撤消此事务执行的作。
使用传统的数据库恢复过程,如果长时间运行的事务处于活动状态,崩溃后的恢复可能需要很长时间。
数据库引擎在发生崩溃时从意外重启中恢复的时间(大致)与系统中最长活动事务的大小成正比。 恢复需要回滚所有未完成的事务。 所需的时间长度与事务已执行的工作及其处于活动状态的时间成正比。
取消或回滚大型事务可能需要很长时间,因为它使用与前面所述的相同的撤消恢复阶段。
当存在长时间运行的事务时,数据库引擎无法截断事务日志,因为恢复和回滚进程需要相应的日志记录。 因此,事务日志可能会非常大,占用大量存储空间。
加速数据库恢复过程
ADR 通过彻底重新设计数据库引擎恢复过程,解决了传统恢复模式以前的问题:
使恢复时间不变,因为不再需要从最早的活动事务开始扫描事务日志。 使用 ADR 时,事务日志仅从最后一个成功的检查点(或最早的脏页 LSN)进行处理。 因此,长时间运行的事务不会影响恢复时间,恢复通常几乎瞬间完成。
最大程度地减少所需的事务日志空间,因为不再需要保留整个事务的日志。 当检查点和备份出现时,可以主动截断事务日志。
在高层次上,ADR 通过对所有物理数据库修改进行版本控制,并只撤消非版本化操作来实现快速数据库恢复,这些操作是有限的且几乎可以立即撤消。 崩溃时处于活动状态的任何事务都会被标记为已中止,因此,并发用户查询可忽略这些事务生成的任何版本。
ADR 恢复过程与传统恢复过程具有相同的三个阶段。 下图说明了这些阶段如何使用 ADR 运行:
分析阶段
此过程与传统的恢复模式相同,只是增加了重建辅助日志流(SLOG)并复制非版本化操作的日志记录。
重做阶段
分为两个子阶段
子阶段 1
从 SLOG 重做(从最早的未提交事务到上一个检查点)。 重做是一项快速操作,因为它可能只需要处理 SLOG 中的几条记录。
子阶段 2
从事务日志重做会从上一个成功检查点开始(而不是最早的未提交事务)。
撤消阶段
使用 ADR,撤消阶段几乎即时完成 - 通过使用 SLOG 撤消非版本控制操作以及通过具有逻辑还原的永久性版本存储 (PVS) 执行行级别基于版本的撤消。
有关加速数据库恢复的说明,请观看此 8 分钟的视频:
ADR 恢复组件
ADR 的四个关键组件是:
持久版本存储(PVS)
持久性版本存储(PVS)是一种数据库引擎机制,用于在数据库本身中保存行版本,而不是在
tempdb
数据库中的传统版本存储中保存行版本。 PVS 可实现资源隔离,并提高可读辅助数据库的可用性。PVS 将行版本直接存储在要修改的数据页上,或存储在单独的系统表中。 有关详细信息,请参阅永久性版本存储 (PVS) 使用的空间。
逻辑还原
逻辑还原是负责执行行级别基于版本的撤消的异步过程,为所有版本控制操作提供即时事务回滚和撤消。
- 跟踪所有已中止的事务
- 使用 PVS 对所有用户事务执行回滚
- 事务中止后立即释放所有锁
SLOG
SLOG 是一个辅助内存中日志流,用于存储非版本控制操作(如元数据缓存无效、锁定获取等)的日志记录。 SLOG 具有以下特性:
- 低容量和内存中
- 在检查点过程中保留在磁盘上
- 提交事务时定期被截断
- 通过仅处理非版本控制操作来加速重做和撤消
- 通过仅保留所需的日志记录来实现主动事务日志截断
清理器
清理器是定期唤醒并从 PVS 中清除过时行版本的异步过程。
受益于 ADR 的工作负荷
ADR 对于具有以下项的工作负荷特别有利:
- 长期运行的事务。
- 正在进行的事务导致事务日志显著增长。
- 长期运行的恢复(如意外的服务重启或手动事务回滚)导致的数据库长时间不可用。
使用 数据库镜像(较旧且已弃用的高可用性功能)的数据库不支持 ADR。
ADR 的最佳做法
避免长时间运行的不必要事务。 尽管 ADR 即使在长时间运行的事务中也会加快数据库恢复速度,但此类事务可能会延迟版本清理并增加 PVS 的大小。
避免包含 DDL 操作的大型事务。 ADR 使用辅助日志流(SLOG)机制来跟踪用于恢复的 DDL 操作。 仅在事务处于活动状态时使用 SLOG。 SLOG 设置了检查点,因此避免使用 SLOG 的大型事务可帮助改善整体性能。 下面这些情况可能会导致 SLOG 占用更多空间:
- 许多 DDL 在一个事务中执行。 例如,在一个事务中快速创建和删除临时表。
- 表中包含大量已修改的分区/索引。 例如,对这样的表进行
DROP TABLE
操作需要大量占用 SLOG 内存,这将导致事务日志截断的延迟,并且会推迟撤消/重做操作。 解决方法是逐个、逐步地删除索引,然后再删除表。
有关 SLOG 的详细信息,请参阅 ADR 恢复组件。
防止或减少不必要的中止交易。 高事务中止率会给 PVS 清理器带来压力,并降低 ADR 性能。 中止的原因可能是高死锁率、重复键、约束冲突或查询超时。 sys.dm_tran_aborted_transactions DMV 显示数据库引擎实例上所有中止的事务。
nested_abort
列指示事务已提交,但存在中止的部分(保存点或嵌套事务),这也可能会延迟 PVS 清理进程。确保数据库中有足够的空间来考虑 PVS 使用情况。 如果数据库没有足够的空间来扩展 PVS,ADR 可能无法生成版本,从而导致 DML 语句失败。
启用 ADR 并处理写入密集型工作负荷时,事务日志生成速率可能会大幅增加,因为写入到 PVS 的行版本会被记录在日志中。 这可能会增加事务日志备份的大小。
使用事务复制、快照复制或更改数据捕获 (CDC) 时,将禁用 ADR 的主动日志截断行为,以允许日志读取器从事务日志收集更改。 确保事务日志足够大。
如果在 Azure SQL 数据库中使用 CDC 或 更改源,可能需要增加服务层级或计算大小,以确保有足够的事务日志空间满足所有工作负荷的需求。 同样,在 Azure SQL 托管实例中,可能需要增加实例的最大存储大小。
对于 SQL Server,将 PVS 版本存储隔离在较高层的存储上,例如高端 SSD、高级 SSD 或持久性内存(PMEM)所在的文件组上,这些有时也称为存储类内存(SCM)。 有关详细信息,请参阅 将 PVS 的位置更改为其他文件组。
对于 SQL Server,监视
PreallocatePVS
条目的错误日志。 如果存在PreallocatePVS
条目,可能需要提高 ADR 使用后台任务预分配页面的能力。 在后台预分配 PVS 页可以减少更昂贵的前台 PVS 分配,从而提高 ADR 性能。 可以使用ADR Preallocation Factor
服务器配置来增加此数量。 有关详细信息,请参阅 服务器配置:ADR 预分配因子。对于 SQL Server 2022(16.x)及更高版本,如果单线程清理器性能不足,请考虑启用多线程 PVS 清理。 有关详细信息,请参阅服务器配置:ADR 清理器线程计数。
如果观察到 PVS 使用的数据库空间过高或 PVS 清理速度缓慢等问题,请参阅 监视和排查加速数据库恢复问题。
SQL Server 2022 中的 ADR 改进
在解决持久版本存储 (PVS) 的存储问题和提高整体可伸缩性方面进行了几项改进。 有关 SQL Server 2022(16.x)新功能的详细信息,请参阅 SQL Server 2022中的新增功能。
Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics(仅限专用 SQL 池)和 Microsoft Fabric 中的 SQL 数据库也提供了相同的改进。
用户事务清理
清理因锁获取失败而无法通过常规进程清理的页面。
此功能允许用户事务对由于表级锁定冲突而无法通过常规清理进程解决的页面运行清理。 此改进将有助于确保 ADR 清理进程不会因为用户工作负载无法获取表级别锁定而无限期失败。
减少 PVS 页面跟踪器的内存占用量
此改进在盘区级别跟踪 PVS 页,以减少维护版本控制页面所需的内存占用量。
PVS 清洁器改进
PVS 清理器改进了版本清理效率,以提高数据库引擎跟踪和记录中止事务的行版本的方式。 这会导致内存和存储使用情况的改进。
事务级永久性版本存储(PVS)
通过此改进,不论系统中是否存在中止事务,ADR 均可清理属于已提交事务的版本。 通过此改进,即使清理无法成功完成扫描来剪裁中止的事务映射,也可以解除分配 PVS 页。
即使 PVS 清理速度缓慢或失败,这种改进的结果也会降低 PVS 增长。
多线程版本清理
在 SQL Server 2019(15.x)中,清理过程在数据库引擎实例中是单线程的。
从 SQL Server 2022(16.x 开始),支持多线程版本清理。 这样,同一数据库引擎实例上的多个数据库就可以并行清理,或者更快地清理单个数据库。 有关详细信息,请参阅服务器配置:ADR 清理器线程计数。
添加了新的扩展事件
tx_mtvc2_sweep_stats
,用于监视 ADR PVS 多线程版本清理器。