我正在设置 3 节点集群作为可用性组的一部分。
最初我使用 SQL Management Studio 测试了节点之间的故障转移,当我停止一个节点时,一切都成功故障转移,并且我仍然能够编写查询。
我开始使用 SQL 用户连接的应用程序进行测试,每当我切换节点时,都会登录失败。
我认为导致此问题的原因在于与数据库绑定的服务器登录 SID 与其他节点上的服务器登录不同,从而导致登录失败。如果我理解不正确,请纠正我。
如果我理解正确,我该如何确保服务器登录 SID 在节点之间相同?有没有办法复制它,或者应该如何完成?
我阅读了一些有关包含数据库的内容,我可以在数据库本身上设置登录名,而不是创建服务器登录名,但我不想走这条路。
答案1
你的直觉可能是正确的。你可以通过运行以下命令来验证节点之间的 SID 是否不同:
select name, sid from sys.server_principals
在每个节点上并进行比较。
至于如何保持它们同步,请在创建时进行同步(不幸的是,我不知道如何事后更改 SID)。也就是说,该create login
语句有一个可选子句来提供 SID。所以我会这样做:
-- on node 1
create login [foobar] with password = 'str0ngp@ssword!';
select sid from sys.server_principals where name = 'foobar';
-- on subsequent nodes
create login [foobar] with password = 'str0ngp@ssword!', sid = <the sid you obtained from node 1>;
我已经这样做了,以便生成自己的 SID 并将其传递给节点 1(以便相同的脚本在所有服务器上运行),但我将其留给读者作为练习。:)