MS SQL 2012 镜像数据库 - SID 不匹配导致故障转移时连接失败

MS SQL 2012 mirrored databases - SID mismatch causing causing connection failure on failover

我有许多 SQL Server 2012 镜像数据库,如果发生故障转移到辅助数据库,数据库连接将失败。必须 运行 更改 user/database 上的用户才能使其正常工作,这确实限制了自动故障转移的实用性。我知道这是因为 login/user 的 SID 在主要和次要上不匹配。

这个 blog post 解决了这个问题,但我想确认我 无需在 table 级别进行更改即可完成我需要做的事情 因为权限是在 table 级别分配的,并且有数百个 table。

假设 login/user 是 'dbuser'。

第 1 步:从主要(获取 dbuser 的 SID):

use master
select name, sid from sys.sql_logins
where name='dbuser'

第 2 步:在辅助节点上(使用第 1 步中的 SID):

DROP LOGIN dbuser
CREATE Login dbuser WITH password=[my password], SID=[SID from step 1]

第 3 步:故障转移到辅助

第 4 步:对于辅助数据库上的每个数据库

USE [database]
GO
ALTER USER dbuser with login=dbuser
GO

我认为第 4 步应该将 user dbuser SID 与新创建的 login dbuser SID 对齐,所有这些现在都将与主服务器上的 SID 相匹配,从这一点开始,前向故障转移应该可以工作,而无需更改用户。

我看过这个说法:

如果您删除一个映射了数据库用户的登录名,这些用户将在 SQL 服务器中被孤立。

所以这是我认为的核心问题:可以这么说第 4 步解除用户孤立吗?

简而言之,是的,这会奏效。虽然我会说第 4 步应该是不必要的。

稍微长一点的回答:"orphaned user"表示"a user whose SID has no login with a matching SID"。当您使用 SID 显式创建登录时,您就保证了匹配。我对可用性组使用相同的方法。

我使用的另一个技巧是也从主服务器获取散列密码,并在任何辅助服务器中创建登录名时指定该密码。这让我很容易检查密码是否匹配。

我已经有一段时间没有处理镜像了,但我似乎记得您可以制作数据库快照来创建镜像数据库的可读副本。我鼓励您这样做并尝试使用您的用户登录;证明某事有效的最好保证。