有没有办法将SQL Server 2012数据库备份还原到SQL Server 2008?

我尝试附加文件,它不起作用。

评论

签出这些参考文献将对您有所帮助:msdn.microsoft.com/zh-cn/library/ms140052.aspxdba.stackexchange.com/questions/5511/…谢谢

还有一个与此问题相同的问题,并且得到很好的回答:superuser.com/questions/468578/…

对于此问题(迁移,而不是备份/还原),有一个很好的解决方案:stackoverflow.com/questions/19837886/…

#1 楼

您有两个选项:

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

注意:如果您使用模式和数据对数据库进行脚本编写,具体取决于您的数据量很大,该脚本将非常庞大,并且无法由SSMS,sqlcmd或osql处理(也可能以GB为单位)。



选项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 Server0\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文件的bat文件:您已指定。

再次在文本模式下使用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) 


使用SSMS运行输出以插入数据返回表中。

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

评论


非常有帮助-方法B对我有用(方法A生成的SQL为7GB,而SSMS却没有)。某些SSID和链接服务器无法正常使用,但是什么时候第一次与链接服务器有关?不确定我是否会在生产中使用此功能,但是对于使测试环境快速达到95%的情况而言,这是完美的。

–野牛
2014年12月4日上午8:45

@aucuparia某些SSID和链接的服务器未正确传递。链接的服务器必须手动编写脚本。可以使用sp_helprevlogin传送SSID。 SQLAgent作业,ssis软件包等应根据您的需要进行移动。此方法的目的是在降级或合并2个数据库时尽快获取数据。

–金沙(Kin Shah)
2014年12月4日15:12



选项B是唯一对我有用的方法,因为生成的脚本在其他方面过大

–JumpingJezza
18-09-26在8:36

我希望我可以不止一次投票!在我发现这个答案之前,浪费了数小时试图获取数据。非常感谢

–阿夫罗洪·伊斯洛尔(Avrohom Yisroel)
20年1月6日在21:30

#2 楼

不,你不能后退,只能前进。您可以在2008年创建一个空数据库,然后使用Management Studio中的“生成脚本”向导来编写架构和数据的脚本(或Red Gate和其他公司的第三方比较工具)。确保将正确的目标版本设置为2008,并且必须充实2012年可能使用的不兼容的内容(例如OFFSET或FORMAT)。

#3 楼

由于SQL Server不允许这种兼容性,因此没有受支持的方法。

您可以做的是在SQL上


还原数据库。 2012
为对象和数据生成脚本
从SQL 2012的所有详细信息中清除脚本
在2008上执行脚本

如果您没有SQL然后,您可以使用Server 2012使用第三方工具来读取备份并提取数据和结构。

在这种情况下,只需在SQL 2008上创建空数据库,并使用ApexSQL Diff和ApexSQL Data Diff等工具来同步对象和数据。您也可以从其他主要供应商(例如Red-Gate或Idera)中找到这些产品。