事故現場還原
故障現象:11.2.0.3 RAC 生產庫突然宕機,Alert 日志報錯:
ORA-15196: invalid ASM block header [kfc.c:26076] [endian_kfbh] [256] [0 != 1]
詭異點:主庫與 Data Guard 物理備庫**同時**報相同錯誤,排除存儲單點故障。
根因深度溯源
時間線重構
- SA 操作:發現主機上一塊磁盤「未使用」,在**主備雙邊**執行
fdisk 分區 + mkfs 格式化
- 破壞後果:ASM 磁盤頭(第 0-1 個 AU,含磁盤組元數據)被覆寫,導致磁盤組無法掛載
- 連鎖反應:主庫寫入掛起 → 心跳失效 → 節點驅逐 → 備庫同步中斷 → 雙雙不可用
為什麼備庫也壞了?
Data Guard 物理備庫通過 Redo Apply 同步,**不複製 ASM 元數據結構**。但 SA 在備庫側**同樣執行了 fdisk/mkfs**,直接破壞了備庫 ASM 磁盤頭。這是人為操作同步,非數據同步導致。
恢復實戰過程
方案評估
| 方案 | 可行性 | RTO | RPO | 風險 |
| ASM 磁盤頭修復工具 | 極低 | 不可控 | 數據損失 | 元數據覆寫不可逆 |
| 重建主庫 + DG 重搭 | 中 | 8-12h | 最後備份點 | 業務長時間中斷 |
| 異地容災庫切換 | 高 | < 30min | 近乎零 | 最低 |
容災切換實施步驟
- 確認容災庫狀態:驗證異地庫數據完整性、SCN 差距、應用連通性
- 業務流量切換:修改 DNS/SCAN VIP 指向容災庫,或應用層連接串切換
- 角色轉換:
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;(如為物理備庫)
- 服務驗證:核心業務煙霧測試、數據一致性抽查
- 事後重建:原主庫環境重建,重新搭建 DG 架構
教訓總結與防範體系
核心教訓
- DBA 與 SA 必須建立強溝通機制:任何存儲層變更(磁盤分區、文件系統、LUN 映射)需 DBA 審批簽字
- 「未使用」≠「可隨意使用」:ASM 磁盤無文件系統特徵,SA 工具顯示為「空閒」,實則為 ASM 托管原始設備
- 異地容災是最後防線:同城雙活防存儲故障,異地容災防邏輯錯誤/人為破壞/區域性災難
技術防範措施
| 層面 | 措施 | 實施要點 |
| 權限控制 | 收回 SA 對數據庫服務器 root/sudo 權限 | 通過堡壘機審計、命令白名單管控 |
| 設備標識 | ASM 磁盤綁定 udev 規則 + 清晰命名 | /dev/oracleasm/disk_DG_DATA_01,禁止使用 /dev/sd* 直接操作 |
| 監控告警 | ASM 磁盤組狀態、磁盤在線數監控 | Grid Infrastructure 內建監控 + 自定義腳本秒級告警 |
| 操作審計 | 關鍵命令審計 | auditd 監控 fdisk/mkfs/dd/wipefs 等破壞性命令 |
| 備份驗證 | 定期恢復演練 | 季度級異地容災切換演練,驗證 RTO/RPO |
ASM 磁盤保護最佳實踐
# 1. udev 規則示例(/etc/udev/rules.d/99-oracle-asm.rules)
KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_SERIAL}=="36000d310000000000000000000000001", \
SYMLINK+="oracleasm/disk_DG_DATA_01", OWNER="grid", GROUP="asmadmin", MODE="0660"
# 2. ASMLib 標籤化(推薦)
oracleasm createdisk DG_DATA_01 /dev/sdb1
# 3. 定期驗證磁盤頭完整性
kfed read /dev/oracleasm/disk_DG_DATA_01 | grep -E "kfdhdb.magic|kfdhdb.chksum|kfdhdb.grpname"
事後複盤清單
- ☐ 確認 SA 操作授權流程缺失,建立變更管理制度
- ☐ 全環境梳理 ASM 磁盤設備映射,建立 CMDB 資產台賬
- ☐ 部署存儲層操作審計,關鍵命令實時告警 DBA 群
- ☐ 更新災難恢復預案,明確異地容災切換 SOP 與決策鏈
- ☐ 組織全員事故複盤會議,產出《事故分析報告》歸檔