ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Oracle ASM核心命令实战:从磁盘组管理到性能调优

2026/8/15 13:55:11 拓冰建站 浏览量
Oracle ASM核心命令实战:从磁盘组管理到性能调优 1. 项目概述为什么ASM命令是DBA的“瑞士军刀”在Oracle数据库的世界里自动存储管理ASM绝对是一个划时代的技术。它把DBA从繁琐的物理文件管理和磁盘I/O性能调优中解放了出来让存储管理变得像管理一个逻辑卷一样简单。但很多刚接触ASM的朋友包括一些有经验的DBA在面对ASM实例和磁盘组时常常会感到一丝迷茫我该用什么命令这些命令在哪里执行为什么我的操作不生效这就像你拿到了一把功能强大的瑞士军刀却不知道每个小工具该怎么用。今天我就结合自己十多年在运维一线摸爬滚打的经验把那些最常用、最核心的ASM操作命令掰开了、揉碎了讲给你听。这不仅仅是命令的罗列更是每个命令背后的逻辑、使用场景以及我踩过的那些坑。无论你是正在准备OCP认证还是日常需要维护生产环境的ASM存储这篇文章都能让你手中有粮心里不慌。2. ASM核心架构与操作环境准备在挥舞命令“大刀”之前我们必须先搞清楚战场在哪里以及我们手里的武器是什么。ASM的架构理解透了命令用起来才会得心应手。2.1 ASM实例与数据库实例一对多的服务关系首先要破除一个常见的误解ASM实例不是一个完整的数据库实例。你可以把它理解为一个轻量级的、专门为管理磁盘组和文件而生的后台服务进程集合。它没有数据字典你无法用sqlplus连接到ASM实例去执行SELECT * FROM user_tables这样的操作。它的核心组件是ASM实例在单实例环境下或ASM1、ASM2在RAC环境下。而数据库实例比如orcl则是真正承载业务数据、执行SQL的“大脑”。一个ASM实例可以同时为多个数据库实例提供存储服务这是一种典型的一对多关系。当你启动一个使用ASM作为存储的数据库时数据库实例会向ASM实例“请求”打开相应的文件。所以我们操作ASM的命令大部分是在ASM实例的上下文中执行的。2.2 两种操作入口ASMCMD与SQL*Plus管理ASM主要有两个入口它们各有侧重ASMCMD命令行工具这是一个类似于操作系统命令行的工具专门用于管理ASM磁盘、磁盘组和文件。它的命令风格很像Linux命令ls,cd,cp,md_backup等直观易上手非常适合进行文件级的操作、空间查看和备份恢复。SQL*Plus连接ASM实例通过sqlplus / as sysasm或sqlplus sysASM as sysasm连接。这里可以执行更底层的管理命令主要针对磁盘组Disk Group的创建、修改、删除以及磁盘Disk的添加、删除、在线离线操作。很多ASMCMD命令的背后其实也是通过调用这些SQL语句来实现的。注意连接ASM实例时身份认证必须是SYSASM或SYSDBA权限。从Oracle 11g开始官方推荐使用SYSASM角色来管理ASM以与数据库管理的SYSDBA角色进行职责分离提升安全性。但在很多实际环境中为了简便SYSDBA也常常被使用。2.3 环境检查你的战场是否就绪在执行任何命令前先做一次快速检查总是没错的。这能避免很多“命令执行失败却不知为何”的尴尬。检查ASM实例状态# 在操作系统层面使用Oracle用户 srvctl status asm # 或者查看进程 ps -ef | grep asm_pmon如果使用srvctlOracle集群管理工具输出应为“ASM is running on node(s): ...”。看到asm_pmon进程也说明实例已启动。检查磁盘发现路径ASM如何找到磁盘靠的是ASM_DISKSTRING初始化参数。这个参数通常设置为像/dev/oracleasm/disks/*使用ASMLib时或/dev/asm*使用UDEV规则时这样的模式。-- 连接到ASM实例后查询 sqlplus / as sysasm SQL show parameter asm_diskstring确保这个参数设置的路径下确实存在你配置好的ASM磁盘权限为oracle:dba且可读写。这是后续所有磁盘操作的基础。3. 磁盘组Disk Group的生命周期管理磁盘组是ASM管理的最高层逻辑单元数据库的文件数据文件、控制文件、日志文件等都存放在磁盘组中。管理好磁盘组就管理好了数据库的“家”。3.1 创建磁盘组不仅仅是CREATE DISKGROUP创建磁盘组时你需要做出几个关键决策这些决策会影响性能、冗余和成本。-- 基本创建命令 CREATE DISKGROUP data NORMAL REDUNDANCY DISK /dev/oracleasm/disks/DISK1 NAME data_0001, /dev/oracleasm/disks/DISK2 NAME data_0002, /dev/oracleasm/disks/DISK3 NAME data_0003, /dev/oracleasm/disks/DISK4 NAME data_0004 ATTRIBUTE au_size4M, compatible.asm11.2, compatible.rdbms11.2;冗余级别RedundancyEXTERNAL REDUNDANCY外部冗余。ASM不提供镜像依赖底层存储如RAID提供保护。适用于已具备硬件RAID的高端存储。优点空间利用率100%。缺点ASM层面无保护。NORMAL REDUNDANCY正常冗余。默认双路镜像至少需要2个故障组Failure Group。数据会拷贝到另一个故障组。优点提供存储级高可用可容忍一个故障组失效。缺点空间利用率约50%。HIGH REDUNDANCY高冗余。三路镜像至少需要3个故障组。可容忍两个故障组同时失效。优点安全性最高。缺点空间利用率约33%成本高。分配单元大小AU_SIZE这是ASM分配空间的基本单位默认为1MB。对于大型数据仓库或Exadata通常会设置为4M、8M甚至16M以减少元数据开销提升大I/O性能。一旦磁盘组创建AU_SIZE不可更改所以创建前要根据数据文件大小和I/O模式慎重选择。故障组Failure Group这是实现NORMAL/HIGH冗余的关键概念。一个故障组是一组共享相同故障风险的磁盘例如同一个磁盘阵列的多个LUN、同一个JBOD机箱的所有磁盘。在创建命令中你可以用FAILGROUP fg1 DISK ...来指定。如果没有指定ASM默认每个磁盘自成一个故障组。最佳实践确保镜像副本位于不同的故障组才能真正实现故障隔离。兼容性参数COMPATIBLE.ASM/RDBMS这决定了磁盘组可以使用哪些ASM和数据库特性。例如要使用ASM Flex磁盘组11.2.0.2引入、文件组File Group等高级功能需要设置更高的兼容性。设置后只能升高不能降低。3.2 维护磁盘组扩容、收缩与监控数据库数据增长是常态磁盘组的维护是日常。添加磁盘扩容ALTER DISKGROUP data ADD DISK /dev/oracleasm/disks/DISK5 NAME data_0005; -- 或者使用通配符添加多个 ALTER DISKGROUP data ADD DISK /dev/oracleasm/disks/DISK*;添加磁盘后ASM会自动进行重平衡Rebalance将数据均匀分布到所有磁盘上。你可以通过V$ASM_OPERATION视图监控重平衡进度。重要提示重平衡是I/O密集型操作建议在业务低峰期进行并可以使用POWER参数限制其速度如ALTER DISKGROUP data REBALANCE POWER 5;。删除磁盘收缩或更换ALTER DISKGROUP data DROP DISK data_0005;删除磁盘同样会触发重平衡ASM会将该磁盘上的数据迁移到同磁盘组的其他磁盘上。务必确保磁盘组有足够的剩余空间来容纳被迁移的数据否则操作会失败。磁盘被DROP后其状态会变为FORMER此时可以从操作系统中安全地移除该物理磁盘。手动重平衡除了添加/删除磁盘有时你可能需要手动触发重平衡来优化I/O分布。ALTER DISKGROUP data REBALANCE POWER 11 WAIT;POWER范围是0-1111g以后可超过11值越高速度越快对系统I/O影响也越大。WAIT选项会让命令等待重平衡完成才返回适合在脚本中使用。如果不加WAIT命令会立即返回重平衡在后台运行。监控磁盘组状态与空间-- 查看所有磁盘组基本信息 SELECT name, state, type, total_mb, free_mb FROM v$asm_diskgroup; -- 查看磁盘组空间详情非常实用 SELECT name, total_mb, free_mb, ROUND((1 - (free_mb/total_mb)) * 100, 2) pct_used, usable_file_mb -- 对于NORMAL/HIGH冗余这是考虑冗余后的可用空间 FROM v$asm_diskgroup;usable_file_mb这个字段特别重要它告诉你考虑了镜像开销后还能创建多少MB的文件。当这个值很低时就需要考虑扩容了。3.3 卸载与挂载磁盘组磁盘组可以动态地从ASM实例卸载DISMOUNT和挂载MOUNT这在进行存储维护或迁移时非常有用。卸载磁盘组卸载后所有使用该磁盘组的数据库将无法访问其文件相关操作会挂起或报错。生产环境操作务必在变更窗口进行ALTER DISKGROUP data DISMOUNT;挂载磁盘组ALTER DISKGROUP data MOUNT;默认情况下ASM实例启动时会自动挂载所有磁盘组。你也可以在参数文件ASM_DISKGROUPS中指定需要自动挂载的磁盘组列表。4. ASM磁盘Disk的精细化管理磁盘是构成磁盘组的物理单元。管理好每一块磁盘是确保磁盘组健康的基础。4.1 磁盘状态解读与强制操作一块ASM磁盘会经历多种状态理解它们能帮你准确判断问题。常见状态NORMAL正常状态磁盘在线且可用。OFFLINE磁盘离线。可能是手动OFFLINE也可能是ASM检测到I/O错误后自动将其离线。离线磁盘上的数据由于有镜像副本通常仍可访问。DROPPING正在被删除DROP过程中重平衡尚未完成。FORMER已被成功删除不再属于任何磁盘组。UNKNOWNASM无法读取磁盘头信息可能路径错误或磁盘损坏。手动离线与在线当你需要临时更换一块磁盘的HBA卡线缆时可以先将其离线。-- 将磁盘离线 ALTER DISKGROUP data OFFLINE DISK data_0001; -- 完成维护后将其重新在线 ALTER DISKGROUP data ONLINE DISK data_0001;注意OFFLINE操作默认是DROP AFTER [number] DISK_REPAIR_TIME默认3.6小时的缩写。意思是如果你离线一块磁盘超过DISK_REPAIR_TIME时间仍未将其在线ASM会自动开始将其删除DROP这个行为非常关键我曾因此差点丢失磁盘。如果维护需要更长时间务必先修改磁盘组的DISK_REPAIR_TIME属性或者使用ALTER DISKGROUP data OFFLINE DISK data_0001 DROP AFTER 24H;来指定一个更长的时限。强制删除FORCE当一块磁盘损坏严重无法正常OFFLINE或DROP时可以使用FORCE选项。此操作危险它会忽略磁盘内容直接从磁盘组配置中移除该磁盘。你必须确保冗余机制镜像或外部RAID能保护数据不丢失。ALTER DISKGROUP data DROP DISK data_0001 FORCE;4.2 使用ASMCMD进行磁盘与文件操作ASMCMD工具在文件级操作上比SQL*Plus更直观。基本导航与查看asmcmd ASMCMD ls DATA/ FRA/ ASMCMD cd data ASMCMD ls -l # 你会看到类似ORCL/CONTROLFILE/、ORCL/DATAFILE/这样的目录结构 ASMCMD pwd dataASM的文件系统是层次化的磁盘组名/数据库名/文件类型/文件名。查看磁盘和空间信息ASMCMD lsdg State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Name MOUNTED EXTERN N 512 4096 1048576 511999 401111 0 401111 0 DATA/ MOUNTED EXTERN N 512 4096 1048576 204799 152222 0 152222 0 FRA/ ASMCMD lsdisk Path /dev/oracleasm/disks/DISK1 /dev/oracleasm/disks/DISK2文件操作cp在ASM和操作系统之间拷贝文件。这是备份控制文件、数据文件或传输数据文件的利器。# 将ASM中的控制文件拷贝到本地文件系统 ASMCMD cp data/ORCL/CONTROLFILE/current.256.123456789 /tmp/control01.ctl.bak # 将本地文件系统的数据文件拷贝到ASM ASMCMD cp /home/oracle/users01.dbf data/ORCL/DATAFILE/md_backup/md_restore备份和恢复ASM的元数据磁盘组结构。在磁盘组损坏或需要重建时这是救命稻草。# 备份所有已挂载磁盘组的元数据 ASMCMD md_backup /tmp/asm_metadata_backup.bak # 从备份恢复磁盘组结构需要先准备好物理磁盘 ASMCMD md_restore -t full -g DATA -i /tmp/asm_metadata_backup.bak5. 高级特性与性能调优命令掌握了基础管理后一些高级命令能让你在复杂场景下游刃有余。5.1 ASM Flex磁盘组与文件组从11.2.0.2开始ASM引入了Flex磁盘组和文件组提供了更灵活的冗余策略。创建Flex磁盘组CREATE DISKGROUP data FLEX REDUNDANCY DISK /dev/oracleasm/disks/DISK1, /dev/oracleasm/disks/DISK2 ATTRIBUTE compatible.asm11.2, compatible.rdbms11.2;Flex磁盘组允许你在文件级别File Group指定冗余策略而不是整个磁盘组。你可以为关键数据文件如SYSTEM表空间设置HIGH冗余为不那么重要的文件如临时表空间设置MIRROR或UNPROTECTED。管理文件组-- 创建文件组并指定冗余 ALTER DISKGROUP data ADD FILEGROUP userdata_fg SET REDUNDANCY HIGH; -- 创建表空间时指定文件组 CREATE TABLESPACE users DATAFILE DATA(userdata_fg) SIZE 100M;5.2 性能监控与调优相关视图当数据库性能出现I/O瓶颈时ASM层面的一些视图能提供关键线索。V$ASM_DISK_IOSTAT查看每个ASM磁盘的I/O统计信息读写次数、字节数、时间。这是定位“热点磁盘”的最直接工具。SELECT dg.name diskgroup, d.name disk_name, ios.reads, ios.writes, ios.read_time, ios.write_time, ios.read_errs, ios.write_errs FROM v$asm_disk d JOIN v$asm_diskgroup dg ON (d.group_number dg.group_number) JOIN v$asm_disk_iostat ios ON (d.disk_number ios.disk_number) WHERE dg.name DATA ORDER BY ios.reads ios.writes DESC;如果发现某几块磁盘的I/O远高于其他盘说明数据分布可能不均匀可以考虑手动触发一次重平衡。V$ASM_OPERATION监控正在进行的重平衡操作。SELECT group_number, operation, state, power, est_work, est_rate, est_minutes FROM v$asm_operation;EST_MINUTES可以估算剩余时间。如果重平衡卡在某个状态如WAITING太久可能需要检查是否有磁盘I/O故障。V$ASM_FILE查看ASM中所有文件的详细信息包括文件类型、块大小、空间使用等。结合V$DATAFILE可以找到具体数据文件在ASM中的位置和状态。6. 实战问题排查与应急场景命令手册理论说再多不如实战一场。下面这些是我在运维中真实遇到过的场景和解决命令堪称“保命锦囊”。6.1 场景一ASM磁盘组无法挂载现象ALTER DISKGROUP data MOUNT;失败报错类似“ORA-15032/ORA-15017”。排查思路检查磁盘路径和权限首先确认ASM_DISKSTRING参数包含的路径下磁盘设备是否存在并且oracle用户是否有读写权限。用ls -l /dev/oracleasm/disks/*检查。检查磁盘头状态使用kfed工具ASM磁盘编辑器慎用读取磁盘头信息。kfed read /dev/oracleasm/disks/DISK1 | grep -i kfdhdb.grpname查看grpname字段确认该磁盘是否属于你想挂载的磁盘组。如果磁盘头损坏grpname可能是乱码或空。检查是否有其他节点已挂载RAC环境在RAC中一个磁盘组通常只能被一个实例独占挂载除非是Flex ASM或特定配置。在其他节点上执行asmcmd lsdg看该磁盘组是否已被其他实例挂载。尝试强制挂载如果确认磁盘组元数据损坏但数据区可能完好可以尝试强制挂载进行抢救性数据导出。这是最后的手段有风险ALTER DISKGROUP data MOUNT FORCE;成功后立即使用RMAN或数据泵将关键数据导出。6.2 场景二ASM实例启动失败现象srvctl start asm或sqlplus / as sysasm连接失败asm_pmon进程不存在。排查思路检查OCR/Voting DiskRAC环境对于RACASM实例依赖于OCR和Voting Disk。使用ocrcheck和crsctl query css votedisk检查这些集群资源是否正常。检查ASM初始化参数文件ASM实例使用spfileASM.ora通常位于$ORACLE_HOME/dbs下。检查文件是否存在内容是否正确。可以尝试用pfile启动sqlplus / as sysasm SQL STARTUP PFILE/tmp/initASM.ora;检查Grid Infrastructure状态如果使用如果ASM由Grid Infrastructure管理先确保GI已正常启动crsctl stat res -t。6.3 场景三误删了ASM中的文件现象在ASMCMD中不小心rm了一个数据文件数据库报错文件丢失。应急处理立即停止数据库的进一步写入如果可能将受影响表空间或整个数据库置于只读模式防止覆盖。检查是否有备份这是最标准的恢复途径。使用RMAN从备份中恢复该数据文件。利用ASM的删除延迟特性如果可用在11g以后ASM删除文件时默认不会立即覆盖物理空间。你可以尝试从V$ASM_ALIAS的SYS_RECYCLEBIN目录下找回文件。但这并不可靠不能作为主要恢复手段。asmcmd ASMCMD cd data/.SYS_RECYCLEBIN ASMCMD ls # 可能会看到以删除时间命名的文件尝试cp出来从文件系统副本恢复如果你之前用asmcmd cp命令将该文件拷贝到过文件系统那么恭喜你直接拷贝回去即可。这再次证明了定期使用cp命令备份关键控制文件、参数文件到文件系统是个好习惯。6.4 常用诊断命令速查表问题场景首要检查命令关键视图/日志说明磁盘组空间不足asmcmd lsdgV$ASM_DISKGROUP关注Free_MB和Usable_file_MBI/O性能慢asmcmd iostatV$ASM_DISK_IOSTAT定位热点磁盘检查READ_TIME,WRITE_TIME重平衡进度慢/卡住SELECT * FROM V$ASM_OPERATION;ASM实例的alert_ASM.log检查STATE和EST_MINUTES查看日志有无I/O错误ASM实例无法连接ps -ef | grep asm_pmoncrsctl stat res ora.asm -t$ORACLE_HOME/log/ASM目录下日志检查进程、集群资源状态和日志错误磁盘离线或异常SELECT name, path, state FROM v$asm_disk;ASM实例的alert_ASM.log查看磁盘状态日志中常有自动离线的原因记录文件路径查找asmcmd find --type file *V$ASM_ALIAS,V$ASM_FILE在ASM中查找特定模式的文件名记住处理ASM问题尤其是生产环境胆大心细是关键。任何破坏性操作DROP,FORCE,MOUNT FORCE前务必确认冗余机制有效并尽可能做好备份。ASM的设计初衷是简化管理、提高可用性当你真正理解其原理和命令后它会成为你最可靠的存储伙伴。