将 Mssql 数据库从不同实例迁移到新服务器

将 Mssql 数据库从不同实例迁移到新服务器

我在 3 个不同的服务器上安装了 3 个 Sql (2008 R2) 实例。版本为 (10.50.2550.0 SP1 标准版 (64 位)、10.50.2550.0 SP1 标准版 (64 位))。目标是迁移所有数据库和登录信息对于新服务器,我们刚刚购买了 Sql server 2012。

我不知道该怎么做,我尝试使用复制数据库向导,但总是失败。如果我决定备份每个数据库并将它们还原到新服务器,我不知道如何迁移登录信息。

处理这种情况的最佳方法是什么?

抱歉造成混淆:(有关该问题的更多详细信息)

  1. 要移动的数据库数量:10
  2. 复制数据库向导期间列出的错误:

第 60 行:

OnError,DUPFAIDS,NT AUTHORITY\SYSTEM,DUAPPSRV1_EXAPPSVR1_DUPFAIDS_PFAIDS_Transfer 对象任务,{8F0C82BB-4C5D-4796-BE75-BAB033C59039},{3818CD1B-9685-46B7-AFE2-AE0FE962DA03},

2014 年 12 月 3 日下午 12:10:15,2014 年 12 月 3 日下午 12:10:15,0,0x,错误:错误代码 = -1073548784

描述=执行查询“--------------------------------------------------...”失败,出现以下错误:“对象名称‘xwd_window_disabled_objects’无效。”。

可能的失败原因:查询存在问题,“ResultSet”属性未正确设置、参数未正确设置或连接未正确建立。**

答案1

按照建议备份并恢复数据库。然后运行此 Microsoft 脚本 (https://support.microsoft.com/kb/918992) 来生成脚本,以便在新服务器上创建登录名。由于您有两个源服务器,请务必仔细检查脚本,以确保没有任何重复条目或其他问题。

答案2

迁移数据库的方法有很多种。备份和恢复是最常用的方法,但如果您有超过 100 个数据库,您可能需要编写脚本来分离和附加数据库。我已成功使用此方法将大量(数百个)数据库迁移到新服务器:

@ECHO ON

set controlfile=control.txt

set newipmdf=\\newserver\g$
set newipldf=\\newserver\e$
set oldserver=oldserver\Prod1
set oldmdfpath=d:\prod1
set newmdfpath=g:\data
set copymdfpath=m:\data
set newserver=newserver
set oldlogpath=e:\prod1
set newlogpath=e:\log
set copylogpath=l:\log
set movedmdfpath=%oldmdfpath%\moved
set movedldfpath=%oldlogpath%\moved

mkdir %movedmdfpath%
mkdir %movedldfpath%

net use m: %newipmdf%
net use l: %newipldf%

SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F %%L IN (%controlfile%%) DO (
  SET "line=%%L"
  SETLOCAL ENABLEDELAYEDEXPANSION
  ECHO !line!
  sqlcmd -E -S!oldserver! -Q"EXEC master.dbo.sp_detach_db @dbname = N'!line!'"
  copy "!oldmdfpath!\!line!.mdf" !copymdfpath!
  copy "!oldlogpath!\!line!_log.ldf" !copylogpath!
  sqlcmd -E -S!newserver! -Q"CREATE DATABASE [!line!] ON ( FILENAME = N'!newmdfpath!\!line!.mdf' ),( FILENAME = N'!newlogpath!\!line!_log.ldf' ) FOR ATTACH"
  move "!oldmdfpath!\!line!.mdf" !movedmdfpath!
  move "!oldlogpath!\!line!_log.ldf" !movedldfpath!
  ENDLOCAL
)
ENDLOCAL

net use m: /z
net use l: /z

至于登录,我无法帮助您提供密码,但您应该能够使用以下命令获取用户名列表:

SELECT [name], type, type_desc
  FROM [master].[sys].[server_principals]
  where is_disabled=0 and type in ('S','U')

答案3

Katherine Villyard 的分离/附加脚本很好。

如果您想备份和恢复,这也是一个经常使用的好选择。但请先登录。

sp_hexadecimal复制代码sp_help_revlogin这篇 Technet 文章并用来sp_help_revlogin生成可用于复制登录信息的 TSQL 语句。流程如下:

  1. 运行上述代码来创建存储过程(在 master 中)
  2. EXEC sp_help_revlogin在旧服务器上运行
  3. 复制结果sp_help_revlogin并将其粘贴到连接到新 SQL Server 实例的新查询窗口中
  4. 运行刚刚粘贴的 TSQL 语句

如果操作正确,您的新实例将具有匹配的登录名(具有匹配的 SID 和密码,这是关键)。然后,您可以将数据库备份并还原到新实例,而不必担心孤立的数据库登录名。

(给未来访问者的提示:如果由于某种原因链接中断,只需进行搜索即可sp_help_revlogin找到新页面)。

相关内容