索引与数据物理隔离不能仅靠“放不同磁盘组”实现,必须结合asm的failgroup显式配置、模板绑定及存储层路径隔离,否则io仍会集中于同一lun;根本原因是磁盘组映射到相同raid组且未启用跨路径条带化。
索引与数据物理隔离不能靠“放不同磁盘组”就自动生效——必须配合 asm 的 allocation unit 分配策略和文件类型感知,否则 io 争用照旧。
为什么把索引放进单独的 ASM 磁盘组后,IO 还是打在同一个物理 LUN 上?
常见错误现象是:新建了 INDEXDG 磁盘组,把索引表空间 INDX_TBS 创建在它上面,但 iostat -x 1 显示底层 emcpoweru(对应 data_center_17)的 %util 持续 95%+,而 emcpowert(data_center_16)几乎空闲。
根本原因不是磁盘组没建对,而是:
- 两个磁盘组实际映射到了同一套存储阵列的同一 RAID 组(比如都落在 CKM00141100044 的同一组 15K SAS 盘上)
-
INDEXDG创建时用了默认COMPATIBLE.ASM='12.1.0.0.0',未启用ASM_DISKGROUP_TYPE=HIGH或显式指定FAILGROUP,导致 ASM 无法跨物理路径做条带化隔离 - Oracle 不会因“表空间名含 INDX”就自动把索引块写到特定 failgroup;它只认
v$asm_alias中的文件类型(TYPE='INDEX')和分配单元位置
如何验证索引文件是否真在目标磁盘组的独立物理路径上?
别只查 dba_tablespaces 和 v$asm_diskgroup。要穿透到存储层:
- 查索引段所在文件的物理归属:
SELECT f.name, d.path, d.failgroup FROM v$asm_file f, v$asm_disk d, v$asm_alias a WHERE a.name = 'YOUR_INDEX_NAME' AND a.file_number = f.file_number AND f.disk_kffxp = d.disk_number AND f.group_number = d.group_number;
- 对比
d.path是否落在emcpoweru(data_center_17)而非emcpowert;若仍是后者,说明创建时没指定TEMPLATE或FAILGROUP - 用
powermt display dev=all确认emcpoweru对应的 VNX LUN ID(如60060160F7303500ADF6E88706A1E811)是否与emcpowert的 ID(60060160F7303500ACF6E88706A1E811)不同——相同前缀大概率是同一 RAID 组
真正起效的物理隔离操作步骤
核心是让 ASM 在分配 AU 时强制跨物理路径,而不是依赖“磁盘组名字不同”:
- 创建磁盘组时显式绑定 failgroup,且每个 failgroup 必须指向不同存储控制器路径:
CREATE DISKGROUP INDEXDG EXTERNAL REDUNDANCY FAILGROUP FG_SP_A DISK '/dev/emcpoweru' FAILGROUP FG_SP_B DISK '/dev/emcpowerw' ATTRIBUTE 'compatible.asm'='12.1.0', 'au_size'='4M';
- 为索引表空间指定模板,确保新创建的索引文件走该模板:
ALTER DISKGROUP INDEXDG ADD TEMPLATE index_template ATTRIBUTES (MIRROR HOT);
- 建索引时强制使用该模板:
CREATE INDEX idx_orders_status ON orders(status) TABLESPACE INDX_TBS STORAGE (INITIAL 64M) ONLINE NOLOGGING /* 关键:触发 ASM 使用模板分配 */;
- 检查结果:
SELECT type, redundancy, striped FROM v$asm_template WHERE dgname='INDEXDG'——striped='Y'才表示跨 failgroup 条带化生效
容易被忽略的 RAC 场景陷阱
在 2 节点 RAC 中,如果只给 INDEXDG 加了 1 块盘(/dev/emcpoweru),即使建了 failgroup,ASM 也会降级为 unmirrored 分配,且所有节点都往同一块盘刷 redo for index DML。此时:
-
crsctl stat res -t | grep INDEXDG可能显示OFFLINE(因单点故障无冗余) - 节点 1 的 DML 更新索引,节点 2 的查询需频繁走
gc cr block busy获取一致性读镜像,反而放大全局锁争用 - 真正安全的最小配置是:每个 failgroup 至少 1 块盘,且盘数 ≥ 节点数(即 2 节点 RAC,
INDEXDG至少 2 块物理隔离盘)
物理隔离不是加个磁盘组就能关掉监控的事,它要求从存储映射、ASM 配置、文件模板到 SQL 创建全程可控——漏掉任意一环,IO 争用都会悄悄回到老路上。











