SQL Server 服務 (MSSQLSERVER / 具名實例) 無法啟動是 DBA 最頭痛的故障之一。本文歸納四大高發原因與標準化排查步驟,涵蓋服務帳戶密碼變更、電腦名稱變更、評估版到期、系統事件日誌分析,附一鍵修復腳本與預防清單。
故障一:作業系統/服務帳戶密碼變更導致登入失敗
現象:服務啟動立即停止,事件檢視器 → System 記錄 Event ID 7000 / 7038:服務無法啟動,登入失敗。
解決方案 (二選一)
- 改用本地系統帳戶 (Local System):
services.msc → SQL Server (MSSQLSERVER) → 內容 → 登入 → 本地系統帳戶 → 確定 → 重啟
優點:密碼變更無影響。缺點:權限過高、無法存取網路資源 (備份至網路共享、Linked Server 需網域帳戶)。
- 更新服務帳戶密碼:
services.msc → SQL Server (MSSQLSERVER) → 內容 → 登入 → 此帳戶 → 輸入新密碼 → 確定 → 重啟
必須同步更新:SQL Server Agent、SQL Server Browser、Full-Text Filter Daemon 等關聯服務若用同一帳戶,皆需更新密碼。
最佳實踐:使用群組受控服務帳戶 (gMSA) 或虛擬帳戶 (NT SERVICE\MSSQLSERVER) (SQL 2012+),密碼由系統自動輪換,徹底杜絕密碼過期問題。
故障二:電腦名稱變更導致內部註冊不一致
現象:重命名伺服器後,SQL Server 服務啟動失敗/掛起。
解決方案
- 插入 SQL Server 安裝媒體 → 執行安裝程式 → 選擇 「維護」→「修復」。
- 修復過程自動更新內部中繼資料 (sys.servers、登入、端點等),不損壞使用者資料庫,通常 10-20 分鐘完成。
- 修復後驗證:
SELECT @@SERVERNAME; 應回傳新電腦名稱 (預設實例) 或 新電腦名\實例名。
故障三:安裝的是評估版且已過期 (180 天)
現象**:服務啟動失敗,錯誤日誌記錄 Evaluation period has expired。
驗證方法
- 嘗試安裝 SQL Server SP3 / 最新 CU,評估版會報錯
This version has expired 並阻止安裝。
- 查詢:
SELECT SERVERPROPERTY('ProductVersion'), SERVERPROPERTY('Edition'), SERVERPROPERTY('LicenseType'); → LicenseType = 'EVALUATION'。
解決方案
- 解除安裝評估版 → 安裝正式授權版 (Standard/Enterprise/Developer/Express)。
- 若資料庫需保留:先備份/分離資料庫檔案,再重裝正式版後附加/還原。
故障四:系統事件日誌深度分析 (通用排查入口)
無論上述何種原因,**事件檢視器 → Windows Logs → System / Application** 是第一現場。
| Event ID | Source | 典型訊息 | 對應原因 |
| 7000 | Service Control Manager | 服務無法啟動,登入失敗 | 密碼錯誤/帳戶鎖定/權限不足 |
| 7038 | Service Control Manager | 服務登入失敗,更新密碼 | 密碼已變更未同步 |
| 17058 | MSSQLSERVER | initerrlog: Could not open error log file | 日誌路徑/權限/磁碟空間 |
| 17113 | MSSQLSERVER | Error 2 (The system cannot find the file specified) | master.mdf/mastlog.ldf 路徑遺失/掛載點斷開 |
| 3414 | MSSQLSERVER | An error occurred during recovery | 資料庫損壞/交易日誌不一致需修復 |
| 9002 | MSSQLSERVER | The log file for database is full | 日誌暴增/磁碟滿 |
一鍵診斷腳本 (PowerShell,需管理員權限)
# 檢查 SQL Server 服務狀態與登入帳戶
Get-Service -Name MSSQL* | Select Name, Status, StartType, @{N='LogonAccount';E={$_.ServiceHandle.GetType().GetMethod('GetServiceLogonAccount').Invoke($_.ServiceHandle,@())}}
# 抓取最近 24h 相關事件
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Service Control Manager'; StartTime=(Get-Date).AddHours(-24)} | Where {$_.Id -in 7000,7038} | Select TimeCreated, Id, Message
Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName='MSSQLSERVER'; StartTime=(Get-Date).AddHours(-24)} | Select TimeCreated, Id, Message
預防性維護清單 (月度執行)
- [ ] 確認服務帳戶為 gMSA/虛擬帳戶,或密碼未過期且已記錄於密碼管理系統。
- [ ] 驗證
@@SERVERNAME 與實際電腦名一致。
- [ ] 檢查授權狀態:
SERVERPROPERTY('LicenseType') ≠ 'EVALUATION'。
- [ ] 清理舊錯誤日誌 (保留 28 個循環),避免 C 槽爆滿:
EXEC sp_cycle_errorlog; (可排程 Agent Job 每日/每週執行)。
- [ ] 磁碟空間預警:資料/日誌/備份磁碟剩餘 > 20%。
- [ ] 備份還原演練:最近 30 天內至少一次完整還原驗證。
建立標準化故障排查 SOP,將上述四大類原因、事件 ID 對照表、PowerShell 診斷腳本納入團隊知識庫,可將 SQL Server 服務啟動故障 MTTR (平均修復時間) 壓縮至 15 分鐘內。
- 上一篇文章: SQL Server 2005 還原備份報錯「備份集中資料庫與現有資料庫不同」:勾選「完全覆蓋」一鍵解決
- 下一篇文章: SQL Server 索引優化實戰:從全表掃描到索引搜尋的查詢計畫演變分析
Copyright ©
程式碼之家 All Rights Reserved