[Azure][SQL]Azure SQL Database 匯出的資料庫無法在 SQL Server 2014/2012 匯入 ?

Azure SQL Database 只能讓我們使用匯出的方式取得資料庫,但隨著 Azure 資料庫自動升級之後,原本在地端可以正常匯入的都失敗了,那我們該怎麼在地端的資料庫來進行匯入呢 ?

由於在雲端的 Azure SQL Database 並沒有提供備份的功能,因此如果需要把 Azure SQL Database 的資料拿到地端的 SQL Server 上來使用,那麼大部分的時候,我們會採用 Azure Portal 上的匯出功能,將資料庫匯出到 Azure BLOB Storage 上,然後用相關工具抓下來之後,在使用 SSMS 匯入到資料庫內。

 

原本覺得這應該是沒有甚麼問題,剛好有個社群的朋友傳個訊息來詢問我,表示他的 Azure SQL Database 沒有辦法正常匯入到 SQL Server 2014 上,詢問是否有相關的解決辦法。為了確認他的問題,我將他的匯出檔案拿來測試看看,果然在 SQL Server 2014 SSMS 上,真的就如同她所說的發生錯誤,而同樣資料庫在之前的匯出檔案,就可以正常匯入的。

其實要解決這個問題不難,我們先來看一下到底透過匯出的檔案裏面是甚麼 ? 基本上匯出的 BACPAC 的檔案,就是一個同時包含資料結構定義的設定檔與資料的 BCP 檔案之壓縮檔案,因此我們可以試試看將 Azure 所匯出的檔案,將原本的副檔名 .bacpac 改成 .bacpac.zip,這樣我們就可以用檔案總管直接開啟檔案,來看看裡面有些甚麼了。從下圖中可以看出來,你可以看到有個 model.xml 的檔案,該檔案就是用來描述資料庫內所有物件的定義設定。而  Data 下則是按照每個資料表,來放資料匯出的 BCP 檔案。

因此我們拿目前這個無法匯入之封裝內 model.xml 檔案,跟之前可以正常匯入之封裝內 model.xml 檔案來做比較,下面這個是新的匯出檔案,可以看到他的  SchemaVersion 是 3.5 ,跟我們前面所顯示的錯誤訊息看起來是符合的。

而我們去找出之前的匯出檔案,則可以看到他的  SchemaVersion 是 2.5,因此看起來主要的問題差異應該是在這裡。

既然知道問題了,那接下來就是怎麼來解決了。

方法一:如果要用比較簡單的方式,那就是裝 SQL Server 2016 SSMS 來做匯入,因為 SchemaVersion 3.5 就是  SQL 2016 的格式。

方法二:但如果你嫌麻煩還要多安裝一個管理工具,那麼直接把封裝檔案裏面四個 xml 檔案,直接拿舊的可以匯入的直接取代就可以了,當然前提是你的資料庫 Schema 是不能有變更的。

方法三:直接利用 SQL Server 2014 SSMS 來做匯出 BACPAC 的檔案,這樣當然就可以直接在 SQL Server 2014 上面做匯入囉,畢竟格式都是一樣的。