如何将SQL Server 2012数据库还原到SQL Server 2008 R2?

时间:2013-11-07 14:01:07

标签: sql sql-server database sql-server-2008-r2 sql-server-2012

我正在尝试将从SQL Server 2012中获取的备份还原到SQL Server 2008 R2,并且它提供了错误

  

指定的演员表无效。 (SqlManagerUI)

如果您有任何解决方案,请发表评论

感谢。

10 个答案:

答案 0 :(得分:39)

注意,上面的一些答案都是大概过时的!这可以在SQL SERVER MANAGEMENT STUDIO(SQL MS)

中完成

您可以采用多种方法来降级"降级"一个数据库,但我最近发现的一个,我认为在SQL MS 2012的早期版本中找不到的是复制数据库向导。以下是如何将数据库从2012服务器实例复制到2008 R2实例:

  1. 在2012年的实例中,右键单击要复制的数据库/"降级"并选择"任务" > "复制数据库......"。

  2. "欢迎使用复制数据库向导"单击[下一步]。

  3. "选择源服务器":设置"源服务器"作为2012实例(或更高版本的服务器实例),并设置相应的身份验证。点击下一步]。 [注意。服务器代理服务必须正在运行]

  4. "选择目标服务器:"设置"目标服务器"作为2008 R2(或更低版本的实例),并设置相应的身份验证。点击下一步]。 [注意。服务器代理服务必须正在运行]

  5. "选择转移方式"为了这个例子,选择"使用SQL管理对象方法",单击[下一步]。

  6. 选择移动或复制所需的数据库,单击[下一步]。

  7. 配置目标数据库路径和逻辑名称等。如果数据库存在,请选择所需选项。单击[下一步]。

  8. 配置集成服务包,单击[下一步]。

  9. 对于此示例,请选择"立即运行"选项"安排包"选项,单击[下一步]。

  10. "完成向导",单击[完成]执行包并创建"降级"数据库。

  11. 你完成了,快乐的日子。 :

    我发现的另一种方法是由Microsoft创建的SQL数据库迁移向导,我认为(我不知道)上面的向导是从中创建的。在此处http://sqlazuremw.codeplex.com/。要使用此程序包将数据库从SQL Server 20012迁移到2008 R2,您可以执行以下操作:

    注意。 Microsoft现已从Codeplex中删除了SQLAzureMW。我个人已将其提供here

    1. 运行SQLAzureMW.exe。

    2. 从主窗口右侧选择Analyze / Migrate单选按钮。

    3. 将目标服务器选为“SQL数据库最新服务版本(V12)”。单击[下一步]。

    4. 连接到SQL Server 2012实例。我的机器的服务器名称是“VAIOE \ SQLSERVER2012”,使用Windows身份验证,从数据库选项和“保存登录信息”中选择“主数据库(列出所有数据库)”。单击[连接]。

    5. 选择要迁移的所需数据库[立即使用GVH报告数据库]。单击[下一步]。

    6. 选择“编写所有数据库对象的脚本”。

    7. 单击[高级]并更改以下选项:

    8. 一个。在General下将“Target Server”设置为“SQL Server”。

      湾在“表/视图选项”下,将“脚本表/数据”设置为“带有数据的表格模式”。将“数据库引擎存储过程”设置为“True”。将“安全功能”,“安全存储过程”和“系统功能”设置为“真”。

      单击[确定]。单击[下一步]。

      1. 查看您的选择。单击[下一步]。

      2. 系统将提示您“准备生成脚本?”,单击[是]。这将启动脚本生成。完成后,单击[下一步]。

      3. 现在您将获得另一个连接对话框。这次选择目标服务器(SQL Server 2008 R2实例)上的数据库。选择主数据库,以便选择目标数据库。单击[连接]。

      4. 现在,您可能希望迁移到新数据库,因此请单击[创建数据库]。

      5. 输入数据库目标名称并将“排序规则”保留为“”,这与我们无关。单击[创建数据库]。单击[下一步]。

      6. 现在将提示您“针对目标服务器执行脚本?”,单击[是]。

      7. 现在,这将使用生成的脚本设置架构,但是不同于我们发现的先前方法,数据是使用BCP批量加载的,这非常快。所有这些都是在内部完成的,因此不会生成大量的.sql脚本文件等。

      8. 单击[退出]。

      9. 你完成了。现在,如果您打开Management Studio并连接到我们刚刚使用的SQL Server 2012和2008 R2实例,您可以看到2012源数据库的架构与刚刚创建的目标数据库相匹配。

        上述两个过程几乎完全相同,并提供相同的功能。除非您特别需要迁移到Azure或方法1失败,否则我不会执行后者。

        我希望这可以帮助别人。

答案 1 :(得分:12)

右键单击您的数据库,然后选择任务 - >生成脚本

选择要还原的内容,或者只是默认选中完整的数据库。

现在点击下一步 - >单击“高级”并选择“服务器版本的脚本”到要恢复的“ssms版本”,如2008或2008 R2或其他版本。

另外,选择“要编写脚本的数据类型”为“架构和数据”

