我有3台服务器设置用于SQL镜像和使用见证服务器自动故障转移。这按预期工作。
现在我连接到数据库的应用程序在发生故障转移时似乎有问题 - 我需要手动干预并更改连接字符串以便再次连接。
到目前为止,我发现的最佳解决方案是使用连接字符串的Failover Partner
参数,但它既不直观也不完整:Data Source="Mirror";Failover Partner="Principal"
found here。
从上面博客中的示例(场景#3)发生第一次故障转移,并且主体(故障转移伙伴)不可用时,将使用数据源(这是新的主体)。如果它再次失败(我只在一段有限的时间内尝试过),则会出现错误信息。发生这种情况是因为连接字符串被缓存,所以在刷新之前,它会一直出现错误(似乎连接字符串在遇到错误后刷新约5分钟)。如果在故障转移后我交换数据源和故障转移伙伴,我将再次进行一次静默故障转移。
是否有办法为使用镜像数据库的应用程序实现全自动故障转移(没有看到错误)?
我可以看到使用自定义脚本的潜在变通方法,这些脚本可以轮询当前活动的数据库节点名称并相应地调整连接字符串,但目前看起来像是一种过度杀伤。
答案 0 :(得分:2)
它解释了发生了什么,故障转移伙伴实际上是从sql server读取的,而不是从你的配置中读取的。在该帖子中运行查询以找出实际用作故障转移服务器的内容。它可能是您的客户端运行位置无法发现的计算机名称。
答案 1 :(得分: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
答案 2 :(得分:0)
解决方案是关闭连接池Pooling="false"
虽然这对小型应用程序的影响很小,但我没有使用每分钟(或更多)接收数百个请求的应用程序对其进行测试,并且不确定其含义是什么。有人关心评论吗?
答案 3 :(得分: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;"
答案 4 :(得分:0)
如果使用.net开发,可以尝试使用ObjAdoDBLib或者PigSQLSrvLib和PigSQLSrvCoreLib,代码会变得简单。
示例代码:
新建对象
ObjAdoDBLib
Me.ConnSQLSrv = New ConnSQLSrv(Me.DBSrv, Me.MirrDBSrv, Me.CurrDB, Me.DBUser, Me.DBPwd, Me.ProviderSQLSrv)
PigSQLSrvLib 或 PigSQLSrvCoreLib
Me.ConnSQLSrv = New ConnSQLSrv(Me.DBSrv, Me.MirrDBSrv, Me.CurrDB, Me.DBUser, Me.DBPwd)
执行此方法可以在镜像数据库故障转移后自动连接在线数据库。
<块引用>Me.ConnSQLSrv.OpenOrKeepActive
有关详细信息,请参阅相关链接。
<块引用>https://www.nuget.org/packages/ObjAdoDBLib/
<块引用> <块引用>