主資料庫是 SQL Server 執行個體的「心臟」,儲存著登入帳號、系統配置、所有使用者資料庫的元資料指標。一旦主資料庫損壞,整個 SQL Server 服務將無法啟動。本文提供從災難預案制定、故障診斷、緊急修復到重建驗證的完整標準作業程序(SOP),助您在最短時間內恢復業務連續性。
「未雨綢繆」是 DBA 的核心職責。一份合格的主資料庫災難恢復預案必須包含:
sp_help_revlogin 腳本導出所有登入與權限,備份 sys.databases、sys.master_files 等系統表結構
SQL Server 服務啟動失敗
│
▼
檢查 SQL Server 錯誤日誌 (預設路徑: \MSSQL\LOG\ERRORLOG)
│
├── 發現 "Error: 9003, Severity: 20, State: 1" → 記錄檔損壞
├── 發現 "Error: 823, Severity: 24, State: 2" → I/O 錯誤,磁碟故障可能
├── 發現 "Error: 3414, Severity: 21, State: 1" → 主資料庫恢復失敗
└── 服務啟動卡在 "Recovery of database 'master' (X%)" → 恢復過程受阻
-- 僅在 SQL Server 單用戶模式下可執行
sqlcmd -S . -m -Q "SELECT name, state_desc FROM sys.databases WHERE database_id = 1;"
-- 預期輸出: master | ONLINE (正常) / SUSPECT / RECOVERY_PENDING (異常)
適用場景:系統資料表損壞、系統存儲過程遺失、排序規則衝突
Rebuildm.exe(SQL 2000: \80\Tools\Binn\;SQL 2005+: \100\Setup Bootstrap\SQLServer2005\)Chinese_Taiwan_Stroke_CI_AS)-- 1. 啟動單用戶模式
sqlcmd -S . -m -Q "RESTORE DATABASE master FROM DISK = 'D:\Backup\master_full.bak' WITH REPLACE, RECOVERY;"
-- 2. 還原完成後 SQL Server 會自動關閉,需手動重啟服務
-- 3. 驗證系統物件完整性
sqlcmd -S . -Q "DBCC CHECKDB(master) WITH NO_INFOMSGS, ALL_ERRORMSGS;"
重建/還原主資料庫後,使用者資料庫會進入「僅恢復」狀態,需執行:
-- 批次掛載所有使用者資料庫
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql += 'ALTER DATABASE [' + name + '] SET ONLINE; '
FROM sys.databases
WHERE database_id > 4 AND state_desc = 'RESTORING';
EXEC sp_executesql @sql;
當完全沒有可用備份時,需按以下順序手動重建:
sp_help_revlogin 生成的腳本CREATE DATABASE [UserDB] ON (FILENAME = '...mdf'), (FILENAME = '...ldf') FOR ATTACH_REBUILD_LOG;sp_configure 'show advanced options', 1; RECONFIGURE; 逐項恢復 sp_configure 設定| 驗證項目 | 檢查指令 | 合格標準 |
|---|---|---|
| 服務啟動 | SQL Server 服務正常運行 | 無錯誤啟動,錯誤日誌無嚴重錯誤 |
| 主資料庫完整性 | DBCC CHECKDB(master) | 無一致性錯誤 |
| 登入驗證 | 使用 sa 及各應用帳號登入 | 所有帳號正常登入,權限正確 |
| 使用者資料庫 | SELECT * FROM sys.databases | 所有資料庫 ONLINE,無 SUSPECT |
| 備份鏈完整性 | RESTORE VERIFYONLY FROM DISK = '...' | 備份檔案可讀、校驗和正確 |
避坑指南:切勿嘗試直接刪除或重命名 master.mdf/mastlog.ldf 檔案!這會導致無法啟動 SQL Server 服務,唯一正確路徑是透過重建精靈或還原備份。平時務必開啟主資料庫的「自動備份」維護計畫,並定期測試還原可行性。