Oracle ASM Administration on Linux – Complete Step-by-Step Guide
Master Oracle ASM Administration on Linux with this complete step-by-step guide. Learn ASM disk groups, ASMCA, ASMCMD, storage management, monitoring, and troubleshooting.
A complete production-ready SOP for Oracle Automatic Storage Management (ASM) administration on Linux. Covers ASM concepts, instance management, diskgroup operations, disk addition and removal, rebalance operations, ASMCMD usage, and full validation checks — with real commands, expected outputs, and consultant-level notes for both standard OFA and enterprise custom path conventions.
1. Document Info
| Item | Detail |
|---|---|
| Oracle Version | 19c (Grid Infrastructure 19.3+) |
| OS | Oracle Linux 7.x / RHEL 7.x or 8.x |
| ASM Type | Standalone (Non-RAC) |
| Grid Home | /u01/app/19.3.0/grid (Convention A) |
| Grid Home | /oracle/GRID/19.31 (Convention B) |
| MOS Reference | Doc ID 1187723.1 (ASM Administration Guide) |
| MOS Reference | Doc ID 265633.1 (ASM Disk Discovery) |
2. ASM Concepts — Read Before Anything Else
📝 What is ASM? ASM (Automatic Storage Management) is Oracle’s own volume manager and filesystem built specifically for Oracle database files. Instead of using OS-level filesystems (ext4, xfs) or third-party volume managers (LVM), Oracle manages the raw disks itself through ASM. It provides striping, mirroring, and automatic rebalancing without needing an OS volume manager.
📝 Why do companies use ASM? ASM gives better I/O performance than OS filesystems for Oracle workloads, provides built-in redundancy (mirroring), automatically rebalances data across disks when disks are added or removed, and is the required storage for Oracle RAC.
Key ASM Terms You Must Know
| Term | What It Means |
|---|---|
| ASM Instance | A special Oracle instance (not a database) that manages ASM storage. It runs alongside the database instance. Has its own SGA and background processes. |
| Diskgroup | A logical group of physical disks managed by ASM. Think of it like a volume group in LVM. Example: +DATA, +FRA, +REDO |
| ASM Disk | A raw disk or partition that has been added to a diskgroup. ASM labels these disks with a header. |
| Redundancy | How ASM mirrors data. EXTERNAL = no mirroring (relies on storage array). NORMAL = 2-way mirror. HIGH = 3-way mirror. |
| Rebalance | When disks are added or removed, ASM automatically redistributes data evenly across all disks. This is called rebalancing. |
| Allocation Unit (AU) | The smallest unit of storage ASM allocates. Default is 1MB. Can be set to 4MB, 8MB, 16MB, 32MB, 64MB during diskgroup creation. |
| ASMCMD | ASM Command Line utility — like a shell for navigating ASM diskgroups. Similar to Unix shell commands (ls, cd, mkdir, cp). |
| ASM Filter Driver (ASMFD) | A kernel driver that protects ASM disks from accidental writes by non-ASM processes. Recommended in 19c. |
| GRID_HOME | Separate Oracle Home where Grid Infrastructure (which includes ASM) is installed. Different from ORACLE_HOME. |
| +DATA | Conventional name for the diskgroup that holds database datafiles. |
| +FRA | Conventional name for the Fast Recovery Area diskgroup (archivelogs, RMAN backups, flashback logs). |
| +REDO | Conventional name for the diskgroup that holds online redo logs (some companies separate redo for performance). |
3. Path Conventions for ASM / Grid
📝 Important: ASM is part of Oracle Grid Infrastructure. Grid Infrastructure has its OWN separate Oracle Home (GRID_HOME) — completely separate from the database ORACLE_HOME. You must switch between them carefully.
| Item | Convention A | Convention B |
|---|---|---|
| Grid Home | /u01/app/19.3.0/grid | /oracle/GRID/19.31 |
| Oracle Base | /u01/app/oracle | /oracle |
| DB Oracle Home | /u01/app/oracle/product/19.3.0/dbhome_1 | /oracle/RDBMS/19.31 |
| ASM SID | +ASM | +ASM |
| ASM Data diskgroup | +DATA | +DATA |
| ASM FRA diskgroup | +FRA | +FRA |
How to Switch Between Grid Home and DB Home
📝 Why? Many ASM commands must be run from GRID_HOME, not ORACLE_HOME. If you run ASM commands from the wrong home, you get incorrect results or errors. Always check which home you are in before running ASM commands.
su - oracle
# Check which home is currently active
echo $ORACLE_HOME
# Switch to GRID HOME
export ORACLE_HOME=/u01/app/19.3.0/grid # Convention A
# export ORACLE_HOME=/oracle/GRID/19.31 # Convention B
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=+ASM
# Verify you are now in Grid Home
echo $ORACLE_HOME
echo $ORACLE_SID
# Switch back to DB Home
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1 # Convention A
# export ORACLE_HOME=/oracle/RDBMS/19.31 # Convention B
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=ORCL📝 Tip: Create two aliases in
~/.bash_profileto switch quickly:
alias asmenv='export ORACLE_HOME=/u01/app/19.3.0/grid; export ORACLE_SID=+ASM; export PATH=$ORACLE_HOME/bin:$PATH; echo "Switched to ASM/Grid Home"'
alias dbenv='export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1; export ORACLE_SID=ORCL; export PATH=$ORACLE_HOME/bin:$PATH; echo "Switched to DB Home"'4. Pre-Activity Checks
⚠️ IMPORTANT: Always run these checks before performing any ASM administration activity — whether adding disks, dropping disks, creating diskgroups, or any other operation.
4.1 — Check ASM Instance is Running
📝 Why? All ASM operations require the ASM instance to be up. If it is down, database cannot access its datafiles and ASM commands will fail.
# Switch to Grid Home
export ORACLE_HOME=/u01/app/19.3.0/grid
export ORACLE_SID=+ASM
export PATH=$ORACLE_HOME/bin:$PATH
# Check ASM instance process is running
ps -ef | grep asm_pmon | grep -v grepExpected output:
oracle 12345 1 0 10:00 ? 00:00:00 asm_pmon_+ASM⚠️ IMPORTANT: If
asm_pmon_+ASMis not in the process list, the ASM instance is down. Start it before proceeding (see Section 5.1).
4.2 — Connect to ASM Instance and Check Status
# Connect to ASM instance
sqlplus / as sysasmset linesize 150
set pagesize 50
col instance_name for a15
col status for a12
col version for a15
col host_name for a30
-- Check ASM instance status
SELECT instance_name, status, version, host_name
FROM v$instance;Expected output:
INSTANCE_NAME STATUS VERSION HOST_NAME
--------------- ------------ ----------------- --------------------
+ASM STARTED 19.0.0.0.0 dbserver014.3 — Check All Diskgroups and Their Status
📝 Why? Before any disk operation, you must know the current state of all diskgroups — their mount status, redundancy type, total space, free space, and number of disks. A diskgroup in DISMOUNTED or ERROR state needs immediate attention.
-- Connect to ASM instance
sqlplus / as sysasm
set linesize 200
set pagesize 100
col name for a15
col state for a12
col type for a10
col total_gb for 99999.99
col free_gb for 99999.99
col used_pct for 999.99
col offline_disks for 999
SELECT name,
state,
type,
total_mb/1024 total_gb,
free_mb/1024 free_gb,
ROUND((1 - free_mb/total_mb)*100, 2) used_pct,
offline_disks
FROM v$asm_diskgroup
ORDER BY name;What to look for:
STATEmust beMOUNTEDfor all diskgroupsoffline_disksmust be0— any non-zero value means a disk has failedused_pctabove 85% needs attention before adding more data
4.4 — Check All ASM Disks and Their Status
📝 Why? Confirms all disks in each diskgroup are healthy. A single failed disk in a diskgroup with EXTERNAL redundancy means total diskgroup failure. Must be checked before any maintenance.
set linesize 220
set pagesize 100
col group_number for 999
col disk_number for 999
col name for a20
col path for a35
col state for a12
col mode_status for a12
col total_gb for 99999.99
col free_gb for 99999.99
col header_status for a15
SELECT d.group_number,
d.disk_number,
d.name,
d.path,
d.state,
d.mode_status,
d.header_status,
d.total_mb/1024 total_gb,
d.free_mb/1024 free_gb
FROM v$asm_disk d
ORDER BY d.group_number, d.disk_number;What to look for:
STATEmust beNORMALfor all disksMODE_STATUSmust beONLINEfor all disksHEADER_STATUSmust beMEMBERfor disks inside a diskgroup orCANDIDATEfor new unconfigured disks
4.5 — Check ASM Rebalance Operations in Progress
📝 Why? If a rebalance is already running (from a previous disk add/remove), you must know about it before starting any new disk operations. Starting a new operation during an active rebalance can cause performance issues.
set linesize 180
set pagesize 50
col group_number for 999
col operation for a15
col state for a12
col power for 999
col actual for 999
col sofar for 99999999
col est_work for 99999999
col est_minutes for 9999
SELECT group_number, operation, state, power,
actual, sofar, est_work, est_minutes
FROM v$asm_operation;What to look for: No rows = no rebalance in progress (good). If rows exist, note the est_minutes to understand how long before it completes.
4.6 — Check Available Raw Disks for ASM (New Disks)
📝 Why? When adding new disks to ASM, you must first identify the disk device paths. You also need to confirm they are truly new/empty and not already in use by the OS or another application.
# As root — list all block devices
lsblk
# Show all disks and their current usage
fdisk -l 2>/dev/null | grep "^Disk /dev" | grep -v loop
# Check which disks have no partition table (these are candidates for ASM)
for disk in /dev/sd*; do
echo "=== $disk ==="
fdisk -l $disk 2>/dev/null | head -3
done
# Check if any disk already has ASM header (has been used by ASM before)
$ORACLE_HOME/bin/asmtool -list -prefix /dev/sd 2>/dev/null⚠️ IMPORTANT: Never add a disk to ASM if it already has data on it — ASM will overwrite the disk header and all existing data will be lost. Confirm with your storage team that the disks are newly presented and empty.
5. ASM Instance Management
5.1 — Start ASM Instance
📝 Why? The ASM instance must be started before any database that uses ASM storage can start. On standalone servers with Grid Infrastructure, ASM is usually managed by the Grid stack (not manual startup). But knowing the manual startup is essential for troubleshooting.
# Switch to Grid Home
export ORACLE_HOME=/u01/app/19.3.0/grid
export ORACLE_SID=+ASM
export PATH=$ORACLE_HOME/bin:$PATH
sqlplus / as sysasm-- Start ASM instance
STARTUP;
-- Verify it is started
SELECT instance_name, status FROM v$instance;
EXIT;5.2 — Shut Down ASM Instance
⚠️ IMPORTANT: You CANNOT shut down the ASM instance if any database is currently using ASM storage. You must shut down all databases first, then shut down ASM.
# Step 1 — Shut down the database first
export ORACLE_SID=ORCL
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
sqlplus / as sysdbaSHUTDOWN IMMEDIATE;
EXIT;# Step 2 — Now shut down ASM
export ORACLE_HOME=/u01/app/19.3.0/grid
export ORACLE_SID=+ASM
export PATH=$ORACLE_HOME/bin:$PATH
sqlplus / as sysasm-- NORMAL waits for all ASM clients (databases) to disconnect
SHUTDOWN NORMAL;
EXIT;5.3 — Check ASM Background Processes
📝 Why? ASM has specific background processes similar to a database. Knowing them helps you confirm ASM is healthy and troubleshoot when something is wrong.
# List all ASM background processes
ps -ef | grep "+ASM" | grep -v grepKey ASM processes you should see:
| Process | What It Does |
|---|---|
| asm_pmon_+ASM | Process Monitor — cleans up failed ASM processes |
| asm_rbal_+ASM | Rebalance coordinator — manages disk rebalancing |
| asm_gmon_+ASM | Group Monitor — monitors diskgroup health |
| asm_lgwr_+ASM | Log Writer — writes ASM redo |
| asm_dbw0_+ASM | Database Writer — writes ASM metadata |
| asm_asmb_+ASM | ASM Bridge — communication between ASM and databases |
6. Diskgroup Operations
6.1 — Create a New Diskgroup
📝 Why? You create diskgroups when setting up a new environment or when adding additional storage groups (e.g., a separate +REDO diskgroup for redo logs). A diskgroup can be created while ASM and the database are both running — no downtime needed.
📝 Redundancy choices:
EXTERNAL REDUNDANCY— No ASM mirroring. Used when the storage array provides its own RAID protection. Most common in enterprise environments with SAN storage.NORMAL REDUNDANCY— 2-way mirror. ASM keeps two copies of every extent. Needs at least 2 failure groups (disks from different controllers).HIGH REDUNDANCY— 3-way mirror. Needs at least 3 failure groups. Maximum protection but uses 3x storage.
-- Connect to ASM instance
sqlplus / as sysasm
-- Example 1: Create +DATA diskgroup with EXTERNAL redundancy (SAN storage)
-- AU_SIZE = 4MB (good for OLTP databases with mixed I/O)
CREATE DISKGROUP DATA
EXTERNAL REDUNDANCY
DISK '/dev/sdb', '/dev/sdc', '/dev/sdd'
ATTRIBUTE 'AU_SIZE' = '4M',
'COMPATIBLE.ASM' = '19.0',
'COMPATIBLE.RDBMS'= '19.0';
-- Example 2: Create +FRA diskgroup with NORMAL redundancy (2-way mirror)
-- Needs disks from at least 2 different failure groups
CREATE DISKGROUP FRA
NORMAL REDUNDANCY
FAILGROUP FG1 DISK '/dev/sde' NAME FRA_0001
FAILGROUP FG2 DISK '/dev/sdf' NAME FRA_0002
ATTRIBUTE 'AU_SIZE' = '4M',
'COMPATIBLE.ASM' = '19.0',
'COMPATIBLE.RDBMS'= '19.0';-- Verify new diskgroup is mounted and healthy
set linesize 200
set pagesize 50
col name for a15
col state for a12
col type for a10
col total_gb for 99999.99
col free_gb for 99999.99
SELECT name, state, type,
total_mb/1024 total_gb,
free_mb/1024 free_gb
FROM v$asm_diskgroup
ORDER BY name;6.2 — Add Disks to Existing Diskgroup
📝 Why? When a diskgroup is running out of space, you add more disks to it. ASM automatically starts a rebalance operation after disk addition to evenly spread data across all disks including the new ones. The database stays online during this entire operation.
sqlplus / as sysasm
-- Add one disk to +DATA diskgroup
ALTER DISKGROUP DATA ADD DISK '/dev/sdg' NAME DATA_0004;
-- Add multiple disks at once
ALTER DISKGROUP DATA ADD DISK
'/dev/sdg' NAME DATA_0004,
'/dev/sdh' NAME DATA_0005,
'/dev/sdi' NAME DATA_0006;
-- Add disk with specific rebalance power (1=slow/low impact, 11=fast/high impact)
-- Higher power = faster rebalance but more I/O impact on database
ALTER DISKGROUP DATA ADD DISK '/dev/sdg' NAME DATA_0004
REBALANCE POWER 4;-- Monitor rebalance progress after disk addition
set linesize 180
set pagesize 50
col group_number for 999
col operation for a15
col state for a12
col power for 999
col sofar for 99999999
col est_work for 99999999
col est_minutes for 9999
SELECT group_number, operation, state, power,
sofar, est_work, est_minutes
FROM v$asm_operation;
-- Run this repeatedly until no rows returned (rebalance complete)6.3 — Drop a Disk from a Diskgroup
📝 Why? You drop a disk when replacing a failed or degraded disk, or when reorganizing storage. When you drop a disk, ASM automatically moves all data from that disk to other disks in the group before removing it.
⚠️ IMPORTANT: Never drop a disk if the diskgroup does not have enough free space to absorb the data from that disk. Check free space first. If
free_gb < disk_size_gb, the drop will fail.
sqlplus / as sysasm
-- Check disk name and size before dropping
set linesize 200
set pagesize 50
col name for a20
col path for a30
col state for a12
col total_gb for 9999.99
col free_gb for 9999.99
SELECT name, path, state, total_mb/1024 total_gb, free_mb/1024 free_gb
FROM v$asm_disk
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')
ORDER BY name;
-- Drop a specific disk (ASM will rebalance remaining data first)
ALTER DISKGROUP DATA DROP DISK DATA_0004;
-- Drop with specific rebalance power
ALTER DISKGROUP DATA DROP DISK DATA_0004 REBALANCE POWER 6;
-- Monitor the rebalance/drop progress
SELECT group_number, operation, state, power, sofar, est_work, est_minutes
FROM v$asm_operation;⚠️ IMPORTANT: Do NOT physically remove the disk from the server until
v$asm_operationshows no rows andv$asm_diskno longer lists that disk. Removing the physical disk too early will cause diskgroup errors.
6.4 — Drop an Entire Diskgroup
📝 Why? Needed when decommissioning a database or reorganizing storage completely. All database files in the diskgroup must be removed first.
⚠️ IMPORTANT: Dropping a diskgroup destroys ALL data in it permanently. Triple-check you are dropping the correct diskgroup. Ensure no database is using any file in this diskgroup.
sqlplus / as sysasm
-- First confirm no database files exist in this diskgroup
set linesize 200
set pagesize 100
col group_number for 999
col name for a40
col type for a20
SELECT group_number, name, type
FROM v$asm_alias
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')
ORDER BY type, name;
-- If no files exist, drop the diskgroup
-- INCLUDING CONTENTS drops even if files exist (use carefully)
DROP DISKGROUP DATA INCLUDING CONTENTS;
-- Verify it is gone
SELECT name, state FROM v$asm_diskgroup;6.5 — Mount and Dismount Diskgroups
📝 Why? Sometimes a diskgroup gets automatically dismounted due to a disk failure or manual operation. You need to know how to mount it back without restarting ASM.
sqlplus / as sysasm
-- Mount a dismounted diskgroup
ALTER DISKGROUP DATA MOUNT;
-- Dismount a diskgroup (database must not be using it)
ALTER DISKGROUP DATA DISMOUNT;
-- Mount ALL diskgroups (useful after ASM restart)
ALTER DISKGROUP ALL MOUNT;
-- Verify mount status
SELECT name, state FROM v$asm_diskgroup ORDER BY name;6.6 — Resize a Disk in Diskgroup
📝 Why? If your storage team has extended the size of an existing LUN/disk, you can resize it in ASM without dropping and re-adding it.
sqlplus / as sysasm
-- Resize specific disk to new size in MB
ALTER DISKGROUP DATA RESIZE DISK DATA_0001 SIZE 102400M;
-- Resize ALL disks in the diskgroup to their actual current size
ALTER DISKGROUP DATA RESIZE ALL;
-- Verify new sizes
SELECT name, total_mb/1024 total_gb FROM v$asm_disk
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA');6.7 — Control Rebalance Power
📝 Why? Rebalancing consumes I/O resources. During business hours you want low power (less impact on database). During maintenance window you want high power (faster completion).
sqlplus / as sysasm
-- Change rebalance power on the fly (no restart needed)
-- Power values: 1 (minimum) to 11 (maximum)
-- 0 = pause rebalance completely
ALTER DISKGROUP DATA REBALANCE POWER 8; -- Speed up during maintenance window
ALTER DISKGROUP DATA REBALANCE POWER 2; -- Slow down during business hours
ALTER DISKGROUP DATA REBALANCE POWER 0; -- Pause rebalance temporarily
-- Check current rebalance status and power
SELECT group_number, operation, state, power, sofar, est_minutes
FROM v$asm_operation;7. ASMCMD — ASM Command Line Navigation
📝 What is ASMCMD? ASMCMD is a command-line interface for navigating ASM diskgroups just like a Unix shell. You can list files, create directories, copy files, delete files, and check disk usage — all inside ASM.
7.1 — Launch ASMCMD
# Switch to Grid Home and ASM SID
export ORACLE_HOME=/u01/app/19.3.0/grid
export ORACLE_SID=+ASM
export PATH=$ORACLE_HOME/bin:$PATH
# Launch ASMCMD
asmcmd7.2 — Common ASMCMD Commands
📝 All commands below are run from inside the
ASMCMD>prompt.
# Show current location (like pwd in Unix)
ASMCMD> pwd
# List diskgroups (from root level)
ASMCMD> ls
# Navigate into a diskgroup
ASMCMD> cd +DATA
# List contents of diskgroup
ASMCMD> ls -l
# Navigate into database directory inside diskgroup
ASMCMD> cd +DATA/ORCL
# List all datafiles for database ORCL
ASMCMD> ls -l
# Show disk usage for a diskgroup (like du in Unix)
ASMCMD> du
# Show disk usage for specific directory
ASMCMD> du +DATA/ORCL/DATAFILE
# Find a specific file by name pattern
ASMCMD> find +DATA -name '*.dbf'
# Check diskgroup attributes
ASMCMD> lsattr -G DATA -l
# List all disks in all diskgroups
ASMCMD> lsdsk -k
# List only disks in a specific diskgroup
ASMCMD> lsdsk -G DATA
# Create a directory inside ASM
ASMCMD> mkdir +DATA/ORCL/MYDIR
# Copy a file within ASM
ASMCMD> cp +DATA/ORCL/DATAFILE/users.dbf +FRA/ORCL/DATAFILE/users_copy.dbf
# Delete a file from ASM
ASMCMD> rm +DATA/ORCL/DATAFILE/temp_old.tmp
# Check ASM instance status from ASMCMD
ASMCMD> lsct
# Exit ASMCMD
ASMCMD> exit7.3 — ASMCMD in Batch / Non-Interactive Mode
📝 Why? Useful for scripting — you can run a single ASMCMD command without entering the interactive prompt.
# Run single command without entering interactive mode
asmcmd ls +DATA
asmcmd du +DATA/ORCL
asmcmd lsdsk -G DATA
asmcmd lsattr -G DATA -l
# Run multiple commands via script
asmcmd <<EOF
ls +DATA
ls +FRA
du +DATA/ORCL/DATAFILE
exit
EOF8. ASM Disk Discovery
📝 What is disk discovery? When ASM starts, it searches for disks using a discovery path pattern. Only disks found in this path can be added to diskgroups. The discovery path is controlled by the
ASM_DISKSTRINGparameter.
8.1 — Check Current Disk Discovery Path
sqlplus / as sysasm
set linesize 150
set pagesize 50
col name for a25
col value for a60
-- Show current discovery string
SELECT name, value
FROM v$asm_attribute
WHERE name = 'ASM_DISKSTRING'
UNION
SELECT name, value
FROM v$spparameter
WHERE name = 'asm_diskstring';8.2 — Check What Disks ASM Can Discover
-- List all disks ASM can currently see (candidate + member disks)
set linesize 200
set pagesize 100
col path for a35
col header_status for a15
col mode_status for a12
col state for a12
col name for a20
SELECT path, header_status, mode_status, state, name
FROM v$asm_disk
ORDER BY header_status, path;Header status meanings:
| Header Status | Meaning |
|---|---|
| MEMBER | Disk belongs to an ASM diskgroup |
| CANDIDATE | Disk is visible to ASM but not yet in a diskgroup |
| FORMER | Disk was previously in a diskgroup (has old ASM header) |
| PROVISIONED | Disk is reserved for ASM but not yet added |
| UNKNOWN | ASM cannot read the disk header |
8.3 — Change Disk Discovery String
📝 Why? When your storage team presents new disks at a different device path than what ASM currently discovers, you must update the discovery string.
sqlplus / as sysasm
-- Add new path to discovery string (keep existing paths, add new one)
ALTER SYSTEM SET ASM_DISKSTRING = '/dev/sd*', '/dev/oracleasm/disks/*'
SCOPE=BOTH SID='+ASM';
-- Verify
SHOW PARAMETER asm_diskstring;9. ASM Preferred Mirror Read (For Future RAC Reference)
📝 Note: This section is included for awareness as you will encounter it in RAC environments. In standalone ASM it is not applicable, but knowing this concept now helps when you reach the RAC SOP.
📝 In RAC with NORMAL or HIGH redundancy diskgroups, each node can be configured to read from the mirror copy of data that is physically closest to it (on the same SAN zone or controller). This reduces read latency. Configured via
ASM_PREFERRED_READ_FAILURE_GROUPSparameter.
10. Post-Activity Checks
⚠️ IMPORTANT: Run these checks after every ASM administration activity — whether you added disks, created diskgroups, or performed any other operation.
10.1 — Verify All Diskgroups Are Mounted
sqlplus / as sysasm
set linesize 200
set pagesize 100
col name for a15
col state for a12
col type for a10
col total_gb for 99999.99
col free_gb for 99999.99
col used_pct for 999.99
col offline_disks for 999
SELECT name,
state,
type,
total_mb/1024 total_gb,
free_mb/1024 free_gb,
ROUND((1 - free_mb/total_mb)*100, 2) used_pct,
offline_disks
FROM v$asm_diskgroup
ORDER BY name;What to look for:
- All diskgroups show
MOUNTED offline_disks= 0 for all diskgroupsused_pctis within acceptable range
10.2 — Verify All Disks Are Online
set linesize 220
set pagesize 100
col group_number for 999
col disk_number for 999
col name for a20
col path for a35
col state for a12
col mode_status for a12
col header_status for a15
col total_gb for 9999.99
SELECT d.group_number,
d.disk_number,
d.name,
d.path,
d.state,
d.mode_status,
d.header_status,
d.total_mb/1024 total_gb
FROM v$asm_disk d
WHERE d.group_number > 0
ORDER BY d.group_number, d.disk_number;10.3 — Verify No Rebalance is Running (After Completion)
-- Should return no rows after rebalance completes
SELECT group_number, operation, state, power, sofar, est_minutes
FROM v$asm_operation;10.4 — Verify Database Can Still Access ASM Files
# Switch back to DB Home
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH
sqlplus / as sysdbaset linesize 200
set pagesize 100
col file# for 999
col tablespace_name for a25
col status for a12
col name for a70
-- Confirm all datafiles are accessible
SELECT file#, tablespace_name, status, name
FROM v$datafile
ORDER BY file#;
-- Confirm database is open
SELECT name, open_mode FROM v$database;10.5 — Check ASM Alert Log for Errors
# Find ASM alert log location
export ORACLE_HOME=/u01/app/19.3.0/grid
export ORACLE_SID=+ASM
sqlplus -s / as sysasm <<EOF
set linesize 200 pagesize 0
col value for a80
SELECT value FROM v\$diag_info WHERE name = 'Diag Trace';
EXIT;
EOF
# Scan ASM alert log for errors
# Convention A:
tail -200 /u01/app/oracle/diag/asm/+asm/+ASM/trace/alert_+ASM.log \
| grep -E "ORA-|Error|WARNING|FAILED|DISMOUNT"
# Convention B:
tail -200 /oracle/diag/asm/+asm/+ASM/trace/alert_+ASM.log \
| grep -E "ORA-|Error|WARNING|FAILED|DISMOUNT"10.6 — Verify ASM Diskgroup Attributes
📝 Why? Diskgroup attributes like
COMPATIBLE.ASMandCOMPATIBLE.RDBMScontrol which Oracle version can use the diskgroup. After upgrades or new diskgroup creation, confirm these are set correctly.
sqlplus / as sysasm
set linesize 180
set pagesize 100
col dg_name for a15
col name for a30
col value for a30
SELECT dg.name dg_name, a.name, a.value
FROM v$asm_attribute a,
v$asm_diskgroup dg
WHERE a.group_number = dg.group_number
AND a.name IN ('compatible.asm','compatible.rdbms','au_size','cell.smart_scan_capable')
ORDER BY dg.name, a.name;11. Quick Reference Card
| Task | Command |
|---|---|
| Switch to ASM env | export ORACLE_SID=+ASM; export ORACLE_HOME=<GRID_HOME> |
| Connect to ASM | sqlplus / as sysasm |
| Start ASM | sqlplus / as sysasm → STARTUP; |
| Stop ASM | sqlplus / as sysasm → SHUTDOWN NORMAL; |
| Check ASM process | ps -ef | grep asm_pmon | grep -v grep |
| Check diskgroup status | SELECT name,state,total_mb/1024,free_mb/1024 FROM v$asm_diskgroup; |
| Check disk status | SELECT name,path,state,mode_status FROM v$asm_disk ORDER BY group_number; |
| Check rebalance | SELECT group_number,operation,state,power,est_minutes FROM v$asm_operation; |
| Create diskgroup | CREATE DISKGROUP DATA EXTERNAL REDUNDANCY DISK '/dev/sdb'; |
| Add disk | ALTER DISKGROUP DATA ADD DISK '/dev/sdg' NAME DATA_0004; |
| Drop disk | ALTER DISKGROUP DATA DROP DISK DATA_0004; |
| Mount diskgroup | ALTER DISKGROUP DATA MOUNT; |
| Dismount diskgroup | ALTER DISKGROUP DATA DISMOUNT; |
| Rebalance power | ALTER DISKGROUP DATA REBALANCE POWER 8; |
| Resize disk | ALTER DISKGROUP DATA RESIZE ALL; |
| Launch ASMCMD | asmcmd |
| List ASM files | asmcmd ls +DATA/ORCL |
| ASM disk usage | asmcmd du +DATA/ORCL |
| Find file in ASM | asmcmd find +DATA -name '*.dbf' |
| List all disks | asmcmd lsdsk -k |
| Check discovery path | SHOW PARAMETER asm_diskstring; |
| Check ASM alert log | tail -200 alert_+ASM.log | grep ORA- |
| MOS ASM Admin Guide | Doc ID 1187723.1 |
| MOS Disk Discovery | Doc ID 265633.1 |
This SOP covers everything you need to administer Oracle ASM on a standalone Linux server without referring to any other source. Always check diskgroup free space before adding or dropping disks, always monitor rebalance progress after any disk operation, and always verify the database can still access its datafiles after any ASM change.

