我们在 AlwaysOn 组中有 2 台服务器。
虽然每个同步数据库中的用户帐户都存在于两台服务器上,但数据库实例级登录仅存在于其中一台服务器上。即 DBINSTANCE->Security->Logins 在一台服务器上丢失。
因此,当发生故障转移时,我会在第二台服务器(没有相应的实例级别登录)上登录失败。
我该如何克服这个问题?我应该以特殊方式设置用户帐户吗?
我们在 AlwaysOn 组中有 2 台服务器。
虽然每个同步数据库中的用户帐户都存在于两台服务器上,但数据库实例级登录仅存在于其中一台服务器上。即 DBINSTANCE->Security->Logins 在一台服务器上丢失。
因此,当发生故障转移时,我会在第二台服务器(没有相应的实例级别登录)上登录失败。
我该如何克服这个问题?我应该以特殊方式设置用户帐户吗?
我的理解是,如果您不使用Contained Databases,则必须确保在其他实例上手动创建登录。
类似于SQLSoldier的脚本(最初发布在将登录名转移到数据库镜像一文中)应该可以解决问题。
您必须使用包含的数据库,或者必须在其他服务器上使用相同的密码哈希和 SID 重新创建用户。
Microsoft 提供了执行此操作的脚本: How to transfer logins and passwords between SQL Server instances
Mark 的解决方案部分正确,但他推荐的解决方案是针对镜像数据库,而不是问题所要求的 AlwaysOn。
我在很长一段时间后回复了这个帖子,但它可能会帮助其他人解决类似的问题。PowerShell 可用于将登录信息从主副本复制到辅助副本。详细信息可以在这里找到https://maq.guru/synchronizing-sql-server-logins-in-an-always-on-availability-group/。
全面披露:我拥有上述网站。
PowerShell 脚本:
您必须使用 Windows 域登录并在每个实例中创建它们,由于 SID 由活动目录管理,如果登录存在于主副本中,您将能够访问可用性组的所有副本成员。另一种选择,您必须使用证书。