活动辅助副本:可读辅助副本(AlwaysOn 可用性组)

AlwaysOn 可用性组 活动辅助功能包括支持对一个或多个辅助副本的只读访问(可读辅助副本)。 可读辅助副本允许对其所有辅助数据库的只读访问。 但是,可读辅助数据库并非设置为只读。 它们是动态的。 当对相应主数据库的更改应用到某一给定的辅助数据库时,该辅助数据库将更改。 对于典型的辅助副本,辅助数据库中的数据接近实时。 此外,全文索引与辅助数据库同步。 在许多情况下,主数据库和相应的辅助数据库之间的数据滞后时间只有几秒钟。

在主数据库中进行的安全设置会对辅助数据库永久保留。 这包括用户、数据库角色和应用程序角色及其各自的权限;如果对主数据库启用了透明数据加密 (TDE),还将包括 TDE。

注意注意

尽管您无法将数据写入辅助数据库,但可以在承载辅助副本的服务器实例上写入读写数据库,包括用户数据库和 tempdb 之类的系统数据库。

AlwaysOn 可用性组 还支持对可读辅助副本(只读路由)的读意向连接请求的重新路由。 有关只读路由的信息,请参阅使用侦听器连接到只读的辅助副本(只读路由)

本主题内容:

  • 优点

  • 可用性组必备条件

  • 限制和局限

  • 性能注意事项

  • 容量规划注意事项

  • 相关任务

  • 相关内容

优点

指定与可读辅助副本的只读连接具有以下优点:

  • 从主副本卸下辅助副本只读工作负荷,以便将资源用于关键任务工作负荷。 如果具有关键任务读工作负荷或不能滞后的工作负荷,应在主副本上运行它。

  • 提高承载可读辅助副本的系统的投资回报率。

此外,可读辅助副本对只读操作提供稳定的支持,如下所示:

  • 有关可读辅助数据库的临时统计信息可优化只读查询。 有关详细信息,请参阅本主题后面的只读访问数据库的统计信息。

  • 只读工作负荷使用行版本控制来消除辅助数据库上的阻塞争用。 对辅助数据库运行的所有查询都自动映射到快照隔离事务级别,即使在显式设置了其他事务隔离级别时也是如此。 此外,所有锁定提示都将被忽略。 这消除了读取器/编写器的争用。

用于“返回首页”链接的箭头图标[返回页首]

可用性组必备条件

  • 可读辅助副本(必需)

    数据库管理员需要配置一个或多个副本,这样,在辅助角色下运行时,可允许所有连接(仅针对只读访问)或只允许读意向连接。

    注意注意

    或者,数据库管理员可以配置任何可用性副本,以便在主角色下运行时排除只读连接。

    有关详细信息,请参阅关于对可用性副本的客户端连接访问 (SQL Server)

  • 可用性组侦听器

    为支持只读路由,可用性组必须具备可用性组侦听器。 只读客户端必须将其连接请求定向到此侦听器,并且客户端的连接字符串必须将应用程序意向指定为“只读”。也就是说,它们必须是“读意向连接请求”。

  • 只读路由

    “只读路由”指的是 SQL Server 将定向到可用性组侦听器的传入的读意向连接请求路由到可用的可读辅助副本的能力。 只读路由的必备条件如下:

    • 为支持只读路由,可读辅助副本要求只读路由 URL。 此 URL 仅在本地副本在辅助角色下运行时起作用。 必须根据需要在逐个副本的基础上指定只读路由 URL。 每个只读路由 URL 都用于将读意向请求路由到一个特定的可读辅助副本。 通常,向每个可读辅助副本分配一个只读路由 URL。

    • 要在其作为主副本时支持只读路由的每个可用性副本都要求一个只读路由列表。 一个给定的只读路由列表仅在本地副本在主角色下运行时才起作用。 必须根据需要在逐个副本的基础上指定此列表。 通常,每个只读路由列表中将包含各只读路由 URL,并且在列表的末尾具有本地副本的 URL。

      注意注意

      读意向连接请求将被路由到当前主副本的只读路由列表上的第一个可用可读辅助副本。 没有负载平衡。

    有关详细信息,请参阅为可用性组配置只读路由 (SQL Server)

注意注意

有关可用性组侦听器的信息以及有关只读路由的详细信息,请参阅可用性组侦听器、客户端连接和应用程序故障转移 (SQL Server)

