Skip to content

ORA-15001 Diskgroup Does Not Exist or Not Mounted - ASM Storage Error

ORA-15001: Diskgroup Does Not Exist or Is Not Mounted

Section titled “ORA-15001: Diskgroup Does Not Exist or Is Not Mounted”

Error Text: ORA-15001: diskgroup "diskgroup_name" does not exist or is not mounted

This error occurs when attempting to access an ASM (Automatic Storage Management) diskgroup that either doesn’t exist in the ASM instance or is not currently mounted. It’s a common error when working with ASM storage, often encountered during database operations, file creation, or diskgroup management tasks.

ASM Architecture
├── ASM Instance (+ASM)
│ ├── ASM Processes (RBAL, ARBn, GMON)
│ ├── ASM Metadata
│ └── Diskgroup Management
├── Diskgroups
│ ├── ASM Disks
│ ├── Failure Groups
│ └── ASM Files
└── Database Instances
├── Database Files on ASM
└── ASM Client Processes
Diskgroup Lifecycle
├── DISMOUNTED - Not available for use
├── MOUNTED - Available for ASM operations
├── RESTRICTED - Limited access mode
└── FORCING - Forced mount with missing disks
  • ASM instance restarted without auto-mount
  • Manual dismount performed
  • Mount failure due to disk issues
  • Insufficient ASM processes
-- Diskgroup was dropped
-- Diskgroup name misspelled
-- Wrong ASM instance
-- Diskgroup created on different storage
  • ASM instance not running
  • Database not configured to use ASM
  • Incorrect ASM_DISKGROUPS parameter
  • Grid Infrastructure problems
  • Disk path changes
  • Storage array issues
  • Multipathing problems
  • Disk permissions incorrect
