如何將數據庫從 SQL Server 2012 移動到 SQL Server 2005
如果我需要將數據庫從 SQL Server 2012(32 位)移動到 SQL Server 2005(64 位),我有哪些選擇?
我知道我不能:
- 在 SQL Server 2005 上恢復數據庫的備份
- 分離和附加
我知道我可以:
- 使用導入數據嚮導,我在一個數據庫上嘗試過,但它只移動數據,即使這樣也很麻煩,因為我需要做很多工作來創建臨時表來維護標識列,重新創建所有 FK、索引等。
有更簡單的選擇嗎?
您可以按照以下任何方法:
注意:如果您正在使用任何新功能,例如新數據類型等,那麼您必須進行測試,因為它會引發錯誤。
方法一:使用原生工具
- 編寫數據庫 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…”混淆,這是不同的):
您將看到一個簡單的嚮導來指導您完成這些步驟。完成後,您可以在目標伺服器中使用“導入數據層應用程序…”,您可以通過右鍵點擊“數據庫”節點來查看(同樣,不要與“部署數據”混淆-層應用程序…”):
這也將向您展示一個簡單的嚮導來指導您完成這些步驟。