我有一个安装在两台服务器 SQL01 和 SQL02 上的 Windows 服务应用程序。两台服务器上都有一个 SQL 服务器(X1 和 X2),它们具有相同的内容。为一个名为 Interface 的数据库建立了镜像合作关系。
两个服务都连接到本地数据库,因此彼此之间没有任何联系。该服务非常简单,它从数据库中读取数据并执行一些操作,然后将其发送到远程数据库(两个实例都一样)。使用一个简单的函数来确定数据库是否可用,方法是使用虚拟 SELECT。如果数据库回答,则表示可用,否则表示不可用。
当我们第一次启动整个系统时,显然只有一个数据库在运行(因为存在合作关系)。但是,当我们进行手动故障转移时,似乎数据库仍然可用!我应该重新启动服务吗?它会停止这样做,然后重新启动以按应有的方式工作。
据我所知,我没有保持与数据库的任何连接。我完成查询后立即打开和关闭它们。
有人知道会发生什么吗?
谢谢,
答案1
实际情况是,当您成功连接到主服务器时,SQL Server 会将故障转移伙伴发送到客户端,然后客户端会将此故障转移伙伴缓存在客户端。这就是在发生故障转移时将使用的内容。但是,当建立初始连接时主服务器已关闭,则客户端将在连接字符串中尝试故障转移伙伴。如果成功,SQL Server 会将“新”故障转移伙伴发送到客户端,然后客户端会将此故障转移伙伴缓存在客户端。这意味着原来的主服务器现在作为故障转移伙伴存储在客户端上。
换句话说,SQL 客户端会自动处理故障转移(您必须重试故障转移期间正在进行的任何事务),但如果您未指定故障转移伙伴且主体不可用,则那是当连接字符串的“故障转移伙伴”部分相关时。