將備份數據從新版本的 MS SQL Server 傳輸到舊版本

有一次,為了重現一個錯誤,我需要備份生產數據庫。

令我驚訝的是,我遇到了以下限制:

  1. 數據庫備份是在版本上進行的 SQL Server 2016的 並且與我的不兼容 SQL Server 2014的.
  2. 在我的工作計算機上,使用的操作系統是 窗戶7所以我無法更新 SQL服務器 直到 2016 版
  3. 受支持的產品是具有緊密耦合的遺留架構的更大系統的一部分,並且還與其他產品和基地對話,因此可能需要很長時間才能將其部署到另一個站點。

鑑於上述情況,我得出結論,非標準解決方案的時機已經成熟。

從備份恢復數據

我選擇使用虛擬機 Oracle VM VirtualBox的 使用 Windows 10(您可以為 Edge 瀏覽器拍攝測試圖像 ). SQL Server 2016安裝在虛擬機上,應用數據庫從備份中恢復(指令).

在虛擬機上配置對 SQL Server 的訪問

接下來,需要採取一些步驟才能從外部訪問 SQL Server:

  1. 對於防火牆,添加一個規則來跳過端口請求 1433.
  2. 希望對服務器的訪問不通過 Windows 身份驗證,而是通過使用登錄名和密碼的 SQL(設置訪問更容易)。 但是,在這種情況下,您需要記住在 SQL Server 屬性中啟用 SQL 身份驗證。
  3. 在選項卡上的 SQL Server 用戶設置中 用戶映射 為恢復的數據庫指定用戶角色 數據庫安全管理員.

數據傳輸

實際上,數據傳輸本身包括兩個階段:

  1. 數據模式傳輸(表、視圖、存儲過程等)
  2. 傳輸數據本身

數據模式傳輸

我們執行以下操作:

  1. 選擇 任務 -> 生成腳本 用於便攜式底座。
  2. 選擇您需要傳輸的對像或保留默認值(在這種情況下,將為所有數據庫對象創建腳本)。
  3. 指定保存腳本的設置。 將腳本保存在單個 Unicode 文件中最為方便。 然後,如果失敗,則無需再次重複所有步驟。

一旦腳本被保存,它就可以在原來的SQL Server(舊版本)上運行以創建所需的基礎。

警告: 執行腳本後,需要檢查備份的數據庫設置與腳本創建的數據庫的對應關係。 在我的例子中,腳本中沒有 COLLATE 設置,這導致在傳輸數據和使用手鼓跳舞以使用補充腳本重新創建數據庫時失敗。

數據傳輸

在傳輸數據之前,您必須禁用對數據庫的所有限制的檢查:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

使用數據導入嚮導進行數據傳輸 任務 -> 導入數據 在 SQL Server 上,腳本創建的數據庫所在的位置:

  1. 指定與源的連接設置(虛擬機上的 SQL Server 2016)。 我使用數據源 SQL Server 本機客戶端 和前面提到的 SQL 身份驗證。
  2. 指定目標的連接設置(主機上的 SQL Server 2014)。
  3. 接下來,設置映射。 必須全選 不是只讀的 對象(例如,不需要選擇視圖)。 作為附加選項,選擇 “允許插入標識列”如果這樣使用。
    警告: 如果,在嘗試選擇多個表並設置它們的屬性時 “允許插入標識列” 已經為至少一個選定的表設置了屬性,對話框將指示已經為所有選定的表設置了屬性。 這一事實可能會造成混淆並導致遷移錯誤。
  4. 我們開始轉移。
  5. 恢復約束檢查:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

如果出現任何錯誤,我們會檢查設置,刪除錯誤創建的數據庫,從腳本中重新創建它,進行更正並重複數據傳輸。

結論

此任務非常罕見,僅由於上述限製而發生。 最常見的解決方案是升級 SQL Server 或在應用程序體系結構允許的情況下連接到遠程服務器。 然而,沒有人能倖免於遺留代碼和低質量開發的歪手。 我希望您不需要此說明,但如果您仍然需要它,它將幫助您節省大量時間和精力。 感謝您的關注!

使用的來源列表

來源: www.habr.com