最后在目标ssms上执行此.sql文件并在第一行使用数据库中更改数据库名称

如果没有数据库则创建一个,如果执行脚本时出错,请执行alter keyword中的脚本以完成底部。

答案 2 :(得分:8)

您不能,您永远不能从较高版本还原到较低版本的SQL Server。您唯一的选择是编写数据库脚本,然后通过SSIS,BCP,链接服务器或脚本输出数据传输数据

答案 3 :(得分:7)

致:Killercam 谢谢你的解决方案。我尝试了第一个解决方案一小时,但对我没用。

我使用脚本生成方法将数据从SQL Server 2012移动到SQL Server 2008 R2,如下所示:

在2012 SQL Management Studio中

  1. 任务 - >生成脚本(在第一个向导屏幕中,单击下一步 - 可以 不显示)
  2. 选择脚本整个数据库和所有数据库对象 - >下一步
  3. 单击[高级]按钮 3.1将[数据类型更改为脚本]从“仅模式”更改为“模式和数据” 3.2将[服务器版本脚本]“2012”更改为“2008”
  4. 完成创建脚本文件的下一个向导步骤
  5. 使用sqlcmd将导出的脚本文件导入SQL Server 2008 R2 5.1打开Windows命令行 5.2键入[sqlcmd -S -i文件路径](例如:[sqlcmd -S localhost -i C:\ mydatabase.sql])
  6. 它对我有用。

答案 4 :(得分:2)

您将无法从2012恢复到2008。您将能够使用red-gate SQL compare之类的工具来复制架构等(前提是没有使用2012特定的内容)。如果您还要复制数据,可以使用他们的Data Compare工具,我认为您可以获得14天免费试用。

答案 5 :(得分:1)

降级”数据库从一个SQL Server版本降级到较低版本的唯一内置方法是困难的方法:编写整个数据库,架构 data,然后在目标服务器上执行脚本。

这是可行的,但往往是残酷的。

答案 6 :(得分:1)

这是另一个为我提供诀窍的选择: https://dba.stackexchange.com/a/44340

我使用选项B 。这不是我的想法所以所有的功劳都归功于原作者。我只是把它放在这里,因为我知道有时链接不起作用,建议有完整的故事。

只是我的一个提示:首先解决架构不兼容问题(如果有的话)。然后倾注数据应该是轻而易举的。

选项A :使用“生成脚本”选项在兼容模式下编写数据库:

注意:如果使用模式和数据编写数据库脚本,则根据您的数据大小,脚本将很大并且不会被SSMS,sqlcmd或osql处理(也可能是GB)。

enter image description here

选项B

首先使用所有索引,FK等编写表格,然后在目标数据库中创建空白表 - 仅使用SCHEMA(无数据)选项。

使用BCP插入数据

予。使用以下脚本BCP输出数据。在文本模式下设置SSMS并将下面脚本生成的输出复制到bat文件中。

-- save below output in a bat file by executing below in SSMS in TEXT mode

-- clean up: create a bat file with this command --> del D:\BCP\*.dat 

select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
    +  QUOTENAME(DB_NAME())+ '.' /* Current Database */
    +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
    +  QUOTENAME(name)  
    +  ' out D:\BCP\'  /* Path where BCP out files will be stored */
    +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
    +  REPLACE(name,' ','') 
    + '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'                       /* sysdiagrams is classified my MS as UserTable and we dont want it */
/*and schema_name(schema_id) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
order by schema_name(schema_id)

II。运行bat文件,该文件将在您指定的文件夹中生成.dat文件。

III。在文本模式下使用SSMS在目标服务器上运行以下脚本。

--- Execute this on the destination server.database from SSMS.

--- Make sure the change the @Destdbname and the bcp out path as per your environment.

declare @Destdbname sysname
set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
select 'BULK INSERT '
/*Remember Tables must be present on destination database */ 
+ QUOTENAME(@Destdbname) + '.' 
+ QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) 
+ '.' + QUOTENAME(name) 
+ ' from ''D:\BCP\' /* Change here for bcp out path */ 
+ REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') 
+ '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )' 
+ char(10) 
+ 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... ''' 
+ char(10) + 'go'
from sys.tables
where is_ms_shipped = 0
and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
--and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
    order by schema_name(schema_id)

IV。使用SSMS运行输出以将数据插回表中。

这是非常快速的BCP方法,因为它使用Native模式。

答案 7 :(得分:0)

如前所述,您无法使用“备份”和“还原”功能从SQL Server 2012数据库转到SQL Server 2008数据库。然而,我编写的程序SQL Server Scripter将连接到SQL Server数据库并编写数据库,其架构和数据。它可以从BitBucket克隆,并使用Visual Studio 2010或更高版本进行编译(如果是更高版本,只需打开.csproj)。

答案 8 :(得分:-1)

合并复制。您可以从分销商(2008)创建订户(2008)。数据库完全同步后,删除订阅和发布。

答案 9 :(得分:-1)

如果您在同一网络中,则使用 connect 选项将目标服务器添加到 MS Server管理工作室,然后尝试从源导出到目标。最简单的方法:))