设置 AlwaysOn 可用性组时,主数据库是否应该是“可用性数据库”之一?

Vac*_*ano 4 sql-server availability-groups sql-server-2016

我刚刚获得了一个 Sql Server 2016 可用性组设置(一个主节点、一个同步辅助节点和一个异步辅助节点)。我在服务器上有五个数据库。

我设置了一个应用程序来对服务器运行查询(使用带有“故障转移伙伴”连接字符串的实体框架。)

当我尝试通过重新启动主服务器来测试故障转移时,出现以下错误:

服务器 MySecondaryServer,数据库主服务器没有配置数据库镜像。

像这样镜像系统数据库似乎很奇怪,所以我们没有将它设置为“可用性数据库”之一。

所以,这是我的问题:我是否应该将主数据库添加到“可用性数据库”列表中,如果我这样做会导致问题吗?

AMt*_*two 9

不可能将 master 作为可用性数据库包含在可用性组 (AG) 中。系统数据库(master、model、msdb、tempdb)不能是可用性组的一部分。

系统数据库是实例级对象。需要它们才能使实例在线且可用。可用性组低于该级别,并提供从一个实例到另一个(或多个其他实例)的数据库级复制。

SQL Server 将阻止您将系统数据库添加到 AG,因为这些数据库需要在每个实例上进行读写才能使实例联机。

此外,如您的其他问题的答案所述,您不应使用故障转移伙伴连接字符串属性。该属性设计用于数据库镜像——一种不同的、已弃用的可用性功能。相反,您应该使用AG 侦听器,它也将为主节点提供正确的方向,并且还允许您使用其他特定于 AG 的功能,例如只读路由。

回到你的错误......

您的代码可能不应该依赖于 master 数据库,尤其是在 AG 中,您的数据库可以移动到具有不同 master 数据库的不同实例。为了最简单和最安全的 AG 架构,我通常建议您竭尽全力使您的数据库自包含,或者做出有意的、受过教育的决定,将某些内容放在数据库之外。

我的第一个猜测(并且不了解您的代码或连接的更多信息)是您的查询根本不应该引用 master。可能只是您的连接字符串将您登录到主数据库而不是您想要的数据库 - 因此修复您的代码或连接字符串,而不是您的 AG。