PROD
我们在和之间设置了数据库镜像,SECONDARY
并且已故障转移到辅助副本 ( SECONDARY
)。现在,我们在服务器日志中看到许多几乎持续失败的登录PROD
。
应用程序使用连接字符串的故障转移伙伴属性:
Data Source=PROD;Failover Partner=SECONDARY;Initial Catalog=myDataBase;
我们已经确认它们正在按预期工作。
这是有道理的,显式指定的数据库PROD
无法打开,因为它由于故障转移而处于恢复状态,但应用程序已成功连接到SECONDARY
。此错误消息是否是故障转移数据库镜像主副本上的预期行为?
下面使用一个简单的、基于 ODBC 的场景复制了该问题
设置镜像数据库:
在主服务器上创建登录名
USE Mirroring
CREATE LOGIN MirrorUser WITH PASSWORD = 'MyPassHere', DEFAULT_DATABASE = 'Mirroring'
CREATE USER MirrorUser
ALTER ROLE db_datareader ADD MEMBER MirrorUser
和次要的:
CREATE LOGIN MirrorUser WITH PASSWORD = 'MyPassHere',SID = <Sid from primary here>
在 Access 数据库中设置链接表
将数据库故障转移到辅助数据库:
ALTER DATABASE Mirroring SET PARTNER FAILOVER
打开Access链接表并验证我们可以看到故障转移后的数据:
观察 .\PROD 上的错误
在数据库镜像中,通过首先尝试连接到主体来检测故障转移,如果失败,驱动程序将尝试连接到服务器
failover partner
。因此,如果您的应用程序配置为没有连接池,并且被编码为不维护数据库请求之间的连接,则主应用程序将看到登录尝试,但如果登录将其“默认数据库”属性设置为其中之一,则拒绝它们镜像数据库。也可能是您在未配置
failover partner
参数的地方配置了错误的连接字符串。错误日志中的错误消息显示哪个客户端遇到登录失败 - 这可以帮助您找出问题所在。您还可能在客户端应用程序中配置了多个连接字符串,并且其中一个字符串缺少参数failover partner
。顺便说一句,数据库镜像已被标记为已弃用,并且可能会从 SQL Server 的未来版本中删除。替代方案是可用性组,其效果要好得多。我会考虑迁移到可用性组,因为它将显着简化向新硬件的迁移或通过分布式可用性组迁移到云的过程,而分布式可用性组在 SQL Server 2016+ 上受支持。