3

我使用见证服务器为 SQL 镜像和自动故障转移设置了 3 台服务器。这按预期工作。

现在,我连接到数据库的应用程序在发生故障转移时似乎出现问题 - 我需要手动干预并更改连接字符串以使其再次连接。到目前为止,我发现的最佳解决方案涉及使用Failover Partner连接字符串的参数,但它既不直观也不完整:Data Source="Mirror";Failover Partner="Principal" 在此处找到

从上面博客中的示例(场景#3)中,当第一次故障转移发生并且主体(故障转移伙伴)不可用时,将使用数据源(这是新的主体)。如果它再次失败(我只在有限的时间内尝试过),它就会出现一条错误消息。发生这种情况是因为连接字符串被缓存,所以在刷新之前,它会不断出现错误(似乎连接字符串在遇到错误后刷新约 5 分钟)。如果在故障转移后我交换数据源和故障转移伙伴,我将再次进行一次静默故障转移。

有没有办法为使用镜像数据库的应用程序实现全自动故障转移(没有看到错误)?

我可以看到使用自定义脚本的潜在解决方法,这些脚本将轮询当前活动的数据库节点名称并相应地调整连接字符串,但目前这似乎有点过头了。

4

5 回答 5

2

在此处阅读博客文章 http://blogs.msdn.com/b/spike/archive/2010/12/15/running-a-database-mirror-setup-with-the-sqlbrowser-service-off-may-produce -unexpected-results.aspx

它解释了正在发生的事情,故障转移伙伴实际上是从 sql 服务器而不是从您的配置中读取的。运行该帖子中的查询以找出实际用作故障转移服务器的内容。它可能是一个无法从您的客户端运行的位置发现的机器名称。

于 2014-01-17T21:54:48.913 回答
1

如果发生故障转移,您可以清除应用程序池。我知道不是很好;-)

  // ClearAllPools resets (or empties) the connection pool. 
  // If there are connections in use at the time of the call, 
  // they are marked appropriately and will be discarded 
  // (instead of being returned to the pool) when Close is called on them.
  System.Data.SqlClient.SqlConnection.ClearAllPools();

当我们通过 SQL Server 别名更改底层服务器时,我们使用它来强制“刷新”服务器名称。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearallpools.aspx

于 2013-02-06T15:35:23.267 回答
0

解决方案是关闭连接池Pooling="false"

虽然这对小型应用程序的影响很小,但我还没有用每分钟接收数百个请求(或更多)的应用程序测试它,并且不确定它的含义是什么。有人愿意发表评论吗?

于 2012-09-11T07:43:33.117 回答
0

试试这个连接字符串:

connectionString="Data Source=[MSSQLPrincipalServerIP,MSSQLPORT];Failover Partner=[MSSQLMirrorServerIP,MSSQLPORT];Initial Catalog=DatabaseName;Persist Security Info=True;User Id=userName; Password=userPassword.; Connection Timeout=15;"

于 2020-10-14T13:27:37.043 回答
0

如果使用.net开发,可以尝试使用ObjAdoDBLib或PigSQLSrvLib和PigSQLSrvCoreLib,代码会变得简单。

示例代码:

新对象
ObjAdoDBLib

Me.ConnSQLSrv = 新 ConnSQLSrv(Me.DBSrv,Me.MirrDBSrv,Me.CurrDB,Me.DBUser,Me.DBPwd,Me.ProviderSQLSrv)

PigSQLSrvLib 或 PigSQLSrvCoreLib

Me.ConnSQLSrv = 新 ConnSQLSrv(Me.DBSrv,Me.MirrDBSrv,Me.CurrDB,Me.DBUser,Me.DBPwd)

镜像数据库故障转移后,执行该方法自动连接在线数据库。

Me.ConnSQLSrv.OpenOrKeepActive

有关详细信息,请参阅相关链接。

https://www.nuget.org/packages/ObjAdoDBLib/

https://www.nuget.org/packages/PigSQLSrvLib/

https://www.nuget.org/packages/PigSQLSrvCoreLib/

于 2021-06-20T11:36:15.107 回答