将数据库从SQL Server 2012移动到2008


29

我有一个要复制到2008服务器的SQL Sever 2012实例上的数据库。2008服务器无法还原由2012服务器创建的备份(我已经尝试过)。

我在2012年找不到任何选项来创建2008年兼容的备份。我想念什么吗?

有没有简单的方法可以将架构和数据导出为与版本无关的格式,然后将其导入到2008中?

该数据库不使用任何2012年特定功能。它包含表,数据和存储过程。

到目前为止,这是我尝试过的

我在2012服务器上尝试了TasksGenerate Scripts,然后能够将架构(包括存储过程)生成为SQL脚本。但是,这不包括任何数据。

在2008年的计算机上创建该架构后,我能够在2012年的计算机上打开“导出数据”向导,在将2012年配置为源计算机并将2008年配置为目标计算机之后,向我展示了一个表列表,可以复制。我选择了所有表格(超过300个),然后单击向导。不幸的是,它花了很多时间来生成脚本,然后失败,并显示诸如“无法将其插入只读列'FOO_ID'”之类的错误。

我还尝试了“复制数据库向导”,该向导声称能够“从2000或更高版本复制到2005或更高版本”。它有两种模式:

  1. “分离并附加”,失败并显示错误:

    Message: Index was outside the bounds of the array.
    StackTrace:    at Microsoft.SqlServer.Management.Smo.PropertyBag.SetValue(Int32 index, Object value)
    ...
    at Microsoft.SqlServer.Management.Smo.DataFile.get_FileName()
    
  2. SQL管理对象方法因错误而失败

    无法读取属性IsFileStream。此属性在SQL Server 7.0上不可用。”


您可以直接出口吗?我不知道您的数据库有多大,但这是我在处理较小数据库时要做的。
戴夫

2
没有较旧版本的SQL Server可以从较新版本还原备份。这是设计使然。使用导出功能,脚本出来的表和数据,和脚本目标设置为SQL 2008

4
“试图弄清楚为什么任何有头脑的人都会向后迁移。” -我有一个运行2012的生产服务器,但是我的dev机器只有2008。我想在本地复制数据库以帮助开发,但是我不想在我的dev机器上安装2012剩下那么多可用空间,并且不想花费数小时来安装它。(所以我花了很多时间试图向后迁移。。。。。。但是那只是我。)
Rich

1
你快到了 您进入的“导出”部分具有一个选项,可以包含数据以及架构。

1
只是想为Ramhound添加:我在开发环境中将一个SQL 2008 R2升级到SQL 2012,然后,在升级实例中更改了许多架构和数据后,意识到VS 2010无法将架构或数据与SQL 2012进行比较。 VS 2010和VS 2012的SSDT可以将架构与SQL 2012进行比较,但与原始VS 2010数据库项目不兼容,并且不能比较数据。长话短说,我宁愿回到SQL 2008 R2并等到公司做出明智的决定以继续前进到2012年。但是我想保存新的架构/数据。AFAIK我的想法正确。
GFK 2012年

Answers:


40

右键单击2012 SQL Management Studio中的数据库,然后选择“任务->生成脚本”。单击过去的欢迎屏幕,选择“脚本整个数据库和所有数据库对象”。在“指定如何保​​存脚本”页面上,单击“高级”。在弹出的属性页面的“常规”下,将“要脚本的数据类型”从“仅模式”更改为“模式和数据”,并将“服务器版本的脚本”从“ 2012”更改为“ 2008”。

然后,我不得不找到某种方法来编辑此庞大的SQL文件的开头,以调整如何创建数据库-参见以下q:https : //stackoverflow.com/questions/102829/best-free-text-editor支持4GB以上的文件

最后,我不得不找到一种方法来运行SQL脚本,该方法太大了,无法在SQL Management Studio中打开-请参阅以下q:https : //stackoverflow.com/questions/431913/how-do-you-run-一个300mb-ms-sql-sql-file


您在文件开头做了哪些调整?
JonoRR 2013年

1
我记不清了,对不起。我认为,应用特定的东西。也许数据库名称或类似的名称。我想如果它与有相同问题的人相关,我会在这里添加它。
2013年

3
@JonoRR您很可能希望编辑CREATE DATABASE语句并将数据文件路径设置为目标服务器上有意义的任何路径。
Igby Largeman 2014年