用于“返回首页”链接的箭头图标[返回页首]

限制和局限

不完全支持某些操作,如下所示:

  • 可读辅助副本联接到可用性组后,该辅助副本即可开始接受到其辅助数据库的连接。 但是,如果在主数据库上有活动事务,行版本将不会立即在相应的辅助数据库上完全可用。 必须提交或回滚在配置辅助副本时主副本上存在的所有活动事务。 在此过程完成前,对辅助数据库的事务隔离级别映射将不完整,并且查询被暂时阻塞。

    注意注意

    运行长时间运行的事务将影响保存的版本控制行数。

  • 属于可读辅助副本的辅助数据库不支持变更跟踪和变更数据捕获:

    • 在辅助数据库上显式禁用变更跟踪。

    • 可以在辅助数据库上启用变更数据捕获,但不支持这样做。

  • 由于读操作会映射到快照隔离事务级别,因此,一个或多个辅助副本上的事务会阻止在主副本上清除虚影记录。 当辅助副本不再需要虚影记录时,虚影记录清除任务将自动清除主副本上的虚影记录。 这类似于您在主副本上运行事务时执行的操作。 在辅助数据库上的极端情况下,需要终止正在阻塞虚影清除的长时间运行的读查询。 请注意,如果辅助副本断开连接或数据移动在辅助数据库上挂起,可能阻塞虚影清除。 此状态还会阻止日志截断,因此,如果此状态持续,则我们建议您从可用性组中删除此辅助数据库。

  • 如果文件包含辅助副本上仍需要的虚影记录,则主副本上的 DBCC SHRINKFILE 操作可能失败。

注意注意

如果您在承载可读辅助副本的服务器实例上查询 sys.dm_db_index_physical_stats 动态管理视图,则可能会遇到 REDO 阻止问题。 这是因为此动态管理视图获取指定用户表或视图的 IS 锁,而该锁可能阻塞 REDO 线程对该用户表或视图的 X 锁请求。

用于“返回首页”链接的箭头图标[返回页首]

性能注意事项

此节讨论可读辅助数据库的几个性能注意事项

本节内容:

  • 数据滞后时间

  • 只读工作负荷的影响

  • 索引

  • 只读访问数据库的统计信息

数据滞后时间

如果您的只读工作负荷可以容忍一定程度的数据滞后,则实现对辅助副本的只读访问很有用。 在数据滞后不可接受的情况下,请考虑对主副本运行只读工作负荷。

主副本将主数据库上的更改日志记录发送到辅助副本。 在每个辅助数据库上,专用重做线程应用这些日志记录。 在读访问权限的辅助数据库上,给定的数据更改不显示在查询结果中,直到包含更改的日志记录已应用到辅助数据库并且已在主数据库上提交事务。

这意味着在主副本和辅助副本之间将会存在一定程度的滞后时间,通常只需几秒钟。 但是,在极少数情况下,例如在网络问题降低了网络吞吐量的情况下,滞后时间可能会较长。 在存在 I/O 瓶颈和数据移动操作处于挂起状态时,将增加滞后时间。 为了监视挂起的数据移动,可以使用 AlwaysOn 面板sys.dm_hadr_database_replica_states 动态管理视图。

只读工作负荷的影响

为只读访问配置辅助副本时,辅助数据库上的只读工作负荷占用来自重做线程的系统资源,例如 CPU 和 I/O,特别是在只读工作负荷大量占用 I/O 的情况下。

此外,辅助副本上的只读工作负荷还会阻止通过日志记录应用的数据定义语言 (DDL) 发生更改。 虽然读取操作由于行版本控制而不会占用共享锁,但这些操作会占用架构稳定性 (Sch-S) 锁,这些锁可能会阻塞正在应用 DDL 更改的重做操作。

应了解与生成查询有关的最佳实践,并且在辅助数据库中应用这些最佳实践。 例如,将需要长时间运行的查询(如数据聚合)安排在低活动期间进行。

注意注意

如果重做线程被辅助副本上的查询阻塞,将引发 sqlserver.lock_redo_blocked XEvent。

索引

若要优化可读辅助副本上的只读工作负荷,您可能需要对辅助数据库中的表创建索引。 因为您无法在辅助数据库上进行架构或数据更改,所以应在主数据库中创建索引,并且允许更改通过重做进程传输到辅助数据库。

