標準作業程序範本(Standard Operating Procedure, SOP)#
參照標準:ISO 9001:2015(Quality Management)/ ISO/IEC 20000-1:2018 / ITIL 4
文件用途:標準化維運操作流程,確保操作一致性、降低人為錯誤、加速新人上手
適用階段:維運監控階段(Operations Phase)— Operational Excellence
📋 章節目錄#
- 文件資訊
- 目的與範圍
- 角色與職責
- 前置條件
- 操作步驟
- 驗證與確認
- 異常處理
- 安全注意事項
- 相關文件
- 變更歷史
1. 文件資訊#
📝 範本#
| 項目 | 內容 |
|---|
| 文件編號 | SOP-{類別代碼}-{序號} |
| 文件名稱 | {操作名稱} 標準作業程序 |
| 版本 | v{主版本}.{次版本} |
| 狀態 | 草稿 / 審核中 / 核定 / 作廢 |
| 建立日期 | {YYYY-MM-DD} |
| 生效日期 | {YYYY-MM-DD} |
| 下次審核日期 | {YYYY-MM-DD}(至少每年) |
| 撰寫者 | {姓名/角色} |
| 審核者 | {姓名/角色} |
| 核准者 | {姓名/角色} |
| 適用系統 | {系統/服務名稱} |
| 機密等級 | 一般 / 限閱 / 機密 |
📖 使用說明#
- SOP 編號慣例:
SOP-{類別}-{流水號}- 類別代碼範例:
DEP(部署)、INC(事件處理)、BAK(備份)、MON(監控)
- 每份 SOP 需定期審核(ISO 9001 要求),避免過時
- 狀態管理:草稿 → 審核中 → 核定(可執行)→ 作廢(新版取代)
- 機密等級決定誰可以存取此 SOP
💡 範例#
| 項目 | 內容 |
|---|
| 文件編號 | SOP-BAK-001 |
| 文件名稱 | HRMS 資料庫每日備份標準作業程序 |
| 版本 | v2.0 |
| 生效日期 | 2026-05-01 |
| 下次審核日期 | 2027-05-01 |
| 適用系統 | HRMS PostgreSQL 16 (Azure Database) |
2. 目的與範圍#
📝 範本#
2.1 目的#
{說明此 SOP 為何存在、解決什麼問題}
2.2 範圍#
| 項目 | 內容 |
|---|
| 適用對象 | {哪些人需要遵循此 SOP} |
| 適用情境 | {什麼時候需要執行此 SOP} |
| 不適用情境 | {明確排除的場景} |
2.3 定義與縮寫#
📖 使用說明#
- 目的說明「為什麼要做」,範圍說明「什麼情況下做」
- 明確列出不適用情境,避免錯誤套用
- 定義縮寫確保所有讀者理解一致
💡 範例#
2.1 目的#
確保 HRMS 資料庫每日執行完整備份,保護員工個資與薪資資料安全,符合個人資料保護法要求的資料保存與災難恢復能力。
2.2 範圍#
| 項目 | 內容 |
|---|
| 適用對象 | DBA 團隊、值班 SRE |
| 適用情境 | 每日排程備份(02:00 UTC+8)、部署前手動備份 |
| 不適用情境 | 災難恢復(參見 SOP-DR-001)、資料遷移(參見 SOP-MIG-001) |
3. 角色與職責#
📝 範本#
| 角色 | 職責 | 人員/群組 |
|---|
| {角色} | {具體職責} | {人員或群組名稱} |
📖 使用說明#
- RACI 原則:明確「誰執行、誰負責、誰諮詢、誰知會」
- 角色不綁定個人,確保人員異動時 SOP 仍可執行
- 列出替代人員(backup),確保假日/離職時的持續性
💡 範例#
| 角色 | 職責 | 人員/群組 |
|---|
| 執行者 | 執行備份操作或確認自動備份成功 | DBA 團隊(主:陳 DBA、備:林 DBA) |
| 監控者 | 確認備份告警、處理失敗通知 | 值班 SRE |
| 審核者 | 每月確認備份完整性(隨機還原測試) | DBA 組長 |
| 核准者 | SOP 變更核准 | IT 維運主管 |
4. 前置條件#
📝 範本#
4.1 環境/工具需求#
4.2 權限需求#
| 系統/工具 | 所需權限 | 申請方式 |
|---|
| {系統} | {權限} | {方式} |
4.3 前置步驟#
📖 使用說明#
- 前置條件確保執行者在開始操作前具備所有必要資源
- 權限需求明確化,避免執行中途發現權限不足
- 前置步驟是在「操作步驟」開始前需完成的準備工作
💡 範例#
4.1 環境/工具需求#
| 項目 | 需求 | 確認 |
|---|
| 備份工具 | pg_dump 16.x (與 DB 版本一致) | ☐ |
| 儲存空間 | Azure Blob Storage hrms-backup container | ☐ |
| 網路連線 | 可存取 DB 主機 (pg-hrms-prod.postgres.database.azure.com:5432) | ☐ |
| 監控工具 | Grafana Dashboard: HRMS-Backup-Status | ☐ |
4.2 權限需求#
| 系統/工具 | 所需權限 | 申請方式 |
|---|
| PostgreSQL | pg_read_all_data role | DBA 組長核准 |
| Azure Blob | Storage Blob Data Contributor | IT Service Desk 工單 |
| Kubernetes | hrms namespace exec 權限 | RBAC 申請表 |
5. 操作步驟#
📝 範本#
Step {N}: {步驟標題}#
| 項目 | 內容 |
|---|
| 目的 | {此步驟達成什麼} |
| 執行者 | {角色} |
| 預計時間 | {時間} |
操作:
預期結果:
{描述成功的輸出/狀態}
注意事項:
📖 使用說明#
- 每個步驟需包含:目的、操作(精確命令/截圖)、預期結果
- 步驟粒度原則:一個步驟 = 一個可驗證的動作
- 命令需完整可複製(含參數),不能有模糊描述(如「適當調整」)
- 標示預計時間,幫助執行者判斷是否正常
💡 範例#
Step 1: 確認資料庫狀態#
| 項目 | 內容 |
|---|
| 目的 | 確認 DB 正常運作,可安全執行備份 |
| 執行者 | DBA |
| 預計時間 | 1 分鐘 |
操作:
# 檢查 DB 連線數與鎖定狀態
psql -h pg-hrms-prod.postgres.database.azure.com -U hrms_backup -d hrms -c "
SELECT count(*) as active_connections FROM pg_stat_activity WHERE state = 'active';
SELECT count(*) as locks FROM pg_locks WHERE NOT granted;
"
預期結果:
- active_connections < 80(正常負載)
- locks = 0(無阻塞鎖定)
注意事項:
- 若 active_connections > 80 或 locks > 0,暫緩備份並通知 DBA 組長
- 備份期間避開薪資計算排程(02:00 備份,薪資排程為 04:00)
Step 2: 執行全量備份#
| 項目 | 內容 |
|---|
| 目的 | 產生資料庫完整備份檔案 |
| 執行者 | DBA / CronJob |
| 預計時間 | 10-15 分鐘(10,000 員工資料量) |
操作:
# 執行 pg_dump (custom format, 壓縮)
BACKUP_FILE="hrms_full_$(date +%Y%m%d_%H%M%S).dump"
pg_dump -h pg-hrms-prod.postgres.database.azure.com \
-U hrms_backup -d hrms \
-Fc -Z 9 \
--no-owner --no-acl \
-f /tmp/backup/${BACKUP_FILE}
echo "Backup size: $(du -h /tmp/backup/${BACKUP_FILE})"
預期結果:
- 備份檔案產生於
/tmp/backup/ - 檔案大小約 500MB ~ 1GB(異常偏差 > 20% 需調查)
- 無 ERROR 訊息
Step 3: 上傳至雲端儲存#
| 項目 | 內容 |
|---|
| 目的 | 將備份檔上傳至異地儲存(Azure Blob) |
| 執行者 | DBA / CronJob |
| 預計時間 | 3-5 分鐘 |
操作:
# 上傳至 Azure Blob Storage
az storage blob upload \
--account-name hrmsbackupstorage \
--container-name hrms-backup \
--name "daily/${BACKUP_FILE}" \
--file "/tmp/backup/${BACKUP_FILE}" \
--auth-mode login
# 清理本地暫存
rm -f /tmp/backup/${BACKUP_FILE}
預期結果:
- 上傳成功,Blob 可在 Azure Portal 查看
- 本地暫存已清理
Step 4: 驗證備份完整性#
| 項目 | 內容 |
|---|
| 目的 | 確認備份檔可正常還原 |
| 執行者 | DBA |
| 預計時間 | 2 分鐘(只驗證 TOC,不實際還原) |
操作:
# 下載最新備份並驗證 TOC (Table of Contents)
az storage blob download \
--account-name hrmsbackupstorage \
--container-name hrms-backup \
--name "daily/${BACKUP_FILE}" \
--file "/tmp/verify/${BACKUP_FILE}" \
--auth-mode login
pg_restore --list "/tmp/verify/${BACKUP_FILE}" | head -20
rm -f /tmp/verify/${BACKUP_FILE}
預期結果:
pg_restore --list 正常列出所有 table/index/constraint- 無 corruption 錯誤訊息
6. 驗證與確認#
📝 範本#
6.1 成功驗證清單#
| # | 驗證項目 | 驗證方法 | 預期結果 | 實際結果 | 通過 |
|---|
| 1 | {項目} | {方法} | {預期} | {實際} | ☐ |
6.2 完成通知#
- 通知對象:{角色/群組}
- 通知方式:{Email/Slack/監控系統}
- 通知內容:{備份成功 + 檔案大小 + 耗時}
📖 使用說明#
- 每次操作結束後必須驗證,不能「假設」成功
- 驗證清單確保不遺漏驗證步驟
- 完成通知讓相關人員掌握狀態
💡 範例#
6.1 成功驗證清單#
| # | 驗證項目 | 驗證方法 | 預期結果 | 實際結果 | 通過 |
|---|
| 1 | 備份檔案存在 | Azure Portal / CLI | Blob 存在且大小合理 | - | ☐ |
| 2 | 備份可列出結構 | pg_restore –list | 正常列出 tables | - | ☐ |
| 3 | 監控儀表板更新 | Grafana 確認 | 最新備份時間已更新 | - | ☐ |
| 4 | 備份保留政策 | 確認超過 30 天已刪除 | 只保留 30 天 | - | ☐ |
7. 異常處理#
📝 範本#
7.1 常見異常與處理#
| 異常情境 | 可能原因 | 處理步驟 | 升級條件 |
|---|
| {異常描述} | {原因} | {步驟} | {何時升級} |
7.2 升級路徑#
Step 1: 執行者自行處理(5 分鐘內)
↓ 失敗
Step 2: 通知組長/資深人員(15 分鐘內)
↓ 失敗
Step 3: 升級至主管(30 分鐘內)
📖 使用說明#
- 異常處理是 SOP 的核心價值 — 減少遇到問題時的慌亂
- 列出最常見的 3-5 種異常場景
- 明確的升級條件與路徑,避免一人苦戰
💡 範例#
7.1 常見異常與處理#
| 異常情境 | 可能原因 | 處理步驟 | 升級條件 |
|---|
| pg_dump 連線逾時 | DB 負載過高 / 網路問題 | 1. 等待 5 分鐘重試 2. 檢查 DB 連線數 3. 確認網路 | 重試 3 次仍失敗 |
| 備份檔大小異常(偏差 > 30%) | 資料大量刪除/新增 / 備份不完整 | 1. 比對前日備份 2. 查看 DB 大小 3. 確認有無大量異動 | 確認非正常異動 |
| Azure Blob 上傳失敗 | 儲存空間滿 / 權限過期 | 1. 確認 Blob 配額 2. 確認 Token 有效 3. 手動上傳 | 上傳仍失敗 |
| CronJob 未執行 | K8s CronJob suspend / Node 問題 | 1. kubectl get cronjob 確認狀態 2. 手動觸發 | CronJob 修復後仍無法觸發 |
8. 安全注意事項#
📝 範本#
📖 使用說明#
- 任何涉及敏感資料/系統的 SOP 都需要安全注意事項
- 包含:權限最小化、密碼處理、日誌記錄、檔案清理
- 符合資安政策與合規要求
💡 範例#
| # | 安全要求 | 說明 |
|---|
| 1 | 備份帳號使用唯讀權限 | hrms_backup 角色僅有 pg_read_all_data,無法修改資料 |
| 2 | 連線使用 SSL | sslmode=require 確保傳輸加密 |
| 3 | 備份檔案加密存放 | Azure Blob 啟用 SSE(Server-Side Encryption) |
| 4 | 密碼不出現在腳本中 | 使用 Azure Managed Identity / K8s Secret |
| 5 | 備份完成後清理本地暫存 | 避免敏感資料殘留於作業主機 |
| 6 | 操作日誌保留 | 所有備份操作記錄於 Audit Log(保留 180 天) |
9. 相關文件#
📝 範本#
| 文件編號 | 文件名稱 | 關聯 |
|---|
| {編號} | {名稱} | {與本 SOP 的關係} |
📖 使用說明#
- 列出與本 SOP 相關的其他文件,方便交叉參考
- 包含:上層政策、相關 SOP、技術手冊、應急計畫
💡 範例#
| 文件編號 | 文件名稱 | 關聯 |
|---|
| SOP-DR-001 | HRMS 災難恢復 SOP | 備份是 DR 的基礎 |
| SOP-DEP-001 | HRMS 部署標準作業程序 | 部署前需手動備份 |
| POL-SEC-003 | 資料備份與保存政策 | 本 SOP 遵循的上層政策 |
| TM-HRM-001 | HRMS 威脅模型 | THR-004 資料保護對策 |
10. 變更歷史#
📝 範本#
| 版本 | 日期 | 變更者 | 變更內容 | 核准者 |
|---|
| v{x.x} | {日期} | {人員} | {變更描述} | {核准者} |
📖 使用說明#
- ISO 9001 要求受管制文件有完整的變更歷史
- 每次修改(即使小修)都需記錄
- 版本號語義:主版本 = 重大流程變更;次版本 = 小修/補充
💡 範例#
| 版本 | 日期 | 變更者 | 變更內容 | 核准者 |
|---|
| v1.0 | 2025-06-01 | 陳 DBA | 初版建立 | IT 主管 |
| v1.1 | 2025-09-15 | 陳 DBA | 新增 Azure Blob 上傳步驟(從本地磁碟遷移) | IT 主管 |
| v2.0 | 2026-05-01 | 林 DBA | 全面改寫:PostgreSQL 16 升級 + 新備份策略 | IT 主管 |
📌 範本使用注意事項
- 本範本依據 ISO 9001:2015 受管制文件格式與 ISO/IEC 20000-1:2018 維運管理要求編製
- SOP 是「活文件」,需定期審核(至少每年一次)並因應環境變更更新
- 新 SOP 核定後需對執行人員進行教育訓練,確認理解
- 建議搭配 Checklist 版本(精簡版)供日常操作使用,完整版供教育訓練與審核
- SOP 執行結果需有記錄(日誌/工單),作為稽核證據