| 來源版本 | 目標版本 | 遷移方式 | 關鍵限制 |
|---|---|---|---|
| SQL 7.0 / 2000 / 2005 / 2008 | 較新版本 (2008 R2 ~ 2022) | 備份/還原、分離/附加、就地升級 | 僅支援向前相容,不可降級 |
| SQL 6.5 / 7.0 之前 | 任何較新版本 | 資料移轉 (BCP/SSIS/複寫/連結伺服器) | 無法直接備份還原,需中介步驟 |
SQL Server 7.0 重寫了儲存引擎與檔案結構。7.0 之前的版本(4.2、6.0、6.5)資料庫檔案結構完全不同,**無法直接附加或還原** 至 7.0+ 版本。必須透過資料層面移轉。
-- 來源端
BACKUP DATABASE MyDB TO DISK = 'D:\Backup\MyDB.bak' WITH COMPRESSION, CHECKSUM;
-- 目標端
RESTORE DATABASE MyDB
FROM DISK = 'D:\Backup\MyDB.bak'
WITH MOVE 'MyDB_Data' TO 'D:\Data\MyDB.mdf',
MOVE 'MyDB_Log' TO 'L:\Log\MyDB.ldf',
REPLACE, STATS = 5;
-- 來源端
EXEC sp_detach_db 'MyDB';
-- 複製 .mdf/.ldf 至目標伺服器
-- 目標端
CREATE DATABASE MyDB
ON (FILENAME = 'D:\Data\MyDB.mdf'),
(FILENAME = 'L:\Log\MyDB.ldf')
FOR ATTACH;
系統資料庫不可跨版本直接還原/附加(master、model、msdb、tempdb、distribution)。原因:
sp_help_revlogin 產生建立登入腳本(含 SID、密碼雜湊) → 目標端執行EXEC sp_updatestats 或 UPDATE STATISTICS 全庫ALTER INDEX ALL ON ... REBUILDALTER DATABASE MyDB SET COMPATIBILITY_LEVEL = 150 (對應目標版本)ALTER DATABASE MyDB SET QUERY_STORE = ON| 陷阱 | 症狀 | 對策 |
|---|---|---|
| 孤立使用者 | 資料庫使用者無對應伺服器登入 | 遷移前執行 sp_help_revlogin,遷移後 ALTER USER ... WITH LOGIN |
| 相容性等級過低 | 新版優化器特性未啟用(批次模式、自適性連接等) | 遷移後立即升級相容性等級,並回歸測試 |
| 追蹤旗標遺失 | 舊版依賴的 TF (如 1118、2371) 未帶入 | 整理啟動參數清單,逐一驗證新版預設行為是否已內建 |
| 加密/金鑰遺失 | TDE、備份加密、EKM 金鑰無法存取 | 遷移前備份憑證/金鑰 (BACKUP CERTIFICATE),目標端還原 |
| 全文檢索目錄損壞 | 全文索引查詢失敗 | 遷移後重建全文目錄 |
SQL Server 跨版本遷移的核心鐵律:**向前相容、系統庫不遷、資料層面移、遷後必重整**。對於 7.0+ 版本間,優先選擇備份/還原或分離/附加;對於 6.5 以前版本,必須規劃完整 ETL 移轉專案。建立標準化遷移手冊、演練腳本、驗收清單,是確保零驚喜遷移的關鍵。