有没有一种方法可以将SQL Server 2012数据库备份还原到SQL Server 2008?
我试图附加文件,但无法正常工作。
有没有一种方法可以将SQL Server 2012数据库备份还原到SQL Server 2008?
我试图附加文件,但无法正常工作。
Answers:
您有几种选择:
选项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 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)
运行bat文件,它将在您指定的文件夹中生成.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)
使用SSMS运行输出以将数据重新插入表中。
这是非常快速的bcp方法,因为它使用纯模式。
Some SSIDs and linked servers didn't go across properly
。链接的服务器必须手动编写脚本。可以使用sp_helprevlogin传送SSID。SQLAgent作业,ssis软件包等应根据您的需要进行移动。此方法的目的是在降级或合并2个数据库时尽快获取数据。
没有支持的方法来执行此操作,因为SQL Server不允许这种兼容性。
你能做的就是
在SQL 2012上还原数据库
生成对象和数据的脚本
如果没有SQL Server 2012,则可以使用第三方工具读取备份并提取数据和结构。
在这种情况下,只需在SQL 2008上创建空数据库,然后使用ApexSQL Diff和ApexSQL Data Diff之类的工具即可同步对象和数据。您也可以从其他主要供应商(例如Red-Gate或Idera)中找到这些产品。