ASM (Automatic Storage Management) 將文件條帶化分散於磁碟組各磁碟的 Allocation Unit (AU)。本文實戰示範如何透過 V$ASM_ALIAS、X$KFFXP、X$KFDAT 定位文件 AU 分佈,再用 kfed 解析元數據、dd 提取 spfile 與控制檔至 OS 層面。
V$ASM_ALIAS:文件名 ↔ GROUP_NUMBER, FILE_NUMBERX$KFFXP:Extent 映射 → DISK_KFFXP, AU_KFFXP, XNUM_KFFXP (Extent 編號)X$KFDAT:文件直接 AU 映射 (僅 External Redundancy 適用)V$ASM_DISK:DISK_NUMBER ↔ OS 路徑 (如 /dev/asm11g-f)SELECT NAME, GROUP_NUMBER, FILE_NUMBER
FROM V$ASM_ALIAS
WHERE LOWER(NAME) = 'spfilegt11g.ora';
-- 結果:GROUP=1, FILE_NUMBER=265
SELECT GROUP_KFFXP, NUMBER_KFFXP, PXN_KFFXP, XNUM_KFFXP, DISK_KFFXP
FROM X$KFFXP
WHERE GROUP_KFFXP=1 AND NUMBER_KFFXP=265;
-- 顯示:Extent 0 在 Disk 0, AU 2
SELECT GROUP_NUMBER, DISK_NUMBER, PATH
FROM V$ASM_DISK
WHERE GROUP_NUMBER=1 AND DISK_NUMBER=0;
-- /dev/asm11g-f
kfed read /dev/asm11g-f aun=2 blkn=1 | more
-- 關鍵輸出:kfffde[0].xptr.au=2, disk=0 (主 extent)
-- kfffde[1].xptr.au=31, disk=1 (鏡像 extent,External redundancy 無此行)
kfed read /dev/asm11g-g aun=31 blkn=9
-- 找到 kfffde[0].xptr.au=936, disk=1
SELECT GROUP_KFDAT, NUMBER_KFDAT, AUNUM_KFDAT
FROM X$KFDAT
WHERE FNUM_KFDAT=265;
-- 結果:GROUP=1, DISK=1, AU=936
dd if=/dev/asm11g-g skip=936 of=/tmp/dbspfile bs=1024k count=1
cat /tmp/dbspfile
-- 可見完整 SPFILE 參數內容
SHOW PARAMETER CONTROL_FILES;
-- +DATA01/gt11g/controlfile/current.256.810471879
SELECT XNUM_KFFXP, PXN_KFFXP, DISK_KFFXP, AU_KFFXP
FROM X$KFFXP
WHERE GROUP_KFFXP=1 AND NUMBER_KFFXP=256
ORDER BY XNUM_KFFXP;
-- 交錯分佈於 Disk 0/1,AU 29-36,每 Extent 1 AU (16MB 總計)
kfed read /dev/asm11g-g aun=31 blkn=0
-- kfffdb.xtntcnt=16, blkSize=16384, 確認 16 Extents
| 工具 | 用途 | 關鍵參數 |
|---|---|---|
| kfed read | 解析 ASM 磁碟元數據 | aun=AU號, blkn=Block號 |
| dd | 原始磁碟資料提取 | if=裝置, skip=AU號, bs=1024k, count=AU數 |
| X$KFFXP | Extent 級映射 (所有冗余類型) | GROUP_KFFXP, NUMBER_KFFXP, XNUM_KFFXP |
| X$KFDAT | 文件級 AU 直接映射 (External Only) | FNUM_KFDAT, AUNUM_KFDAT |
dd 鏡像備份核心邏輯:別名 → FILE_NUMBER → Extent 映射 (X$KFFXP) → 磁碟/ AU → kfed 驗證 → dd 提取。External Redundancy 可用 X$KFDAT 直達。