我已经在两台服务器 Server1 和 Server 2 上建立了一个镜像数据库。
在 Server3 上,我正在尝试设置一个链接服务器,无论哪个服务器具有活动数据库,该服务器都可以正常工作。
我正在使用它来设置链接服务器。
EXEC sp_addlinkedserver
@server = N'MyLinkedServer',
@srvproduct = N'',
@provider = N'SQLNCLI',
@provstr = N'Server=SERVER1;FailoverPartner=SERVER2;Network=dbmssocn',
@catalog = N'MyDatabase';
EXEC master.dbo.sp_serveroption
@server = N'MyLinkedServer',
@optname = N'data access',
@optvalue = N'true';
EXEC master.dbo.sp_serveroption
@server = N'MyLinkedServer',
@optname = N'rpc',
@optvalue = N'false';
EXEC master.dbo.sp_serveroption
@server = N'MyLinkedServer',
@optname = N'rpc out',
@optvalue = N'true';
EXEC master.dbo.sp_serveroption
@server = N'MyLinkedServer',
@optname = N'connect timeout',
@optvalue = N'60';
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'MyLinkedServer',
@locallogin = NULL,
@useself = N'False',
@rmtuser = N'sqluser',
@rmtpassword = N'sqlpassword';
只要 Server1 上的 MyDatabase 是主体,链接服务器就可以工作。当我手动故障转移到 Server2 时,链接服务器失败。
错误消息是:
Msg 11001, Level 16, State 1, Line 0
TCP Provider: No such host is known.
Msg 18456, Level 14, State 1, Line 1
Login failed for user 'sqluser'.
Msg 4060, Level 11, State 1, Line 1
Cannot open database "MyDatabase" requested by the login. The login failed.
18456 和 4060 错误消息重复出现,直到 60 秒后查询超时。
在 Server1 上,我可以看到尝试登录“MyDatabase”的重复失败。它失败了,因为 Server1 是镜像。我没有看到尝试连接到作为主体的 Server2。
如果我重新创建以 Server2 作为主服务器,将 Server1 作为镜像服务器的链接服务器,它将一直工作,直到我故障回复到 Server1。
镜像服务器是 SQL Server 2012,我尝试在其上创建链接服务器的机器是 SQL Server 2005,但在 SQL Server 2008 R2 机器上创建链接服务器时,我也遇到了同样的问题。
我错过了什么?
谢谢!
更新
我已经取得了进展。昨天,当我第一次设置时,我可以发誓它工作过一次。我永远无法复制它。然后,今天,我让它工作了一次。我可以从 Server1 故障转移到 Server2(反之亦然)一次。链接服务器将在故障转移后工作,但如果我故障转移回原始服务器,它就会停止工作。在具有链接服务器的服务器上重新启动 SQL Server 服务将使其再次工作(对于 1 次故障转移)。让事情一夜之间也必须工作,因为我今天第一次尝试它就奏效了。
创建一个新的链接服务器(使用不同的名称)不起作用,所以我猜测 SQL Native Client 驱动程序正在缓存一些东西。
另一个更新
我确实让链接服务器(如上所述)在 SQL Server 2012 Express 实例上正常工作。然后,我在另一个 SQL Server 2012 Standard 实例上进行了尝试。那没起效。可能相关的一件事是 Server1 和 Server2 与 Server3 位于不同的不受信任域中。但是,由于我使用的是 sql server 身份验证,所以我认为它不应该。运行良好的 Express 实例位于同一个不受信任的域中。
这是一个已知的问题。正在寻找数据库镜像登录的链接服务器仅适用于 Windows 登录,而不适用于本连接项目中谈到的 SQL 登录。基本上,您需要在链接服务器中硬编码用户名和密码,不建议这样做,或者使用 Windows 身份验证来访问链接服务器。
另一种选择是在两台机器上设置警报和 SQL 代理作业,以便当数据库在这些机器上变为活动状态时,它们会自动使用正确的服务器名称重新配置链接服务器。