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

时间:2019-03-14 11:22:27

标签: sql-server mirroring

我有许多SQL Server 2012镜像数据库,其中在故障转移到辅助数据库的情况下,数据库连接失败。必须在用户/数据库上运行alter user才能使其正常工作,这实际上限制了自动故障转移的作用。我了解这是因为登录名/用户的SID在主要和次要上不匹配。

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

假设登录名/用户为“ 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 Server中孤立。

这是我认为的核心问题:步骤4是否可以使用户成为孤儿?

1 个答案:

答案 0 :(得分:1)

简而言之,是的,这将起作用。尽管我说第四步应该是不必要的。

稍长的答案:“孤立的用户”是指“其SID没有使用匹配SID登录的用户”。使用SID显式创建登录名时,可以保证匹配。我对可用性组使用相同的方法。

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

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