手动故障转移后,用户映射丢失

我有两个Microsoft SQL Server实例设置用于镜像每个数据库。 有多个login和每个数据库一个或多个用户/login映射。

当我恢复数据库的备份时,我总是必须重做login/用户映射。 我明白这一点,因为login是每个数据库服务器。 所以在恢复数据库之后,我重新login/用户映射。 这是不可能的镜子,因为数据库是“恢复”。

手动故障转移后,我无法使用数据库,因为用户凭据丢失。 这并不出乎意料,所以我再次进行了login/用户映射。

我又做了一次手动故障转移,使得最初的主体,现在是镜子,再次是主要的。 令我惊讶的是,我无法使用数据库,因为login/用户映射消失了。

这是预期的行为?

这些SQLlogin? 如果是这样,那么SQLlogin和数据库用户之间的映射在主体和镜像之间是不同步的。

过去我一直有这个问题,尽pipe我很幸运,我只关心一个特定的用户。

您应该在镜像上尝试以下function:

EXEC sp_change_users_login 'update_one', @login, @login 

重置login@login和数据库用户@login之间的映射。

如果这不起作用,请尝试“Auto_fix”方法:

 EXEC sp_change_users_login 'Auto_Fix', @login, NULL, @password 

这应该创build数据库用户并且如果它不存在,则相应地映射它。

这发生在SQLlogin中,因为数据库服务器将为这些login生成SID。 这些SID是将数据库用户绑定到login名的。 即使在两台不同的服务器上可能存在相同的login名,它们的SID也可能不同,因此如果您愿意,您可能会遇到“丢失”凭据。 这对Windows帐户不会发生,因为SQL Server在创build相关login时将使用帐户本身的Windows SID。

运行sp_change_users_login作为解决方法是好的,但我想通过以下步骤解决这个(常见的)问题:

  1. 确定您遇到问题的SQL Serverlogin名。 您应该可以忽略域名login。 最好忽略任何你不使用的SQL Serverlogin,最好的例子是“sa”。

  2. select一个服务器,这将是你的“已知的”系统。 目前的小学可能是最好的select。

  3. 使用sp_help_revlogin来反向(从主)TSQL脚本来创build有问题的login。 sp_help_revlogin由Microsoft在此页面维护。 在辅助上运行时,TSQL脚本将保留SQL Server用来识别login并将其链接到每个数据库中的用户的“SID”。

  4. 在辅助上,删除有问题的login并运行您生成的TSQL脚本。 重新login时,SID将与主服务器的SID匹配。 下一次您将数据库从主服务器故障切换到备用服务器时,SID应匹配,您不必运行sp_change_users_login过程来“修复事件”。

在熟悉这个过程之前,最好一次只进行一次login。

小心:运行TSQL脚本也会同步辅助密码和主密码。 如果你在两台服务器上有不同的密码(也许一台是开发服务器,另一台是生产服务器),那么你可能需要回去修改第二台服务器上的密码。 如果你不知道这些密码是什么,或者不能让别人告诉你,这可能是一个问题。

  1. 在辅助脚本上运行脚本之后,您应该仔细检查辅助脚本中属于应用程序的任何数据库,并修复这些脚本中的用户到login映射。 例如,也许你在那个系统上有AdventureWorks。 当你放弃login时,用户到login映射将被打破,将不得不被重新创build。

在我的数据库中,我通常使用这些命令:

 EXEC sp_change_users_login 'Report' EXEC sp_change_users_login 'Auto_Fix', 'username' EXEC sp_change_users_login 'Report' 

其中用户名是您要修复的用户名。