萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server 2000 附加 2005 資料庫報錯 602 解決方案:版本不相容與正確遷移流程

錯誤現象

錯誤 602:未能在 sysindexes 中找到資料庫 ID 7 中物件 ID 1 的索引 ID 1 對應的行。請對 sysindexes 執行 DBCC CHECKTABLE。

根本原因

SQL Server 2000 無法附加/還原 SQL Server 2005 (或更新版本) 的資料庫檔案 (`.mdf`/`.ldf`)。 資料庫內部結構版本號 (Database Version) 不相容:SQL 2000 = 539, SQL 2005 = 611, SQL 2008 = 655。附加時引擎嘗試讀取系統表 `sysindexes` 卻發現結構不符,拋出 602 錯誤。

正確遷移流程:腳本 + 資料同步 (唯一可行路徑)

階段 1:在 SQL 2005 產生 2000 相容腳本

  1. SSMS 連線 2005 → 右鍵資料庫 → 工作 → 產生指令碼。
  2. 關鍵設定:
    • 「為伺服器版本編寫指令碼」 → **SQL Server 2000**
    • **「為所選資料庫中的所有物件編寫指令碼」 → 勾選 (True)** ← *這是避免手工修正的關鍵*
    • 其他選項:依需求勾選「索引」、「觸發器」、「擴充屬性」等。
  3. 輸出單一 `.sql` 檔案。

階段 2:在 SQL 2000 建立空資料庫結構

  1. 使用查詢分析器 或 SSMS 連線 SQL 2000。
  2. 開啟並執行階段 1 產生的 `.sql` 腳本,建立資料表、索引、預存程序、檢視等結構。

階段 3:資料遷移 (三選一)

工具適用場景指令範例
DTS 匯入/匯出精靈中小型資料、異構來源、需轉換SSMS 2005 → 右鍵 DB → 工作 → 匯出資料 → 目的地選 SQL 2000 連線
BCP 大量複製大量資料 (億列)、最高效能匯出: `bcp DB.dbo.Table OUT data.bcp -N -T -S SrcIP`
匯入: `bcp DB.dbo.Table IN data.bcp -N -T -S DestIP -b 10000 -h "TABLOCK"`
連結伺服器少數資料表、一次性同步`INSERT INTO [Linked2000].DB.dbo.Table SELECT * FROM Table;`

常見誤區

  • ❌ 直接複製 `.mdf/.ldf` 檔案到 2000 資料目錄 → `sp_attach_db` → **必失敗 (錯誤 602/948/1813)**。
  • ❌ 2005 備份 `.bak` 在 2000 `RESTORE` → **不支援向下還原**。
  • ❌ 嘗試 `DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS` 修復附加後的資料庫 → **系統表結構根本不相容,無法修復**。

專家建議 (鄒建)

「直接 RESTORE 或附加應該是不行的,用腳本 + 導數據肯定沒有問題。」

驗證遷移完整性

-- 比對資料列數
SELECT 'Source', COUNT(*) FROM SourceDB.dbo.BigTable
UNION ALL
SELECT 'Target', COUNT(*) FROM TargetDB.dbo.BigTable;

-- 比對檢查和 (需相容型別)
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM SourceDB.dbo.Table;
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM TargetDB.dbo.Table;
copyright © 萬盛學電腦網 all rights reserved