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

30

我试图将从SQL Server 2012中获取的备份还原到SQL Server 2008 R2,但出现错误。

指定的强制类型转换无效。 (SqlManagerUI)

如果您有任何解决方法,请在评论中提供。

谢谢。


5
无论使用何种方法、技巧或工具,都无法将较新版本的 SQL Server 数据库备份还原到较旧版本中去。这是不可能实现的。 - marc_s
2
这已经过时了!你可以从SQLMS 2012中完成这个操作。我会在下面提供答案... - MoonKnight
http://dba.stackexchange.com/questions/20588/restore-sql-server-2012-backup-to-a-sql-server-2008-database - Mou
10个回答

42

注意:以上某些答案已经非常过时!这可以在 SQL Server Management Studio (SQL MS)中完成所有操作。


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

  1. 在 2012 实例中,右键单击要复制/“降级”的数据库,然后选择“任务” > “复制数据库…”。

  2. “欢迎使用复制数据库向导”,点击 [下一步]。

  3. “选择源服务器”: 将“源服务器”设置为 2012 实例(或更高版本的服务器实例),并设置适当的身份验证。 点击 [下一步]. [注意. 必须运行 Server Agent 服务]

  4. “选择目标服务器”: 将“目标服务器”设置为 2008 R2(或更低版本的实例),并设置适当的身份验证。 点击 [下一步]. [注意. 必须运行 Server Agent 服务]

  5. “选择传输方法”: 对于本示例,请选择“使用 SQL Management Object 方法”,然后点击 [下一步]。

  6. 选择要移动或复制的数据库,然后点击 [下一步]。

  7. 配置目标数据库路径和逻辑名称等。选择数据库存在时所需的选项。 点击 [下一步]。

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

  9. 对于本示例,请为“计划包”选项中的“立即运行”选项进行选择。 点击 [下一步]。

  10. “完成向导”,点击 [完成] 执行包并创建“降级”的数据库。

你完成了,愉快的一天 :]


我发现的另一种方法是由微软创建的 SQL 数据库迁移向导,我认为(我不确定)上面的向导就是由它创建的。可以在此处获取 http://sqlazuremw.codeplex.com/。要使用此程序包将数据库从 SQL Server 2012 迁移到 2008 R2,您可以执行以下步骤:

注意:微软已经从 Codeplex 中删除了 SQLAzureMW。我个人将其提供在这里

  1. 运行 SQLAzureMW.exe。

  2. 从主窗口右侧选择分析/迁移单选按钮。

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

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

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

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

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

a. 在“常规”下,将“目标服务器”设置为“SQL Server”。

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

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

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

  2. 你将会看到提示“准备生成脚本?”,点击[是]。这会开始生成脚本。完成后,点击[下一步]。

  3. 现在你会看到另一个连接对话框。这次选中目标服务器上的数据库(SQL Server 2008 R2实例)。选择Master数据库以便你可以选择目标数据库。点击[连接]。

  4. 现在,你可能想要迁移到一个新的数据库,所以点击[创建数据库]。

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

  6. 现在会提示你“在目标服务器上执行脚本?”,点击[是]。

  7. 这将会做许多工作,使用生成的脚本设置模式,但不像之前我们发现的方法,数据是使用BCP进行大容量加载的,速度非常快。所有这些都是在内部完成的,因此不会生成大量的.sql脚本文件等。

  8. 点击[退出]。

  9. 完成了。现在如果你打开管理工具并连接到我们刚刚使用过的SQL Server 2012和2008 R2实例,你会发现2012源数据库的模式与刚刚创建的目标数据库相匹配。


    以上两个过程几乎相同且提供了相同的功能。除非你明确需要迁移到Azure或方法1对你不起作用,否则我不会执行后者。

    希望对某些人有所帮助。