若要监视辅助副本上的索引使用活动,请查询 sys.dm_db_index_usage_stats 动态管理视图的 user_seeksuser_scansuser_lookups 列。

只读访问数据库的统计信息

表和索引视图的列的统计信息用于优化查询计划。 对于可用性组,作为应用事务日志记录操作的一部分,在主数据库上创建和维护的统计信息将自动保留在辅助数据库中。 但是,辅助数据库上的只读工作负荷需要的统计信息可能与在主数据库上创建的统计信息不同。 但是,因为辅助数据库被限制为只读访问,所以无法在辅助数据库上创建统计信息。

为了解决此问题,辅助副本在 tempdb 中创建和维护辅助数据库的临时统计信息。 将在临时统计信息名称后追加后缀 _readonly_database_statistic,以便将临时统计信息与主数据库永久保存的永久统计信息加以区分。

仅 SQL Server 能够创建和更新临时统计信息。 但是,您可以借助用于永久统计信息的相同工具来删除临时统计信息和监视其属性:

  • 使用 DROP STATISTICS Transact-SQL 语句删除临时统计信息。

  • 使用 sys.statssys.stats_columns 目录视图监视统计信息。 sys_stats 包含一个 is_temporary 列,用于指示哪些统计信息是永久的,哪些统计信息是临时的。

有关 SQL Server 统计信息的详细信息,请参阅统计信息

本节内容:

  • 辅助数据库上陈旧的永久统计信息

  • 限制和局限

辅助数据库上陈旧的永久统计信息

SQL Server 可检测辅助数据库上的永久统计信息的过时时间。 但是,除了通过主数据库进行更改外,不能对永久统计信息进行更改。 为了进行查询优化,SQL Server 在辅助数据库上创建临时统计信息并使用它们来替代过时的永久统计信息。

永久统计信息在主数据库上进行更新后,自动将它们永久保存到辅助数据库。 然后,SQL Server 使用更新的永久统计信息,该信息比临时统计信息要新。

如果可用性组进行故障转移,则在所有辅助副本上删除临时统计信息。

限制和局限

  • 因为临时统计信息存储于 tempdb 中,所以重新启动 SQL Server 服务将导致所有临时统计信息消失。

  • 后缀 _readonly_database_statistic 是为 SQL Server 生成的统计信息预留的。 在主数据库上创建统计信息时不能使用此后缀。 有关详细信息,请参阅统计信息

用于“返回首页”链接的箭头图标[返回页首]

容量规划注意事项

  • 出于以下两个原因,可读辅助副本需要占用 tempdb 中的空间:

    • 快照隔离级别会将行版本复制到 tempdb 中。

    • tempdb 中创建和维护辅助数据库的临时统计信息。 临时统计信息会促使略微增大 tempdb 的大小。 有关详细信息,请参阅本节后面的只读访问数据库的统计信息。

  • 在您配置对一个或多个辅助副本的读访问时,主数据库将对已删除、修改或插入的数据行添加 14 个字节的系统开销,以便存储指向辅助数据库上的行版本的指针。 这 14 个字节开销将转入辅助数据库。 在向数据行添加 14 个字节的系统开销时,可能会发生页拆分。

    行版本数据不由主数据库生成。 而是辅助数据库生成行版本。 但是,行版本控制在主数据库和辅助数据库中都会增加数据存储。

    行版本数据的增加依赖于主数据库上的快照隔离或读提交快照隔离 (RCSI) 级别设置。 下表介绍了可读辅助数据库上不同设置下的版本控制行为。

    可读辅助副本?

    启用了快照隔离或 RCSI 级别隔离?

    主数据库

    辅助数据库

    无行版本或 14 个字节的系统开销

    无行版本或 14 个字节的系统开销

    行版本和 14 个字节的系统开销

    无行版本但有 14 个字节的系统开销

    无行版本但有 14 个字节的系统开销

    行版本和 14 个字节的系统开销

    行版本和 14 个字节的系统开销

    行版本和 14 个字节的系统开销

用于“返回首页”链接的箭头图标[返回页首]

相关任务

用于“返回首页”链接的箭头图标[返回页首]

相关内容

用于“返回首页”链接的箭头图标[返回页首]

请参阅

概念

AlwaysOn 可用性组概述 (SQL Server)

关于对可用性副本的客户端连接访问 (SQL Server)

可用性组侦听器、客户端连接和应用程序故障转移 (SQL Server)

统计信息