首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

SQL Server 系統數據庫災難恢復全流程:master/model/msdb 重建與還原實戰

     編輯:DB2 教學

系統數據庫角色速查

系統庫核心職責備份頻率建議創建後必備
master實例級元數據:登錄名、端點、鏈接服務器、配置選項、所有用戶庫位置每日全備 + 配置變更後即時備份✅ 立即備份
model新數據庫模板:恢復模式、兼容級別、默認文件組/文件大小/自增長、用戶/權限/對象每週或模板變更後按需配置
msdbSQL Server Agent 數據:作業、警報、操作員、備份/還原歷史、維護計劃、日誌傳送/鏡像監控每日全備按需配置
tempdb臨時對象/表變量/游標/版本存儲/排序溢寫 — 不可備份,啟動時重建——
resource只讀系統對象視圖 — 隱藏,隨 Service Pack 升級——

場景一:master 損壞導致實例無法啟動 (最嚴重)

症狀

  • SQL Server 服務啟動失敗,事件日志 Event ID 17052/17054
  • 錯誤日志:Error: 945, Severity: 14, State: 1. Database 'master' cannot be opened...

恢復步驟 (SQL Server 2012+ / 2016+ / 2019 / 2022 通用)

  1. 準備介質:SQL Server 安裝 ISO/解壓目錄,定位 Setup.exe 及 system database template files (通常在 \Data 目錄下的 master.mdf/mastlog.ldf/model.mdf/modellog.ldf/msdbdata.mdf/msdblog.ldf)
  2. 重建系統數據庫 (命令行方式,無需 GUI):
    
    # 以管理員身份運行 CMD/PowerShell
    cd "C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\SQL2022"  # 版本路徑自適應
    
    # 單實例 (MSSQLSERVER)
    Setup.exe /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER 
      /SQLSYSADMINACCOUNTS="BUILTIN\Administrators" 
      /SAPWD="StrongPassword123!" 
      /SQLCOLLATION=Chinese_PRC_CI_AS
      /DATADIR="C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA"
      /LOGDIR="C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\LOG"
      /TEMPDBDATADIR="C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA"
      /TEMPDBLOGDIR="C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\LOG"
    
    # 命名實例 (INST01)
    Setup.exe /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=INST01 ...
    

    關鍵參數:/SQLSYSADMINACCOUNTS 指定新實例 sysadmin (必須包含當前操作用戶),/SAPWD 設置 sa 密碼 (混合模式),/SQLCOLLATION 必須與原實例一致 (查詢 SERVERPROPERTY('Collation') 或備份文件頭)。

  3. 驗證重建結果:
    
    # 檢查摘要日志
    type "C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Log\Summary_*.txt"
    # 成功標誌: "Final result: Passed"
    
  4. 啟動單用戶模式還原 master:
    
    # 方法 1: 啟動參數 -m (推薦)
    # SQL Server Configuration Manager → 服務 → SQL Server (MSSQLSERVER) → 屬性 → 啟動參數
    # 添加: -m"SQLCMD"  (限制僅 SQLCMD 連接,防止應用搶佔唯一連接)
    # 重啟服務
    
    # 方法 2: 命令行臨時啟動 (調試用)
    sqlservr.exe -s MSSQLSERVER -m"SQLCMD" -c  # -c: 獨立進程非服務, -f: 最小配置 (可選)
    
  5. 還原 master 備份 (需有效的 .bak 文件):
    
    # 單用戶模式下僅允許一個連接,使用 sqlcmd
    sqlcmd -S . -E -Q "RESTORE DATABASE master FROM DISK='D:\Backups\master_full_20240115.bak' WITH REPLACE, RECOVERY"
    
    # 還原成功後服務會自動關閉,需移除 -m 參數並正常重啟服務
    
  6. 按序還原 msdb → model (可選,視備份策略):
    
    # 正常模式下執行
    sqlcmd -S . -E -Q "RESTORE DATABASE msdb FROM DISK='D:\Backups\msdb_full_20240115.bak' WITH REPLACE, RECOVERY"
    sqlcmd -S . -E -Q "RESTORE DATABASE model FROM DISK='D:\Backups\model_full_20240115.bak' WITH REPLACE, RECOVERY"
    
  7. 後續關鍵操作:
    • 重建 tempdb 文件配置 (若原配置有多文件/特定路徑)
    • 檢查/重建 登錄名、鏈接服務器、加密密鑰 (master 儲存)
    • 驗證所有用戶數據庫狀態 (ONLINE/SUSPECT)
    • 重新配置 sp_configure 選項 (max memory, max degree of parallelism 等)

場景二:實例可啟動但系統庫損壞/邏輯錯誤

master 可連接但元數據錯誤


# 單用戶模式還原 (同上步驟 4-5)
# 或: 如果僅部分表損壞,可嘗試 DBCC CHECKDB (master) WITH REPAIR_ALLOW_DATA_LOSS
# ⚠️ 極高風險,僅作最後手段

msdb 損壞 (Agent 作業失效、備份歷史丟失)


