| 系統庫 | 核心職責 | 備份頻率建議 | 創建後必備 |
|---|---|---|---|
| master | 實例級元數據:登錄名、端點、鏈接服務器、配置選項、所有用戶庫位置 | 每日全備 + 配置變更後即時備份 | ✅ 立即備份 |
| model | 新數據庫模板:恢復模式、兼容級別、默認文件組/文件大小/自增長、用戶/權限/對象 | 每週或模板變更後 | 按需配置 |
| msdb | SQL Server Agent 數據:作業、警報、操作員、備份/還原歷史、維護計劃、日誌傳送/鏡像監控 | 每日全備 | 按需配置 |
| tempdb | 臨時對象/表變量/游標/版本存儲/排序溢寫 — 不可備份,啟動時重建 | — | — |
| resource | 只讀系統對象視圖 — 隱藏,隨 Service Pack 升級 | — | — |
Event ID 17052/17054Error: 945, Severity: 14, State: 1. Database 'master' cannot be opened...Setup.exe 及 system database template files (通常在 \Data 目錄下的 master.mdf/mastlog.ldf/model.mdf/modellog.ldf/msdbdata.mdf/msdblog.ldf)
# 以管理員身份運行 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')或備份文件頭)。
# 檢查摘要日志
type "C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Log\Summary_*.txt"
# 成功標誌: "Final result: Passed"
# 方法 1: 啟動參數 -m (推薦)
# SQL Server Configuration Manager → 服務 → SQL Server (MSSQLSERVER) → 屬性 → 啟動參數
# 添加: -m"SQLCMD" (限制僅 SQLCMD 連接,防止應用搶佔唯一連接)
# 重啟服務
# 方法 2: 命令行臨時啟動 (調試用)
sqlservr.exe -s MSSQLSERVER -m"SQLCMD" -c # -c: 獨立進程非服務, -f: 最小配置 (可選)
.bak 文件):
# 單用戶模式下僅允許一個連接,使用 sqlcmd
sqlcmd -S . -E -Q "RESTORE DATABASE master FROM DISK='D:\Backups\master_full_20240115.bak' WITH REPLACE, RECOVERY"
# 還原成功後服務會自動關閉,需移除 -m 參數並正常重啟服務
# 正常模式下執行
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"
tempdb 文件配置 (若原配置有多文件/特定路徑)登錄名、鏈接服務器、加密密鑰 (master 儲存)ONLINE/SUSPECT)sp_configure 選項 (max memory, max degree of parallelism 等)
# 單用戶模式還原 (同上步驟 4-5)
# 或: 如果僅部分表損壞,可嘗試 DBCC CHECKDB (master) WITH REPAIR_ALLOW_DATA_LOSS
# ⚠️ 極高風險,僅作最後手段
# 1. 停止 SQL Server Agent 服務
# 2. 正常模式還原 msdb (無需單用戶)
RESTORE DATABASE msdb FROM DISK='D:\Backups\msdb_full.bak' WITH REPLACE, RECOVERY;
# 3. 重啟 Agent,驗證作業/歷史
# 正常模式還原 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 天
COLLATION 必須與原實例完全一致,否則用戶庫附加/還原會報排序衝突錯誤。msdb.dbo.sysjobs 的 originating_server_id 是否匹配 msdb.dbo.sysservers,不匹配需更新。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 → 重新配置實例級對象。關鍵成功因素:
-m"SQLCMD" 參數法)建議將系統庫恢復演練納入 季度災難恢復演練 (DR Drill),確保團隊在真實故障時能在 RTO 內完成恢復。