將相容等級為 90 (SQL 2005) 的資料庫附加至 SQL Server 2012,未修改相容等級,僅執行收縮記錄檔操作。嘗試將該資料庫脫離後再附加回 SQL Server 2005,報錯失敗。備份/還原、重建記錄檔均無效。
透過 DBCC PAGE(db, 1, 0, 3) 檢視資料庫第 0 頁(檔案頭),對比附加至 2005 與 2012 前後的十六進位內容,發現附加至 2012 後,檔案頭新增了大量欄位,例如:
SectorSizeFileIdGuidRestoreStatus, RestoreRedoStartLsn, RestoreSourceGuidHardenedSkipLsn, ReplTxfTruncationLsn, TxfBackupLsnMaxLsnBranchId, SecondaryRedoStartLsn 等這些欄位是 SQL Server 2012 新增的檔案頭結構,舊版引擎無法識別,導致附加失敗。
使用 Beyond Compare 對比兩版檔案頭文字輸出,紅色標記處全為 2012 新增欄位。即使相容等級仍為 90,物理儲存結構已不可逆升級。
SQL Server 引擎在附加/啟動資料庫時,會自動將檔案頭升級至當前引擎版本支援的最新結構。此過程無視相容等級設定,屬於引擎內部行為。
| 方案 | 適用場景 | 操作步驟 |
|---|---|---|
| 腳本遷移 | 架構+資料全遷移 | SSMS「產生指令碼」→ 選擇目標版本 2005 → 執行建立物件與插入資料腳本 |
| BCP/SSIS 匯出入 | 大量資料高效遷移 | 來源 2012 匯出 .dat/.csv → 目標 2005 批次匯入 |
| 異構複寫 | 持續同步需求 | 設定 2012 為發行者,2005 為訂閱者 |
| 第三方工具 | 一次性快速遷移 | Redgate SQL Compare / Data Compare 指定目標版本部署 |
READ_ONLY 或建立資料庫快照。資料庫版本降級本質上是物理儲存格式的不相容。理解檔案頭升級機制,選擇邏輯層面的遷移手段,才是跨版本部署的正確路徑。