# 1. 停止 SQL Server Agent 服務
# 2. 正常模式還原 msdb (無需單用戶)
RESTORE DATABASE msdb FROM DISK='D:\Backups\msdb_full.bak' WITH REPLACE, RECOVERY;
# 3. 重啟 Agent,驗證作業/歷史

model 損壞 (新建庫報錯)


# 正常模式還原 model
RESTORE DATABASE model FROM DISK='D:\Backups\model_full.bak' WITH REPLACE, RECOVERY;
# 驗證: CREATE DATABASE TestModel; -- 應繼承 model 設置

單用戶模式啟動三種方式對比

方式操作優點缺點適用場景
啟動參數 -m配置管理器添加 -m"SQLCMD" → 重啟服務持久化、標準化、生產級需重啟服務兩次計劃性恢復、生產環境
命令行 sqlservr.exe -m手動運行 sqlservr -s INST -m"SQLCMD" -c即時、可見控制台輸出、調試友好佔用終端、非服務模式、易誤關閉緊急調試、開發環境
注冊表啟動參數HKLM\Software\Microsoft\MSSQLServer\MSSQLServer\Parameters\SQLArgN = -m底層控制、自動化腳本友好風險高、需重啟、易遺忘清理極端情況、自動化腳本

備份策略最佳實踐:系統庫專屬


-- 維護計劃 / Agent 作業 / Ola Hallengren 腳本

-- master: 每日全備 + 配置變更觸發
BACKUP DATABASE master TO DISK = 'D:\Backup\master_$(date).bak' 
WITH COMPRESSION, CHECKSUM, INIT, FORMAT, 
     DESCRIPTION = 'Master Daily Full Backup';

-- msdb: 每日全備 (含備份歷史)
BACKUP DATABASE msdb TO DISK = 'D:\Backup\msdb_$(date).bak' 
WITH COMPRESSION, CHECKSUM;

-- model: 每週全備 + 結構變更後
BACKUP DATABASE model TO DISK = 'D:\Backup\model_$(date).bak' 
WITH COMPRESSION, CHECKSUM;

-- 異地複製: 腳本同步至遠程存儲/雲端
-- 保留策略: master 90 天, msdb/model 30 天

避坑指南與常見誤區

⚠️ 關鍵提醒

  • 排版規則必須一致:重建/還原 master 時 COLLATION 必須與原實例完全一致,否則用戶庫附加/還原會報排序衝突錯誤。
  • sa 密碼重置:重建系統庫會重置 sa 密碼為安裝時指定值,還原 master 後恢復為備份時密碼。記錄管理!
  • 不要嘗試分離/附加 master:系統庫不支持分離操作。
  • msdb 還原後 Agent 作業可能失效:檢查 msdb.dbo.sysjobs 的 originating_server_id 是否匹配 msdb.dbo.sysservers,不匹配需更新。
  • 加密層級對象:主鍵 (DMK)、證書、非對稱密鑰 存儲在 master,還原 master 後需驗證 OPEN MASTER KEY DECRYPTION BY PASSWORD 是否正常。
  • 資源數據庫:mssqlsystemresource.mdf/ldf 隨 Service Pack 升級,不可手動備份還原,重建系統庫會自動部署匹配版本。

自動化恢復腳本框架


#!/bin/bash
# restore_system_dbs.sh - 需在單用戶模式下由 sqlcmd 調用
# 參數: $1=備份目錄 $2=實例名

BACKUP_DIR=$1
INSTANCE=$2
SQLCMD="sqlcmd -S .\${INSTANCE} -E -b"  # -b: 錯誤時退出

echo "[$(date)] Restoring master..."
${SQLCMD} -Q "RESTORE DATABASE master FROM DISK='${BACKUP_DIR}/master_latest.bak' WITH REPLACE, RECOVERY"
# master 還原後連接斷開,腳本需外部控制重啟服務並繼續

echo "[$(date)] Restoring msdb..."
${SQLCMD} -Q "RESTORE DATABASE msdb FROM DISK='${BACKUP_DIR}/msdb_latest.bak' WITH REPLACE, RECOVERY"

echo "[$(date)] Restoring model..."
${SQLCMD} -Q "RESTORE DATABASE model FROM DISK='${BACKUP_DIR}/model_latest.bak' WITH REPLACE, RECOVERY"

echo "[$(date)] System databases restore completed."

總結

SQL Server 系統數據庫恢復的核心邏輯:重建空殼 → 單用戶模式還原 master → 正常模式還原 msdb/model → 重新配置實例級對象。關鍵成功因素:

  1. 擁有 有效、可驗證、排版一致 的系統庫備份 (每日自動化 + 異地)
  2. 熟練掌握 單用戶模式啟動 (推薦 -m"SQLCMD" 參數法)
  3. 理解 還原順序依賴:master → (msdb, model 並行)
  4. 恢復後 驗證清單:用戶庫狀態、登錄名、Agent 作業、加密、配置選項

建議將系統庫恢復演練納入 季度災難恢復演練 (DR Drill),確保團隊在真實故障時能在 RTO 內完成恢復。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved