是否将SQL Server 2012备份还原到SQL Server 2008数据库?


41

有没有一种方法可以将SQL Server 2012数据库备份还原到SQL Server 2008?

我试图附加文件,但无法正常工作。



有等于这个彼此问题,是很好的回答:superuser.com/questions/468578/...
Cavaleiro

1
有一个伟大的工作回答了这个问题,在这里(迁移,而不是备份/恢复):stackoverflow.com/questions/19837886/...
唐·朱厄特

Answers:


30

您有几种选择:

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

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

在此处输入图片说明

选项B:

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

使用BCP插入数据

  1. 使用以下脚本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)
    
  2. 运行bat文件,它将在您指定的文件夹中生成.dat文件。

  3. 再次在文本模式下使用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) 
    
  4. 使用SSMS运行输出以将数据重新插入表中。

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


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

@aucuparia Some SSIDs and linked servers didn't go across properly。链接的服务器必须手动编写脚本。可以使用sp_helprevlogin传送SSID。SQLAgent作业,ssis软件包等应根据您的需要进行移动。此方法的目的是在降级或合并2个数据库时尽快获取数据。
Kin Shah

选项B是唯一对我
有用的

23

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


8

没有支持的方法来执行此操作,因为SQL Server不允许这种兼容性。

你能做的就是

  1. 在SQL 2012上还原数据库

  2. 生成对象和数据的脚本

  3. 从SQL 2012唯一的所有详细信息中清除脚本
  4. 在2008年执行脚本

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

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

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.