12

对于SQL迁移,请使用免费的开源SQL数据库迁移向导。

我有一个5GB的数据库,其中有大约1000万条记录,并尝试通过Generate Script进行路由,然后使用sqlcmd.exe运行它。首先,生成的脚本并非总是正常工作。其次,sqlcmd.exe也可能在大型文件上失败,抱怨可用内存。osql.exe可以运行,但是会花费一些时间(并且具有相同的命令行参数)。

然后,我遇到了一个很棒的工具,可以将SQL Server迁移到SQL Azure数据库。这也适用于SQL Server到SQL Server,例如,如果您要将SQL 2012数据库迁移到2008 R2。它使用bcp.exe,后者使用批量复制。有一个GUI和命令行(批处理)版本可用,并且它是开源的。请参阅http://sqlazuremw.codeplex.com/。就我而言,手术花费了16分钟。

在高级屏幕中,可以选择目标为SQL Server,而不是SQL Azure。


1
在此向导中,您在哪里设置2008 R2?
JonoRR

很棒的提示,我已经将数据库从Express 2012恢复到Web2008。非常简单。
rkawano

可以确认它是否如广告中所述。做了一个2014-> 2012跨域本地SQL服务器。这么长时间以来,该工具如何避免我的搜索!甚至在非天蓝色使用时也很棒。
Gomibushi

3

我是SQL的新手,但我设法从2012年迁移到2008年。为此,我使用了SQL导入和导出实用程序。我选择了SQL 2012服务器和要迁移的数据库,最后选择了2008服务器,并创建了一个新数据库作为目标数据库。有效。


2

试用APEXSQL工具。他们有一个工具,可以对数据库进行脚本编写,也可以对数据进行脚本编写。


“ 299美元起”-是否有其他免费选择?
2012年

1

在2008年的计算机上创建该架构后,我能够在2012年的计算机上打开“导出数据”向导,在将2012年配置为源计算机并将2008年配置为目标计算机之后,向我展示了一个表列表,可以复制。我选择了所有表格(超过300个),然后单击向导。不幸的是,它花了很多时间来生成脚本,然后失败,并显示诸如“无法将其插入只读列'FOO_ID'”之类的错误。

问题在于它无法插入ID列,因此:

  1. 勾选所有表格
  2. 选择所有表(方法是单击第一个并按住shift键并单击最后一个表)
  3. 点击“编辑映射”-您可以在下一按钮上方和预览旁边看到它。
  4. 您将得到一个窗口,在“启用身份插入”上打钩,然后单击下一步继续,这应该可以进行。它为我工作。

1

我在上面遵循了Rich的解决方案https://superuser.com/a/469597/312310,效果很好!谢谢-我不能在这里投票!

为了使此功能生效,我必须要做的额外步骤是:

  • 更改逻辑文件名,并确保路径正确。我还必须更改生成的日志名称,否则它将尝试使用日志覆盖mdf文件,然后抛出此错误https://stackoverflow.com/questions/7534664/sql-server-script-error-database-is-已在使用中

    在主数据库上创建数据库[xxxxx](NAME = xxxxx',FILENAME = N'C:\ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ DATA \ xxxxx.mdf',SIZE = 14400KB,MAXSIZE = UNLIMITED,FILEGROWTH = 1024KB)登录(名称= N'xxxxxldf ',文件名= N'C:\ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ DATA \ xxxxx_log.ldf',SIZE = 18560KB,MAXSIZE = 2048GB,FILEGROWTH = 10 %) 走

  • 我必须注释掉生成的部分,然后手动添加用户权限

    USE [xxxxx]
    GO
    /****** Object:  User [xxxxx]    Script Date: 30/11/2014 12:44:07 ******/
    CREATE USER [xxxxx] FOR LOGIN [xxxxx] WITH DEFAULT_SCHEMA=[dbo]
    GO
    sys.sp_addrolemember @rolename = N'db_owner', @membername = N'Umbraco'
    GO
    sys.sp_addrolemember @rolename = N'db_datareader', @membername = N'Umbraco'
    GO
    sys.sp_addrolemember @rolename = N'db_datawriter', @membername = N'Umbraco'
    GO
    

重新启动它,瞧瞧,我现在可以将新的Umbraco 7.1.2数据库还原到仅具有SQL Server 2008 R2的Web服务器中!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.