資料庫因斷電、硬體故障或異常中斷,常導致頁面損壞、索引不一致,症狀表現為查詢緩慢、資料查不到或報錯。SQL Server 雖無 Access 式的「修復資料庫」按鈕,但透過 DBCC CHECKDB 與 DBCC CHECKTABLE 搭配 REPAIR_REBUILD 選項,即可完成結構修復與索引重建。操作前務必斷開所有使用者連線,並切換至單一使用者模式。
-- 1. 切換至 master 資料庫
USE MASTER; GO
-- 2. 設定資料庫為單一使用者模式 (強制斷開現有連線)
EXEC sp_dboption '您的資料庫名', 'single user', 'true'; GO
-- 3. 執行資料庫層級結構檢查與修復 (重建索引、修復頁面)
DBCC CHECKDB('您的資料庫名', REPAIR_REBUILD); GO
-- 4. 切換回目標資料庫
USE 您的資料庫名; GO
-- 5. 逐一檢查並修復每個資料表 (含索引重建)
EXEC sp_msforeachtable 'DBCC CHECKTABLE(''?'', REPAIR_REBUILD)'; GO
-- 6. 恢復多使用者模式
EXEC sp_dboption '您的資料庫名', 'single user', 'false'; GO
| 指令 | 作用 | 注意事項 |
|---|---|---|
sp_dboption 'single user' | 限制資料庫同一時間僅允許一條連線 | 執行期間所有其他連線將被強制中斷,請在維護時段操作 |
DBCC CHECKDB ... REPAIR_REBUILD | 檢查配置、邏輯一致性,並執行無資料遺失風險的修復 (重建索引、修復頁面鏈結) | 不包含 REPAIR_ALLOW_DATA_LOSS,相對安全;嚴重損壞可能仍無法修復 |
sp_msforeachtable 'DBCC CHECKTABLE...' | 針對每個使用者資料表執行表級檢查與修復 | 補強 CHECKDB 可能遺漏的表級索引碎片與統計資訊 |
BACKUP DATABASE)。DBCC CHECKDB('DB') WITH NO_INFOMSGS, ALL_ERRORMSGS 僅檢查不修復,根據錯誤訊息判斷是否需升級至 REPAIR_ALLOW_DATA_LOSS(將遺失資料)。DBCC CHECKDB、索引重組/重建、統計更新納入「資料庫維護計畫」排程自動執行,預防勝於治療。掌握這套「單一使用者 → CHECKDB → CHECKTABLE → 恢復多用戶」標準流程,是 DBA 面對資料庫損壞時的必殺技。