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 Overview
Section titled “Error Overview”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.
Understanding ASM Architecture
Section titled “Understanding ASM Architecture”ASM Components
Section titled “ASM Components”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 States
Section titled “Diskgroup States”Diskgroup Lifecycle├── DISMOUNTED - Not available for use├── MOUNTED - Available for ASM operations├── RESTRICTED - Limited access mode└── FORCING - Forced mount with missing disks
Common Causes
Section titled “Common Causes”Diskgroup Not Mounted
Section titled “Diskgroup Not Mounted”- ASM instance restarted without auto-mount
- Manual dismount performed
- Mount failure due to disk issues
- Insufficient ASM processes
Diskgroup Does Not Exist
Section titled “Diskgroup Does Not Exist”-- Diskgroup was dropped-- Diskgroup name misspelled-- Wrong ASM instance-- Diskgroup created on different storage
Permission and Access Issues
Section titled “Permission and Access Issues”- ASM instance not running
- Database not configured to use ASM
- Incorrect ASM_DISKGROUPS parameter
- Grid Infrastructure problems
Storage Problems
Section titled “Storage Problems”- Disk path changes
- Storage array issues
- Multipathing problems
- Disk permissions incorrect
Diagnostic Steps
Section titled “Diagnostic Steps”Check ASM Instance Status
Section titled “Check ASM Instance Status”-- Connect to ASM instancesqlplus / as sysasm
-- Check ASM instance statusSELECT instance_name, status, version FROM v$instance;
-- List all diskgroups and their statusSELECT name, state, type, total_mb, free_mbFROM v$asm_diskgroupORDER BY name;
-- Check specific diskgroupSELECT * FROM v$asm_diskgroup WHERE name = 'DISKGROUP_NAME';
Verify Disk Discovery
Section titled “Verify Disk Discovery”-- Check ASM disk discovery stringSHOW PARAMETER asm_diskstring;
-- List all discovered disksSELECT path, header_status, state, total_mb, free_mbFROM v$asm_diskORDER BY path;
-- Check disks for specific diskgroupSELECT d.path, d.header_status, dg.name as diskgroup_nameFROM v$asm_disk d, v$asm_diskgroup dgWHERE d.group_number = dg.group_number(+)ORDER BY dg.name, d.path;
Grid Infrastructure Diagnostics
Section titled “Grid Infrastructure Diagnostics”# Check CRS statuscrsctl stat res -t
# Check ASM resourcecrsctl stat res ora.asm -t
# Check diskgroup resourcescrsctl stat res ora.*.dg -t
# Check ASM disk statusoracleasm listdisks# orls -la /dev/oracleasm/disks/
Database Configuration Check
Section titled “Database Configuration Check”-- Connect to database instancesqlplus / as sysdba
-- Check if using ASMSHOW PARAMETER db_create_file_dest;SHOW PARAMETER db_recovery_file_dest;
-- Check ASM diskgroups visible to databaseSELECT name FROM v$asm_diskgroup;
-- Check datafiles on ASMSELECT file_name FROM dba_data_filesWHERE file_name LIKE '+%';
Resolution Steps
Section titled “Resolution Steps”1. Mount Existing Diskgroup
Section titled “1. Mount Existing Diskgroup”Manual Mount
Section titled “Manual Mount”-- Connect to ASM instancesqlplus / as sysasm
-- Mount specific diskgroupALTER DISKGROUP data MOUNT;
-- Mount all diskgroupsALTER DISKGROUP ALL MOUNT;
-- Force mount if disks missingALTER DISKGROUP data MOUNT FORCE;
-- Mount in restricted modeALTER DISKGROUP data MOUNT RESTRICTED;
Using ASMCMD
Section titled “Using ASMCMD”# Start ASMCMDasmcmd
# List diskgroupsASMCMD> lsdg
# Mount diskgroupASMCMD> mount DATA
# Mount all diskgroupsASMCMD> mount -a
2. Configure Automatic Mount
Section titled “2. Configure Automatic Mount”Update ASM_DISKGROUPS Parameter
Section titled “Update ASM_DISKGROUPS Parameter”-- Check current settingSHOW PARAMETER asm_diskgroups;
-- Add diskgroup to auto-mount listALTER SYSTEM SET asm_diskgroups='DATA,FRA,REDO' SCOPE=BOTH;
-- Or add single diskgroupALTER SYSTEM SET asm_diskgroups='DATA' SCOPE=BOTH SID='+ASM1';
Grid Infrastructure Configuration
Section titled “Grid Infrastructure Configuration”# Add diskgroup to Grid Infrastructuresrvctl add diskgroup -g DATA
# Enable auto-startsrvctl enable diskgroup -g DATA
# Start diskgroupsrvctl start diskgroup -g DATA
3. Fix Disk Discovery Issues
Section titled “3. Fix Disk Discovery Issues”Update Discovery String
Section titled “Update Discovery String”-- Check current discovery stringSHOW PARAMETER asm_diskstring;
-- Update discovery stringALTER SYSTEM SET asm_diskstring='/dev/oracleasm/disks/*','/dev/sd*' SCOPE=BOTH;
-- For specific pathsALTER SYSTEM SET asm_diskstring='/dev/mapper/asm*' SCOPE=BOTH;
Verify Disk Permissions
Section titled “Verify Disk Permissions”# Check disk ownership and permissionsls -la /dev/oracleasm/disks/
# Fix permissions if neededchown grid:asmadmin /dev/oracleasm/disks/*chmod 660 /dev/oracleasm/disks/*
# For raw deviceschown grid:asmadmin /dev/sd*chmod 660 /dev/sd*
4. Create Missing Diskgroup
Section titled “4. Create Missing Diskgroup”Identify Available Disks
Section titled “Identify Available Disks”-- Find candidate disksSELECT path, header_status, total_mbFROM v$asm_diskWHERE header_status = 'CANDIDATE'ORDER BY path;
Create Diskgroup
Section titled “Create Diskgroup”-- Create diskgroup with external redundancyCREATE DISKGROUP data EXTERNAL REDUNDANCYDISK '/dev/oracleasm/disks/DISK1';
-- Create with normal redundancyCREATE DISKGROUP data NORMAL REDUNDANCYFAILGROUP fg1 DISK '/dev/oracleasm/disks/DISK1'FAILGROUP fg2 DISK '/dev/oracleasm/disks/DISK2';
-- Create with high redundancyCREATE DISKGROUP data HIGH REDUNDANCYFAILGROUP fg1 DISK '/dev/oracleasm/disks/DISK1'FAILGROUP fg2 DISK '/dev/oracleasm/disks/DISK2'FAILGROUP fg3 DISK '/dev/oracleasm/disks/DISK3';
Advanced Troubleshooting
Section titled “Advanced Troubleshooting”Disk Header Analysis
Section titled “Disk Header Analysis”-- Check disk headersSELECT disk_number, path, header_status, mode_status, stateFROM v$asm_diskWHERE header_status != 'MEMBER';
-- Repair disk headerALTER DISKGROUP data CHECK DISK '/dev/oracleasm/disks/DISK1' REPAIR;
-- Force disk onlineALTER DISKGROUP data ONLINE DISK '/dev/oracleasm/disks/DISK1' FORCE;
ASM Metadata Verification
Section titled “ASM Metadata Verification”# Check ASM metadatakfed read /dev/oracleasm/disks/DISK1
# Backup ASM metadatadd if=/dev/oracleasm/disks/DISK1 of=/tmp/asm_disk1_header.bak bs=4096 count=1
# Check disk group metadataamdu -diskstring '/dev/oracleasm/disks/*' -dump 'DATA'
Force Mount Operations
Section titled “Force Mount Operations”-- Mount with missing disksALTER DISKGROUP data MOUNT FORCE;
-- Check missing disksSELECT path, header_status, failgroupFROM v$asm_diskWHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')AND header_status != 'MEMBER';
-- Drop missing disksALTER DISKGROUP data DROP DISK data_0001 FORCE;
Monitoring and Prevention
Section titled “Monitoring and Prevention”Diskgroup Monitoring Script
Section titled “Diskgroup Monitoring Script”#!/bin/bash# ASM diskgroup monitoring
export ORACLE_HOME=/u01/app/19.0.0/gridexport ORACLE_SID=+ASMexport 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 statusDG_STATUS=$(check_diskgroups)
# Alert on issuesecho "$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" | \ fidone
Automatic Recovery Procedure
Section titled “Automatic Recovery Procedure”-- Create automatic mount procedureCREATE 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 checkBEGIN 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;/
Proactive Disk Monitoring
Section titled “Proactive Disk Monitoring”-- Monitor disk status changesCREATE 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 ASBEGIN -- 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;/
RAC-Specific Considerations
Section titled “RAC-Specific Considerations”Check All Nodes
Section titled “Check All Nodes”# Check diskgroup status on all nodesfor 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
Cluster-Wide Mount
Section titled “Cluster-Wide Mount”# Mount diskgroup on all nodessrvctl start diskgroup -g DATA
# Check status across clustersrvctl status diskgroup -g DATA
# Force start if neededsrvctl start diskgroup -g DATA -f
Emergency Procedures
Section titled “Emergency Procedures”Emergency Mount Script
Section titled “Emergency Mount Script”#!/bin/bash# Emergency ASM diskgroup mount
ORACLE_HOME=/u01/app/19.0.0/gridORACLE_SID=+ASMexport ORACLE_HOME ORACLE_SID
echo "Starting emergency diskgroup mount..."
# Try normal mount first$ORACLE_HOME/bin/sqlplus -s / as sysasm << EOFALTER DISKGROUP ALL MOUNT;EXIT;EOF
# Check resultsMOUNTED=$($ORACLE_HOME/bin/sqlplus -s / as sysasm << EOFSET PAGESIZE 0 FEEDBACK OFF HEADING OFFSELECT 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 donefi
echo "Emergency mount procedure completed"
Diskgroup Recovery
Section titled “Diskgroup Recovery”-- Check and repair diskgroupALTER DISKGROUP data CHECK ALL REPAIR;
-- Mount with limited disksALTER DISKGROUP data MOUNT FORCE;
-- Rebalance after mountALTER DISKGROUP data REBALANCE POWER 10;
-- Monitor rebalance operationSELECT * FROM v$asm_operation;
Best Practices
Section titled “Best Practices”- Configure automatic diskgroup mounting
- Monitor disk and diskgroup status regularly
- Implement proper disk discovery strings
- Maintain consistent disk permissions
- Document diskgroup configurations
- Regular ASM metadata backups
- Test mount/dismount procedures
Related Errors
Section titled “Related Errors”- ORA-15017: Diskgroup cannot be mounted
- ORA-15032: Not all alterations performed
- ORA-15040: Diskgroup is incomplete
- ORA-15042: ASM disk is missing
Troubleshooting Checklist
Section titled “Troubleshooting Checklist”- 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