Sql-Server

如何將數據庫從 SQL Server 2012 移動到 SQL Server 2005

  • May 26, 2019

如果我需要將數據庫從 SQL Server 2012(32 位)移動到 SQL Server 2005(64 位),我有哪些選擇?

我知道我不能:

  • 在 SQL Server 2005 上恢復數據庫的備份
  • 分離和附加

我知道我可以:

  • 使用導入數據嚮導,我在一個數據庫上嘗試過,但它只移動數據,即使這樣也很麻煩,因為我需要做很多工作來創建臨時表來維護標識列,重新創建所有 FK、索引等。

有更簡單的選擇嗎?

您可以按照以下任何方法:

注意:如果您正在使用任何新功能,例如新數據類型等,那麼您必須進行測試,因為它會引發錯誤。

方法一:使用原生工具

  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)

方法二:使用第三方工具

在目標伺服器上創建一個空白數據庫。使用 Redgate 的模式比較和數據比較來創建數據並將其載入到目標伺服器中。

注意:我使用了 Redgate 的模式和數據比較,它們是此類任務的最佳工具,因此如果您使用 3rd 方工具,那麼我的建議是 Redgate。

除了這裡已經建議的方法之外,您還可以嘗試創建一個 BACPAC 文件並將其導入您的目標。這類似於 Microsoft 建議將數據庫從本地遷移到 Azure 雲數據庫的方式。

它的好處是它是導出模式和數據的組合,並且它不依賴於數據庫版本,因此您理論上可以從任何版本導入數據庫到任何版本。

它的缺點是,在它從源頭生成 BACPAC 文件之前,它會執行某種嚴格的驗證過程,如果您引用了數據庫之外的對象(無論是使用者數據庫還是系統數據庫),或者如果您有加密對象。但是如果你很幸運並且它沒有失敗,那麼它可能是一個相當簡單的解決方案。

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

要開始創建 BACPAC 文件,請右鍵點擊數據庫並選擇“Export Data-tier Application…”(請確保不要與“Extract Data-tier Application…”混淆,這是不同的):

導出數據層應用程序…

您將看到一個簡單的嚮導來指導您完成這些步驟。完成後,您可以在目標伺服器中使用“導入數據層應用程序…”,您可以通過右鍵點擊“數據庫”節點來查看(同樣,不要與“部署數據”混淆-層應用程序…”):

導入數據層應用程序…

這也將向您展示一個簡單的嚮導來指導您完成這些步驟。

引用自:https://dba.stackexchange.com/questions/55055