我正在从一个 SQL Server 2008 R2 实例转移到一个单独的盒子上的 SQL Server 2012 实例。我想恢复msdb
以获取我的所有代理工作等,但我收到以下错误:
数据库“msdb”的还原失败。
(Microsoft.SqlServer.Management.RelationalEngineTasks)
System.Data.SqlClient.SqlError: 设备上的系统数据库备份\10.0.0.3\BackUps\NOFAULT2010_msdb_FULL_20121016_220006.bak 无法恢复,因为它是由不同版本的服务器创建的(10.50.1600) 比此服务器 (11.00.2100)。
(Microsoft.SqlServer.SmoExtended)
如果我想从 2012 年到 2008 年,我会理解这一点,但这对我来说是新的。
无论如何让这个工作?或者如果不是转移代理工作、用户、blazi blah 的最佳方式?
谢谢
如果您尝试恢复用户数据库 - 这将恢复正常。问题是这是一个系统数据库。系统数据库是为它们打算工作的 SQL 版本而设计的。为了让 SQL Server 2008 R2
MSDB
在 SQL Server 2012 中工作,您必须在两个版本之间没有任何不同的功能。说得通?简短的回答 为了让您的工作顺利完成,您需要将它们从旧服务器中编写出来,然后将脚本应用到新服务器上。如果您有几个,您可以像右键单击每个作业并编写脚本一样简单地执行此操作。或者,如果您有很多并且不想一次使用 PowerShell 或其他方法,则可以使用 PowerShell 或其他方法查看脚本。
要进行登录,您将使用
Sp_help_revlogin
我在下面引用的脚本和一个脚本来复制旧的服务器级别角色和权限并将它们复制到新的..基本上,对于你所带来的 90%,我很确定答案是“编写脚本”,然后只需将该脚本应用到新服务器上,登录、作业等现在都将存在于
Master
和MSDB
为 SQL Server 2012 设计的数据库。稍长的答案和关于迁移/升级方法的快速讨论
因此,如果您尝试将所有这些对象传输到 SQL Server 2012,您的方法有两个基本选项。
优点- 您可以获得所有“东西”(代理工作、链接服务器、登录、警报、操作员、邮件配置文件等),并且您不必复制对象。
缺点- 它可能有点混乱,它现在工作正常并且得到支持,但我很偏执,想确定我是否成功并有一个快速回滚选项(如果新服务器上出现问题,只需在期间恢复到旧服务器迁移。通过就地升级,它是更多的,嗯,最终的)。
您可以从这里开始就地升级。
在这种情况下,您只需从上面翻转利弊。这种方法并不那么艰难或费力。它只需要一些好的计划。基本上你:
在您的旧服务器上,根据通常可以在联机丛书中找到的每种对象类型(如作业、链接服务器、SQL 代理警报等对象)的说明和方法,编写出您想要移动的所有对象。 .
使用类似移动登录的工具和类似这样
sp_help_revlogin
的脚本来移动登录权限。备份和恢复已经包含数据库内用户和权限的数据库(我喜欢通过分离附加来执行此操作,因为它有助于保留回滚能力,但我已经看到并以任何一种方式完成了此操作).. 如果您是,请更改您的兼容模式计划在 2012 年模式下支持 DB,并以这种方式对其进行了测试。如果这是您的计划,或者将它们保持在 2008 模式。
为您在上面从旧服务器创建的新服务器上的所有对象(如作业、登录名等)运行这些脚本(最好在 DB 之后执行其中大部分操作。因为如果他们的数据库认为登录名将在您身上出错,他们默认不存在或作业数据库中的 T-SQL 步骤不存在等)
这种方法的另一个好处是您可以在工作时间提前进行试运行。将在该实例上使用的应用程序的测试或开发版本指向 2012 年,看看有什么问题。修复它并测试您的清单、回滚计划等,并为上线之夜做好准备。
这是一个旧帖子,但我想提出一个不同的解决方案。
在您的 Sql2012 系统上,恢复 SQL2008 MSDB 数据库的备份,但在恢复过程中为其指定一个不同的名称 ('msdb_2008')。另外,请确保不要覆盖原始文件。还原过程会将数据库版本升级到 SQL2012。
从您的 SQL2012 实例中分离 MSDB_2008 数据库(但请记住恢复的文件在哪里!)
停止 SQL Server 服务(SQL 代理将因此而停止)
浏览到原始 MSDB 文件所在的区域,并将它们移动到子文件夹以妥善保管。
将 MSDB_2008 数据库文件复制到原始 MSDB 文件所在的路径,在此过程中重命名它们以匹配原始 MSDB 文件。
重新启动 SQL Server。