我刚刚获得了一个 Sql Server 2016 可用性组设置(一个主节点、一个同步辅助节点和一个异步辅助节点)。我在服务器上有五个数据库。
我设置了一个应用程序来对服务器运行查询(使用带有“故障转移伙伴”连接字符串的实体框架。)
当我尝试通过重新启动主服务器来测试故障转移时,出现以下错误:
服务器 MySecondaryServer,没有为数据库镜像配置数据库主服务器。
像这样镜像系统数据库似乎很奇怪,因此我们没有将其设置为“可用性数据库”之一。
所以,这是我的问题:我是否应该将主数据库添加到“可用性数据库”列表中,如果我这样做会导致问题吗?
无法将 master 作为可用性组 (AG) 中的可用性数据库包括在内。系统数据库(master、model、msdb、tempdb)不能是可用性组的一部分。
系统数据库是实例级对象。需要它们才能使实例在线且可用。可用性组低于此级别,并提供从一个实例到另一个(或其他几个)实例的数据库级复制。
SQL Server 将阻止您将系统数据库添加到 AG,因为这些数据库需要在每个实例上进行读写才能使实例联机。
此外,如您的其他问题的答案中所述,您不应使用故障转移合作伙伴连接字符串属性。该属性是为与数据库镜像一起使用而设计的——这是一种不同的、已弃用的可用性功能。相反,您应该使用AG 侦听器,它还将为主节点提供正确的方向,并允许您使用其他 AG 特定的功能,例如只读路由。
回到你的错误....
您的代码可能不应该依赖主数据库,尤其是在 AG 中,您的数据库可能会移动到具有不同主数据库的不同实例。为了最简单和最防弹的 AG 架构,我通常建议您不遗余力地使您的数据库自包含,或者做出有意识的、有根据的决定将某些东西放在数据库之外。
我的第一个猜测(并且不了解您的代码或连接的更多信息)是您的查询根本不应该引用 master。可能只是您的连接字符串将您登录到主数据库而不是您想要的数据库 - 所以修复您的代码或连接字符串,而不是您的 AG。