如何将数据库从 SQL Server 2012 移动到 SQL Server 2005

Gre*_*icz 34 sql-server migration downgrade

如果我需要将数据库从 SQL Server 2012(32 位)移动到 SQL Server 2005(64 位),我有哪些选择?

我知道我不能:

  • 在 SQL Server 2005 上还原数据库的备份
  • 分离和附加

我知道我可以:

  • 使用导入数据向导,我在一个数据库上尝试过,但它只移动数据,即使那样也很麻烦,因为我需要做很多工作来创建临时表来维护标识列,重新创建所有 FK、索引等。

有没有更简单的选择?

Kin*_*hah 44

您可以按照以下任何方法进行操作:

注意:如果您正在使用任何新功能,如新数据类型等,那么您必须进行测试,因为它会引发错误。

方法一:使用原生工具

  1. 编写数据库 SCHEMA_ONLY 的脚本并在目标服务器上重新创建一个空数据库。以下是屏幕截图:

    在此处输入图片说明

    在此处输入图片说明

    在此处输入图片说明

  2. 使用 BCP OUT 和 BULK INSERT 插入数据。

下面是帮助您完成第 2 部分的脚本。

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another*********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
*************************************************************************************************************************************************/

-- 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_OUT\*.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_OUT\'                                           -- 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) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- 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 = 'destination_database_Name'               -- 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_OUT\'                             -- 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) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)
Run Code Online (Sandbox Code Playgroud)

方法二:使用第三方工具

在目标服务器上创建一个空白数据库。使用 Redgate 的模式比较和数据比较来创建数据并将数据加载到目标服务器中。

注意:我使用了 Redgate 的模式和数据比较,它们是此类任务的最佳工具,因此如果您使用的是 3rd 方工具,那么我的建议是 Redgate。

  • +1 但请记住,有些事情在目的地是行不通的(我不确定第 3 方工具将如何处理所有这些)。诸如 SEQUENCE 之类的对象,诸如 OFFSET / FETCH、LAG / LEAD 之类的代码。 (7认同)

Eit*_*min 7

除了这里已经建议的方法之外,您还可以尝试创建一个 BACPAC 文件并将其导入您的目的地。这类似于 Microsoft 建议将数据库从本地迁移到 Azure 云数据库的方式。

它的好处是它是导出模式和数据的组合,并且不依赖于数据库版本,因此理论上您可以将数据库从任何版本导入到任何版本。

它的缺点是,在源头生成 BACPAC 文件之前,它会运行某种严格的验证过程,如果您引用了数据库外的对象(无论是用户数据库还是系统数据库),或者如果您有加密对象。但是如果你很幸运并且它没有失败,那么它可以是一个相当简单的解决方案。

您只需要较新的 SSMS 版本之一(17 或 18):https : //docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

要开始创建 BACPAC 文件,请右键单击数据库并选择“导出数据层应用程序...”(请务必不要与“提取数据层应用程序...”混淆,后者有所不同):

导出数据层应用程序...

您将看到一个简单的向导来指导您完成这些步骤。完成后,您可以在目标服务器中使用“Import Data-tier Application...”,您可以通过右键单击“Databases”节点来查看(同样,不要与“Deploy Data -层应用程序...”):

导入数据层应用程序...

这也将向您展示一个简单的向导来指导您完成这些步骤。