[SQL]避開SQL Server資料庫備份檔無法降版使用的繞路做法

因為在工作的時候時常會搭配不同版本的 SQL Server 版本,當把備份檔案給別人時候,有候會遇到版本高的無法給版本低的 SQL Server 來使用,那該如何解決呢 ?

先說結論好了,當如果採用某個版本的 SQL Server 備份檔案,只能在其他比原本備份資料庫的版本高的SQL Server 上來做還原,目前這個限制還是存在的,是無法來避免的。即便你在資料庫的選項中,針對您要備份的資料庫降低「相容性層級」,也沒有辦法來做達到在高版本的備份拿到低版本的 Server 去還原。

假設,今天我的 SQL Server 版本是 2012 ,結果別人給我一個 SQL Server 2014 上所備份出來的資料庫,那麼當我還原該備份檔案的時候,則會出現類似以下的錯誤。

就算強迫使用指令還原也是會有錯誤

可是當我們有需求是需要將資料庫降版來做使用的時候,那該怎麼來做處理呢 ? 在早期的時候,我們通常都會使用資料會的產生指令碼的方式,把資料庫的結構產生出來之後,再把資料會匯入。這樣的方式雖然可以,但這樣做有些時候可能會遺漏了一些像是 Trigger、Index 之類的物件,也不方便在跨 Server 之間的移轉,因此在使用這樣的方式的時候,都要特別的小心。

而在 Azure SQL Database 推出之後,微軟提供另外一個資料匯出格式 BACPAC。BACPAC 主要是用 DACPAC 的資料庫描述檔再加上 BCP 的資料所構成的,如果想要了解甚麼是 DACPAC,可以參考另外一篇「透過 DACPAC 來達到地端和雲端資料庫的版本控管」的說明,這裡就不在重複說明了。

而當上述狀況,如果我有一個 SQL Server 2014 的資料庫要轉到 SQL Server 2012 上的時候,那麼我們可以在 SSMS 上面,透過選擇 資料庫→工作→匯出資料庫應用程式

接個選擇要匯出的目的地檔案名稱,就可以很容易的匯出檔案了。而透過  BACPAC 還有一個好處,就是可以選擇只匯出特定的資料表,如果某些資料表你才要匯出或者是不要匯出的話,那麼可以在匯出設定中的「進階」頁籤內,可以去做資料表的挑選,算是非常實用的功能。

以上述的範例來做,原本的 AdvantureWork2014 的資料庫,當我匯出成為 BACPAC 的格式檔案之後,那就可以回到 SQL Server 2012 的環境上,選擇資料庫→匯入資料層應用程式

這樣就可以順利的將資料庫在 SQL Server 2012 建立出來了。目前 BACPAC 可以支援 SQL 2008 ~ SQL 2016,但有可能會因為 BACPAC 的匯出檔案的格式太新,造成舊版本的 SSMS 不認得而無法匯入的狀況,當如果有這樣的狀況發生時,則可以參考另外一篇「Azure SQL Database 匯出的資料庫無法在 SQL Server 2014/2012 匯入 ?」內所介紹的方式,看是要手動更改 BACPAC 格式檔案的版本號碼,或者是搭配新版本的 SSMS 來做匯入,應該都可以來解決這樣的問題。