将数据库移动到新服务器

将数据库移动到新服务器

我是恢复备份生产数据库到新服务器。新服务器还托管使用数据库的应用程序。因此,我希望使用相同的用户/密码组合连接到数据库。用户也包含在数据库备份中,所以我认为这应该可行。但是用户在新服务器上不存在(数据库)用户。 所以我创建了新的服务器用户并尝试将此凭据映射到新恢复的数据库。但是此操作失败,因为user already exists数据库中存在。

是否可以(如果可以,请告诉我如何)将用户从数据库(独立于服务器)移动/复制到(数据库)服务器登录列表?

答案1

在 SQL-Server 2008 中,已恢复数据库的数据库用户和服务器登录名可能不同步,因为内部 ID 不匹配。要修复此问题,请运行:

EXEC sp_change_users_login @Action=''Update_One'', @UserNamePattern='databaseusername', @LoginName = 'logonname';

针对您恢复的数据库和每个用户/登录。

在 SQL-Server 2012 中,有一个新选项可以使用独立于服务器登录的数据库用户。

答案2

我知道我这样做已经晚了,但它可能会对其他人有所帮助。

登录位于服务器级别。用户位于数据库级别。有一个 ID 值(称为 SID)将两者连接在一起。当您在新服务器上创建 SQL 登录时,SQL 会选择一个新的 SID 值。SID 选择算法的本质是您不会在两个不同的服务器上获得相同的值。当您从旧服务器恢复数据库时,数据库中的 SID 值与服务器上的 SID 值不匹配。

此时,您需要使用 sp_change_users_login。

但是,在到达那个点之前,您可以省去很多麻烦,特别是如果您有从旧服务器迁移到新服务器的登录日志。查看 sp_help_revlogin。这是 Microsoft 支持的一个过程。过程和文档位于这里这里。(不同版本的 SQL Server 有不同版本的过程。还有一个名为“sp_hexadecimal”的辅助函数。)基本上,您需要在旧服务器上创建这些过程,然后运行它们。知识库文章中有详细信息。

sp_help_revlogin 的最大优点是它生成用户创建 DDL,其中保留了 SQL 登录的 ID 值和密码。这样,您只需运行 sp_help_revlogin,查看生成的 DDL 以查找所需的用户,在新服务器上运行该代码,然后恢复数据库即可。此时,SID 值应该匹配,您不需要 sp_change_users_login。

另一种解决方法是使用集成(又称“域”或“windows”)安全性。使用 AD 登录时,创建登录时会从域中提取 SID 值。然后,在为该登录创建数据库用户时,会将该 SID 值放入数据库中。由于 SID 值只有一个来源,因此不会出现不匹配的情况。当然,使用集成安全性并不总是可行的。

相关内容