1
我没有给你点踩,但可能是因为这个解决方案不起作用。它只是看起来像在工作。如果你仔细查看目标数据库,你会发现它没有复制主键和索引。嗯...它复制了数据,但由于某种原因没有正确地标记它们。 - bolilloBorracho
1
不,这个程序可以正确地复制键和所有内容。我不确定你做了什么,但是上面的代码对我来说完全正常。接受的答案声称无法完成此操作是错误的... - MoonKnight
1
好的,感谢你坚持自己的立场,Killer。我尝试了第二种方法,它非常有效,而且速度惊人地快。所以谢谢你,确实帮了我很大的忙。(我也再次尝试了第一种方法,并仍然认为它不会复制主键和索引)。 - bolilloBorracho
1
方法1需要目标服务器上运行SQL Server代理,所以在这种情况下对我无效。然而,方法2对我非常有效。谢谢! - Don Jewett
1
方法1让我进行了一个多小时的调整,最终尝试了方法2,在几分钟内就解决了问题。非常感谢这个精彩的解决方案。如果有人想知道,我从2012年转到了2005年。 - Taylor Brown
显示剩余10条评论

12

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

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

现在点击下一步-> 点击高级选项,并选择“Script for Server Version”到您想要还原的ssms版本,如2008或2008 R2或其他版本。

同时,将“要脚本化的数据类型”选为“架构和数据”。

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

如果数据库不存在,则创建一个。 如果在执行脚本时出现错误,请从alter关键字开始执行脚本,一直执行到底部。


10

致: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])

对我有用。


9

您无法将SQL Server的高版本还原为低版本。您唯一的选择是通过SSIS、BCP、链接服务器或脚本化数据,将数据库脚本化并传输数据。


2

这里有另一个选项,对我很有用:https://dba.stackexchange.com/a/44340

我使用了选项B。这不是我的想法,所以所有的功劳归原作者所有。我在这里也加上它,因为有时候链接不能使用,建议把完整的故事备好。

给大家一个提示:如果有任何模式不兼容的问题,请先解决。然后导入数据就会变得轻松。


选项A:使用Generate script选项以兼容模式脚本输出数据库:

注意:如果你将带有模式和数据的数据库脚本输出,根据你的数据大小,脚本将非常庞大,SSMS、sqlcmd或osql无法处理(可能也达到GB级别)。

enter image description here

选项B

首先,先脚本化所有表,包括所有索引、FK等,并在目标数据库中创建空表——选择只有SCHEMA(没有数据)的选项。

使用BCP插入数据

I. 通过下面的脚本将数据BCP输出。将SSMS设置为文本模式,并复制下面脚本生成的输出到一个批处理文件中。

-- 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)

二. 运行批处理文件,它将在您指定的文件夹中生成.dat文件。

三. 在目标服务器上再次使用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 方法,因为它使用本地模式。


2
你无法从 2012 恢复到 2008。你可以使用像 red-gate SQL compare 这样的工具来复制模式等内容(前提是没有使用任何 2012 特定的内容)。如果你还需要复制数据,可以使用他们的 Data Compare 工具,我想你可以获得14天的免费试用。

1

降级 SQL Server 数据库的唯一内置方法是比较困难的:将整个数据库、模式和数据脚本化,然后在目标服务器上执行脚本。

虽然可行,但往往比较繁琐。


在这种情况下,需要注意新数据类型可能被使用,需要将其转换为旧的数据类型 - 在模式创建和数据迁移的脚本中都需要进行转换... - Sandr

0

正如已经提到的,您不能使用“备份”和“还原”功能从SQL Server 2012数据库转移到SQL Server 2008数据库。我编写的一个程序,SQL Server Scripter,可以连接到SQL Server数据库并脚本化数据库、其模式和数据。它可以从BitBucket进行git克隆,并使用Visual Studio 2010或更高版本进行编译(如果是较新版本,请打开.csproj文件)。


0

合并复制。您可以从发布服务器(2008)创建订阅服务器(2008)。在数据库完全同步之后,删除订阅和发布。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接