SQL Server 2012向后兼容2008年备份


14

我有许多使用SQL Server 2008的客户端,这也是我在服务器上所拥有的。我使用备份文件在客户端之间以及在我的办公室之间来回发送数据库。

我已经读到,当您从SQL Server 2012创建备份时,无法将其还原到2008实例上。我认为兼容性级别可以解决此问题,但事实并非如此。因此,我对如何升级一无所知。除了一次升级所有我的客户(这是不可能的)之外,我可以想到没有干净的方法可以做到这一点。

我需要将数据库发送到客户端以及从客户端接收数据库。这是我在SQL Server上的第一个版本升级,因此我是这个问题的新手。关于如何进行的任何想法?


4
您可以同时使用不同的实例名称在服务器上安装一个SQL Server 2008实例和一个SQL Server 2012实例。也许那会解决您与不同版本的客户之间的问题吗?
Mikael Eriksson 2012年

Answers:


16

这里涉及两件事:文件的版本号和兼容性级别。当您将数据库附加到较新的主版本(例如,从2008到2008R2或从2008R2到2012)时,数据库版本将永久更改,并且您无法将该数据库再次附加到较旧的版本。

兼容性级别用于解析旧版本不推荐使用的T-SQL,该T-SQL在旧版本的SQL Server中工作。它不会改变数据在磁盘上的存储方式。

要将数据库提供给旧版本的SQL Server上的某人,您需要导出数据并将其导入到另一个数据库中。Red Gate的数据比较之类的工具对此很有帮助。


是的,我之前也遇到过同样的问题。最终脚本出整个数据库,然后脚本出所有数据。当天,Red Gate的SQL Compare和Data Compare得以解救。
DForck42 2012年

@ DForck42:就我而言,数据库太大而无法用数据编写脚本,因此我最终用脚本编写了架构,然后使用来移动数据bcp
2014年

@ivan_pozdeev您是说您使用SQL Server 2012 BCP导出,还是使用SQL Server 2008R2 BCP导入?非常高兴知道文件格式是兼容的,谢谢。
克里斯

2
@Chris msdn.microsoft.com/zh-cn/library/ms162802.aspx “在SQL Server 2014中,bcp实用程序支持与SQL Server 2000,SQL Server 2005,SQL Server 2008,SQL Server 2008 R2和Windows Server 2003兼容的本机数据文件。 SQL Server2012。”
ivan_pozdeev

感谢@ivan_posdeev,这是一个启示。我已在下面记录了我的步骤,以防其他人使用。
克里斯(Chris)

6

SQL Server使用兼容性级别设置来确定应如何处理某些新功能。这样,就可以将数据库迁移到较新版本的SQL,而不会导致应用程序出现问题。兼容性级别可以来回更改。

不幸的是,备份文件不向后兼容。一种方法是使用导入/导出将数据从当前数据库移至旧版本实例。


3

对于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。


2

我发现BCP比一些工具更有效,可以将数据获取到早期版本的SQL Server中,以及从RDS中提取数据。(感谢@ivan_posdeev。)

我首先通过右键单击SQL Server Management Studio中的数据库,“任务”,“生成脚本”来生成架构。选中所有对象,在高级对象中确保要编写脚本(统计信息,索引等),如果目标数据库名称不同,则取消选中“ USE database”,设置与目标数据库版本的兼容性,并生成一个创建您的架构的文件。创建你的目的地的数据库,并在其上运行此文件(使用osqlsqlcmd或GUI)。

要移动数据,请在数据库上运行以下查询两次,首先注释第二列以生成提取数据的批处理文件,然后注释第一列以生成要在目标上运行的导入批处理文件。(您需要添加源服务器和目标服务器,实例名称,输出和输入文件目录,用户名和密码。要使用集成安全性,请仅将和选项替换为。)-U-P-T

这支持Unicode,如果不需要的话,-N请将两个语句中的开关都更改为-n

SELECT 
   'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME  + ' out d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
--    'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME  + ' in d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME  + '.ERRORS.dat'
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
ORDER BY 
    s.Name, t.NAME

运行名为schema.tablename.ERRORS.dat的检查文件后,它将包含所有失败的行,如果没有,则为空。

有关BCP的MSDN参考,此处更友好地介绍了BCP选项

我发现它比生成脚本和我尝试过的任何工具都优越得多。它还在RDS数据库(不允许备份)上运行。生成的数据文件仅占SQL脚本大小的30%,运行它们仅需花费一小部分时间,并且可靠性更高。(由SQL Server生成的用于脚本化数据的脚本始终会跳动,有时可以预见,有时却不兼容,所生成的SQL与2008R2不兼容(例如,used nvarchar(0),通常由于没有明显的原因而没有完成,等等。BCP还复制了任何违反约束的行为,例如参照完整性。)。

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.