在多数据库 AG 中,是什么决定哪些数据库将具有 1 个以上重做线程?

use*_*990 5 sql-server availability-groups sql-server-2019

我们有一个大型物理服务器,上面有 50 多个 dbs;有些很忙,有些很安静。

当一个 AG 中有多个 DB 时,只有其中一些有多个重做线程。我们希望具有这些线程的数据库是繁忙的。在最近的一次迁移中,我们决定注意恢复 dbs 的顺序,因为我们认为这是根据数据库创建日期决定的。但是,检查迁移后,事实并非如此。

SELECT databases.database_id,
       databases.create_date,
       dm_hadr_db_threads.name,
       dm_hadr_db_threads.num_redo_threads,
       dm_hadr_db_threads.num_parallel_redo_threads
  FROM sys.dm_hadr_db_threads
 INNER JOIN sys.databases ON dm_hadr_db_threads.name = databases.name
 ORDER BY 
       dm_hadr_db_threads.num_redo_threads DESC
OPTION (RECOMPILE)
Run Code Online (Sandbox Code Playgroud)

结果

它不是创建日期或数据库 ID。它不是按字母顺序排列的。它不是订单添加到 ag。有谁知道是什么决定了这一点?

这是 SQL Server 2019;查询来自辅助。

这是我们发现它基于 database_id 的地方:https : //www.brentozar.com/archive/2018/06/first-responder-kit-release-just-when-you-think-theres-nothing-new-left -去做/

Pau*_*ite 8

并行重做线程按数据库恢复顺序分配,该顺序遵循sys.databases创建日期。

也就是说,单独的并行数据库恢复 功能意味着可以将每个数据库恢复任务分配给不同的 SOS 调度程序(当有足够多的调度程序可用时)。

假设您有 8 个数据库和 32 个处理器。8 个单独的恢复任务可能会分配给 8 个不同的调度程序(CPU的 SOS抽象)。创建 8 个任务(按创建日期顺序)和调度程序分配可以非常快地发生。

每个调度程序多长时间(以及以何种顺序)开始执行其分配的恢复任务取决于每个调度程序当时的其他工作(其可运行队列),以及任何其他当前活动任务在当前时间段内的距离。

在每个独立的恢复任务开始在其分配的调度程序上执行后不久,就会分配并行重做线程(达到全局限制)。由于上述问题,这是不确定的。

Microsoft 支持有一些未记录的跟踪标志,可以帮助促进复杂场景中并行重做线程的良好分布。您应该就您的情况与他们联系。