-- Connect to ASM instance
sqlplus / as sysasm
-- Check ASM instance status
SELECT instance_name, status, version FROM v$instance;
-- List all diskgroups and their status
SELECT name, state, type, total_mb, free_mb
FROM v$asm_diskgroup
ORDER BY name;
-- Check specific diskgroup
SELECT * FROM v$asm_diskgroup WHERE name = 'DISKGROUP_NAME';
-- Check ASM disk discovery string
SHOW PARAMETER asm_diskstring;
-- List all discovered disks
SELECT path, header_status, state, total_mb, free_mb
FROM v$asm_disk
ORDER BY path;
-- Check disks for specific diskgroup
SELECT d.path, d.header_status, dg.name as diskgroup_name
FROM v$asm_disk d, v$asm_diskgroup dg
WHERE d.group_number = dg.group_number(+)
ORDER BY dg.name, d.path;
Terminal window
# Check CRS status
crsctl stat res -t
# Check ASM resource
crsctl stat res ora.asm -t
# Check diskgroup resources
crsctl stat res ora.*.dg -t
# Check ASM disk status
oracleasm listdisks
# or
ls -la /dev/oracleasm/disks/
-- Connect to database instance
sqlplus / as sysdba
-- Check if using ASM
SHOW PARAMETER db_create_file_dest;
SHOW PARAMETER db_recovery_file_dest;
-- Check ASM diskgroups visible to database
SELECT name FROM v$asm_diskgroup;
-- Check datafiles on ASM
SELECT file_name FROM dba_data_files
WHERE file_name LIKE '+%';
-- Connect to ASM instance
sqlplus / as sysasm
-- Mount specific diskgroup
ALTER DISKGROUP data MOUNT;
-- Mount all diskgroups
ALTER DISKGROUP ALL MOUNT;
-- Force mount if disks missing
ALTER DISKGROUP data MOUNT FORCE;
-- Mount in restricted mode
ALTER DISKGROUP data MOUNT RESTRICTED;
Terminal window
# Start ASMCMD
asmcmd
# List diskgroups
ASMCMD> lsdg
# Mount diskgroup
ASMCMD> mount DATA
# Mount all diskgroups
ASMCMD> mount -a
-- Check current setting
SHOW PARAMETER asm_diskgroups;
-- Add diskgroup to auto-mount list
ALTER SYSTEM SET asm_diskgroups='DATA,FRA,REDO' SCOPE=BOTH;
-- Or add single diskgroup
ALTER SYSTEM SET asm_diskgroups='DATA' SCOPE=BOTH SID='+ASM1';
Terminal window
# Add diskgroup to Grid Infrastructure
srvctl add diskgroup -g DATA
# Enable auto-start
srvctl enable diskgroup -g DATA
# Start diskgroup
srvctl start diskgroup -g DATA
-- Check current discovery string
SHOW PARAMETER asm_diskstring;
-- Update discovery string
ALTER SYSTEM SET asm_diskstring='/dev/oracleasm/disks/*','/dev/sd*' SCOPE=BOTH;
-- For specific paths
ALTER SYSTEM SET asm_diskstring='/dev/mapper/asm*' SCOPE=BOTH;
Terminal window
# Check disk ownership and permissions
ls -la /dev/oracleasm/disks/
# Fix permissions if needed
chown grid:asmadmin /dev/oracleasm/disks/*
chmod 660 /dev/oracleasm/disks/*
# For raw devices
chown grid:asmadmin /dev/sd*
chmod 660 /dev/sd*
-- Find candidate disks
SELECT path, header_status, total_mb
FROM v$asm_disk
WHERE header_status = 'CANDIDATE'
ORDER BY path;
-- Create diskgroup with external redundancy
CREATE DISKGROUP data EXTERNAL REDUNDANCY
DISK '/dev/oracleasm/disks/DISK1';
-- Create with normal redundancy
CREATE DISKGROUP data NORMAL REDUNDANCY
FAILGROUP fg1 DISK '/dev/oracleasm/disks/DISK1'
FAILGROUP fg2 DISK '/dev/oracleasm/disks/DISK2';
-- Create with high redundancy
CREATE DISKGROUP data HIGH REDUNDANCY
FAILGROUP fg1 DISK '/dev/oracleasm/disks/DISK1'
FAILGROUP fg2 DISK '/dev/oracleasm/disks/DISK2'
FAILGROUP fg3 DISK '/dev/oracleasm/disks/DISK3';
-- Check disk headers
SELECT disk_number, path, header_status, mode_status, state
FROM v$asm_disk
WHERE header_status != 'MEMBER';
-- Repair disk header
ALTER DISKGROUP data CHECK DISK '/dev/oracleasm/disks/DISK1' REPAIR;
-- Force disk online
ALTER DISKGROUP data ONLINE DISK '/dev/oracleasm/disks/DISK1' FORCE;
Terminal window
# Check ASM metadata
kfed read /dev/oracleasm/disks/DISK1
# Backup ASM metadata
dd if=/dev/oracleasm/disks/DISK1 of=/tmp/asm_disk1_header.bak bs=4096 count=1
# Check disk group metadata
amdu -diskstring '/dev/oracleasm/disks/*' -dump 'DATA'
-- Mount with missing disks
ALTER DISKGROUP data MOUNT FORCE;
-- Check missing disks
SELECT path, header_status, failgroup
FROM v$asm_disk
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')
AND header_status != 'MEMBER';
-- Drop missing disks
ALTER DISKGROUP data DROP DISK data_0001 FORCE;
#!/bin/bash
# ASM diskgroup monitoring
export ORACLE_HOME=/u01/app/19.0.0/grid
export ORACLE_SID=+ASM
export PATH=$ORACLE_HOME/bin:$PATH
check_diskgroups() {
echo "Checking ASM diskgroups..."
sqlplus -s / as sysasm << EOF
SET PAGESIZE 0 FEEDBACK OFF HEADING OFF
SELECT 'DISKGROUP:' || name || ':' || state || ':' || type || ':' ||
total_mb || ':' || free_mb || ':' ||
ROUND((free_mb/total_mb)*100,2) || '%'
FROM v\$asm_diskgroup
ORDER BY name;
EOF
}
# Check diskgroup status
DG_STATUS=$(check_diskgroups)
# Alert on issues
echo "$DG_STATUS" | while IFS=: read -r label name state type total free pct; do
if [ "$state" != "MOUNTED" ]; then
echo "ALERT: Diskgroup $name is $state"
# Send notification
echo "ASM diskgroup $name is not mounted" | \
mail -s "ASM Alert" [email protected]
fi
done
-- Create automatic mount procedure
CREATE OR REPLACE PROCEDURE auto_mount_diskgroups AS
v_count NUMBER;
BEGIN
-- Check for dismounted diskgroups
FOR rec IN (
SELECT name
FROM v$asm_diskgroup
WHERE state != 'MOUNTED'
) LOOP
BEGIN
EXECUTE IMMEDIATE 'ALTER DISKGROUP ' || rec.name || ' MOUNT';
DBMS_OUTPUT.PUT_LINE('Mounted diskgroup: ' || rec.name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Failed to mount ' || rec.name || ': ' || SQLERRM);
END;
END LOOP;
END;
/
-- Schedule automatic mount check
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'AUTO_MOUNT_DG_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN auto_mount_diskgroups; END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY;INTERVAL=5',
enabled => TRUE
);
END;
/
-- Monitor disk status changes
CREATE TABLE asm_disk_history (
check_time TIMESTAMP,
path VARCHAR2(256),
header_status VARCHAR2(20),
mount_status VARCHAR2(20),
state VARCHAR2(20)
);
CREATE OR REPLACE PROCEDURE monitor_asm_disks AS
BEGIN
-- Log disk status
INSERT INTO asm_disk_history
SELECT SYSTIMESTAMP, path, header_status, mount_status, state
FROM v$asm_disk
WHERE header_status != 'MEMBER'
OR mount_status != 'CACHED'
OR state != 'NORMAL';
-- Alert on issues
FOR rec IN (
SELECT path, header_status, state
FROM v$asm_disk
WHERE header_status = 'CANDIDATE'
OR state != 'NORMAL'
) LOOP
DBMS_OUTPUT.PUT_LINE('ALERT: Disk issue - ' || rec.path ||
' Status: ' || rec.header_status ||
' State: ' || rec.state);
END LOOP;
COMMIT;
END;
/
Terminal window
# Check diskgroup status on all nodes
for node in node1 node2 node3; do
echo "=== Checking $node ==="
ssh $node "
export ORACLE_HOME=/u01/app/19.0.0/grid
export ORACLE_SID=+ASM1
$ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF
SELECT instance_name FROM v\\\$instance;
SELECT name, state FROM v\\\$asm_diskgroup;
EOF
"
done
Terminal window
# Mount diskgroup on all nodes
srvctl start diskgroup -g DATA
# Check status across cluster
srvctl status diskgroup -g DATA
# Force start if needed
srvctl start diskgroup -g DATA -f
#!/bin/bash
# Emergency ASM diskgroup mount
ORACLE_HOME=/u01/app/19.0.0/grid
ORACLE_SID=+ASM
export ORACLE_HOME ORACLE_SID
echo "Starting emergency diskgroup mount..."
# Try normal mount first
$ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF
ALTER DISKGROUP ALL MOUNT;
EXIT;
EOF
# Check results
MOUNTED=$($ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF
SET PAGESIZE 0 FEEDBACK OFF HEADING OFF
SELECT COUNT(*) FROM v\$asm_diskgroup WHERE state = 'MOUNTED';
EXIT;
EOF
)
if [ "$MOUNTED" -eq 0 ]; then
echo "Normal mount failed, attempting force mount..."
# Get diskgroup list
DG_LIST=$($ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF
SET PAGESIZE 0 FEEDBACK OFF HEADING OFF
SELECT name FROM v\$asm_diskgroup;
EXIT;
EOF
)
# Force mount each diskgroup
for DG in $DG_LIST; do
echo "Force mounting $DG..."
$ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF
ALTER DISKGROUP $DG MOUNT FORCE;
EXIT;
EOF
done
fi
echo "Emergency mount procedure completed"
-- Check and repair diskgroup
ALTER DISKGROUP data CHECK ALL REPAIR;
-- Mount with limited disks
ALTER DISKGROUP data MOUNT FORCE;
-- Rebalance after mount
ALTER DISKGROUP data REBALANCE POWER 10;
-- Monitor rebalance operation
SELECT * FROM v$asm_operation;
  1. Configure automatic diskgroup mounting
  2. Monitor disk and diskgroup status regularly
  3. Implement proper disk discovery strings
  4. Maintain consistent disk permissions
  5. Document diskgroup configurations
  6. Regular ASM metadata backups
  7. Test mount/dismount procedures
  • ORA-15017: Diskgroup cannot be mounted
  • ORA-15032: Not all alterations performed
  • ORA-15040: Diskgroup is incomplete
  • ORA-15042: ASM disk is missing
  • Verify ASM instance is running
  • Check diskgroup exists in v$asm_diskgroup
  • Confirm diskgroup state (mounted/dismounted)
  • Verify disk discovery string
  • Check disk permissions and ownership
  • Validate disk paths haven’t changed
  • Test manual mount operation
  • Configure automatic mounting if needed