ORA-15017 Diskgroup Cannot Be Mounted - ASM Mount Failure Resolution
ORA-15017: Diskgroup Cannot Be Mounted
Section titled “ORA-15017: Diskgroup Cannot Be Mounted”Error Overview
Section titled “Error Overview”Error Text: ORA-15017: diskgroup "diskgroup_name" cannot be mounted
This error occurs when ASM (Automatic Storage Management) cannot mount a diskgroup due to various issues such as missing disks, corrupted metadata, insufficient disk resources, or configuration problems. It indicates a more serious issue than ORA-15001, as the diskgroup exists but has problems preventing it from being mounted.
Understanding ASM Mount Process
Section titled “Understanding ASM Mount Process”Mount Operation Steps
Section titled “Mount Operation Steps”ASM Mount Process├── Disk Discovery│ ├── Scan ASM_DISKSTRING paths│ ├── Read disk headers│ └── Validate disk membership├── Metadata Validation│ ├── Check disk group metadata│ ├── Verify redundancy│ └── Validate allocation units├── Resource Allocation│ ├── Allocate memory structures│ ├── Start background processes│ └── Initialize extent maps└── Mount Completion ├── Update v$asm_diskgroup └── Make diskgroup available
Common Mount Failures
Section titled “Common Mount Failures”- Insufficient disks for redundancy
- Corrupted ASM metadata
- Disk path changes
- Permission issues
- Resource limitations
Common Causes
Section titled “Common Causes”Disk Availability Issues
Section titled “Disk Availability Issues”-- Missing disks from diskgroup-- Disk failures exceeding redundancy-- Disk path changes-- Multipath configuration issues
Metadata Corruption
Section titled “Metadata Corruption”- PST (Partnership Status Table) corruption
- ACD (Active Change Directory) issues
- File directory corruption
- Allocation table problems
Configuration Problems
Section titled “Configuration Problems”- Incorrect ASM_DISKSTRING
- Wrong disk permissions
- ASM parameter issues
- Memory constraints
Environmental Issues
Section titled “Environmental Issues”- Storage array problems
- Operating system issues
- Cluster synchronization problems
- Network storage disconnections
Diagnostic Steps
Section titled “Diagnostic Steps”Detailed Mount Error Analysis
Section titled “Detailed Mount Error Analysis”-- Connect to ASM instancesqlplus / as sysasm
-- Attempt mount with detailed errorALTER DISKGROUP data MOUNT;
-- Check alert log for specific errors-- Location: $ORACLE_BASE/diag/asm/+asm/+ASM/trace/alert_+ASM.log
-- Query diskgroup informationSELECT group_number, name, state, type, total_mb, required_mirror_free_mbFROM v$asm_diskgroupWHERE name = 'DATA';
Disk Status Investigation
Section titled “Disk Status Investigation”-- Check all disks for the diskgroupSELECT disk_number, path, mount_status, header_status, state, failgroupFROM v$asm_diskWHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')ORDER BY disk_number;
-- Find missing or problematic disksSELECT path, header_status, state, total_mb, free_mbFROM v$asm_diskWHERE header_status IN ('CANDIDATE', 'FORMER', 'PROVISIONED', 'INCOMPATIBLE') OR state != 'NORMAL';
-- Check disk visibility across nodes (RAC)SELECT inst_id, path, header_statusFROM gv$asm_diskWHERE path LIKE '%DISK%'ORDER BY inst_id, path;
Metadata Validation
Section titled “Metadata Validation”# Check disk headers with kfedkfed read /dev/oracleasm/disks/DISK1
# Verify ASM disk headerkfed read /dev/oracleasm/disks/DISK1 | grep -E "kfdhdb.grptyp|kfdhdb.dskname|kfdhdb.grpname"
# Check for metadata corruptionamdu -diskstring '/dev/oracleasm/disks/*' -dump 'DATA' -noimage
System Resource Check
Section titled “System Resource Check”-- Check ASM memory allocationSHOW PARAMETER asm_power_limit;SHOW PARAMETER memory_target;SHOW PARAMETER sga_target;
-- Check ASM processesSELECT name, description FROM v$bgprocessWHERE name LIKE 'AR%' OR name IN ('RBAL', 'GMON');
-- Verify system resources!free -m!df -h
Resolution Steps
Section titled “Resolution Steps”1. Fix Disk Discovery Issues
Section titled “1. Fix Disk Discovery Issues”Update Disk Discovery String
Section titled “Update Disk Discovery String”-- Check current discovery stringSHOW PARAMETER asm_diskstring;
-- Update to include all disk pathsALTER SYSTEM SET asm_diskstring='/dev/oracleasm/disks/*','/dev/mapper/asm*','/dev/sd*' SCOPE=BOTH;
-- Force disk discoveryALTER SYSTEM SET asm_diskstring='/dev/oracleasm/disks/DISK*' SCOPE=MEMORY;ALTER SYSTEM SET asm_diskstring='/dev/oracleasm/disks/*' SCOPE=MEMORY;
Verify Disk Permissions
Section titled “Verify Disk Permissions”# Check and fix disk ownershipls -la /dev/oracleasm/disks/chown grid:asmadmin /dev/oracleasm/disks/*chmod 660 /dev/oracleasm/disks/*
# For multipath devicesmultipath -llchown grid:asmadmin /dev/mapper/asm*chmod 660 /dev/mapper/asm*
# Verify udev rules (Linux)cat /etc/udev/rules.d/99-oracle-asmdevices.rules
2. Force Mount Operations
Section titled “2. Force Mount Operations”Mount with Limited Disks
Section titled “Mount with Limited Disks”-- Force mount ignoring missing disksALTER DISKGROUP data MOUNT FORCE;
-- Check mount statusSELECT name, state, type, total_mb, free_mbFROM v$asm_diskgroup WHERE name = 'DATA';
-- If successful, check missing disksSELECT * FROM v$asm_diskWHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')AND header_status = 'FORMER';
Mount in Restricted Mode
Section titled “Mount in Restricted Mode”-- Mount for maintenance onlyALTER DISKGROUP data MOUNT RESTRICTED;
-- Perform maintenance operationsALTER DISKGROUP data CHECK ALL REPAIR;
-- Dismount and remount normallyALTER DISKGROUP data DISMOUNT;ALTER DISKGROUP data MOUNT;
3. Metadata Repair
Section titled “3. Metadata Repair”Check and Repair Diskgroup
Section titled “Check and Repair Diskgroup”-- Run consistency checkALTER DISKGROUP data CHECK ALL NOREPAIR;
-- Review results in alert log-- Then repair if neededALTER DISKGROUP data CHECK ALL REPAIR;
-- Check specific diskALTER DISKGROUP data CHECK DISK data_0001 REPAIR;
-- Check specific fileALTER DISKGROUP data CHECK FILE '+DATA/orcl/datafile/system.256.854737291' REPAIR;
Manual Metadata Recovery
Section titled “Manual Metadata Recovery”# Backup disk headers before repairfor disk in /dev/oracleasm/disks/DISK*; do dd if=$disk of=/backup/$(basename $disk)_header.bak bs=1M count=10done
# Use AMDU to extract metadataamdu -diskstring '/dev/oracleasm/disks/*' -extract 'DATA.255'
4. Diskgroup Recreation (Last Resort)
Section titled “4. Diskgroup Recreation (Last Resort)”Export Diskgroup Metadata
Section titled “Export Diskgroup Metadata”-- Generate diskgroup creation scriptSET LONG 20000SELECT dbms_metadata.get_ddl('DISKGROUP', 'DATA') FROM dual;
-- Backup important file listSELECT file_number, file_incarnation, file_type, file_nameFROM v$asm_fileWHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA');
Recreate Diskgroup
Section titled “Recreate Diskgroup”-- Drop and recreate (WARNING: Data loss)DROP DISKGROUP data FORCE INCLUDING CONTENTS;
-- Recreate with same configurationCREATE DISKGROUP data NORMAL REDUNDANCYFAILGROUP fg1 DISK '/dev/oracleasm/disks/DISK1', '/dev/oracleasm/disks/DISK2'FAILGROUP fg2 DISK '/dev/oracleasm/disks/DISK3', '/dev/oracleasm/disks/DISK4'ATTRIBUTE 'compatible.asm' = '19.0.0.0', 'compatible.rdbms' = '19.0.0.0', 'au_size' = '4M';
Advanced Troubleshooting
Section titled “Advanced Troubleshooting”Disk Header Analysis
Section titled “Disk Header Analysis”#!/bin/bash# Analyze all disk headers
DISKSTRING="/dev/oracleasm/disks/*"
for disk in $DISKSTRING; do echo "=== Checking $disk ===" kfed read $disk | grep -E "kfdhdb.grptyp|kfdhdb.dskname|kfdhdb.grpname|kfdhdb.dsknum|kfdhdb.driver"done > /tmp/disk_header_analysis.txt
# Check for inconsistenciesgrep -E "KFDGTP_INVALID|KFDGTP_UNKNOWN" /tmp/disk_header_analysis.txt
RAC-Specific Diagnostics
Section titled “RAC-Specific Diagnostics”# Check disk visibility on all nodesfor node in node1 node2 node3; do echo "=== Node: $node ===" ssh $node "ls -la /dev/oracleasm/disks/ | wc -l" ssh $node "oracleasm listdisks | wc -l"done
# Compare v$asm_disk across instancescrsctl stat res ora.DATA.dg -tsrvctl status diskgroup -g DATA -detail
Force Online Operations
Section titled “Force Online Operations”-- Force disk onlineALTER DISKGROUP data ONLINE DISK data_0001 FORCE;
-- Force all disks onlineALTER DISKGROUP data ONLINE ALL FORCE;
-- Drop problematic diskALTER DISKGROUP data DROP DISK data_0001 FORCE;
-- Add disk backALTER DISKGROUP data ADD DISK '/dev/oracleasm/disks/DISK1' FORCE;
Monitoring and Prevention
Section titled “Monitoring and Prevention”Proactive Mount Monitoring
Section titled “Proactive Mount Monitoring”-- Create mount status trackingCREATE TABLE asm_mount_history ( check_time TIMESTAMP, diskgroup_name VARCHAR2(30), mount_attempt VARCHAR2(10), error_message VARCHAR2(4000));
-- Mount monitoring procedureCREATE OR REPLACE PROCEDURE monitor_diskgroup_mounts AS v_state VARCHAR2(20);BEGIN FOR dg IN (SELECT name FROM v$asm_diskgroup WHERE state != 'MOUNTED') LOOP BEGIN -- Attempt mount EXECUTE IMMEDIATE 'ALTER DISKGROUP ' || dg.name || ' MOUNT';
INSERT INTO asm_mount_history VALUES ( SYSTIMESTAMP, dg.name, 'SUCCESS', NULL ); EXCEPTION WHEN OTHERS THEN INSERT INTO asm_mount_history VALUES ( SYSTIMESTAMP, dg.name, 'FAILED', SQLERRM );
-- Alert on failure DBMS_OUTPUT.PUT_LINE('Mount failed for ' || dg.name || ': ' || SQLERRM); END; END LOOP; COMMIT;END;/
Disk Health Monitoring
Section titled “Disk Health Monitoring”#!/bin/bash# Monitor disk health and availability
LOG_FILE="/var/log/asm_disk_health.log"
check_disk_health() { local issues=0
# Check disk accessibility for disk in /dev/oracleasm/disks/*; do if [ ! -r "$disk" ]; then echo "$(date): ERROR - Cannot read disk $disk" >> $LOG_FILE ((issues++)) fi done
# Check multipath status multipath -ll | grep -i failed > /tmp/multipath_issues.txt if [ -s /tmp/multipath_issues.txt ]; then echo "$(date): ERROR - Multipath failures detected" >> $LOG_FILE cat /tmp/multipath_issues.txt >> $LOG_FILE ((issues++)) fi
# Check ASM disk status su - grid -c " sqlplus -s / as sysasm << EOF > /tmp/asm_disk_status.txt SET PAGESIZE 0 FEEDBACK OFF HEADING OFF SELECT path || ':' || header_status || ':' || state FROM v\\\$asm_disk WHERE header_status != 'MEMBER' OR state != 'NORMAL';EOF "
if [ -s /tmp/asm_disk_status.txt ]; then echo "$(date): WARNING - ASM disk issues detected" >> $LOG_FILE cat /tmp/asm_disk_status.txt >> $LOG_FILE ((issues++)) fi
# Send alert if issues found if [ $issues -gt 0 ]; then echo "ASM disk health check found $issues issues" | \ mail -s "ASM Disk Health Alert" $ALERT_EMAIL fi}
# Run checkcheck_disk_health
Emergency Procedures
Section titled “Emergency Procedures”Emergency Recovery Script
Section titled “Emergency Recovery Script”#!/bin/bash# Emergency diskgroup recovery
export ORACLE_HOME=/u01/app/19.0.0/gridexport ORACLE_SID=+ASMDISKGROUP=$1
if [ -z "$DISKGROUP" ]; then echo "Usage: $0 <diskgroup_name>" exit 1fi
echo "Starting emergency recovery for diskgroup $DISKGROUP..."
# Phase 1: Try normal mountecho "Phase 1: Attempting normal mount..."$ORACLE_HOME/bin/sqlplus -s / as sysasm << EOFALTER DISKGROUP $DISKGROUP MOUNT;EOF
# Check if mountedMOUNTED=$($ORACLE_HOME/bin/sqlplus -s / as sysasm << EOFSET PAGESIZE 0 FEEDBACK OFF HEADING OFFSELECT COUNT(*) FROM v\$asm_diskgroupWHERE name = '$DISKGROUP' AND state = 'MOUNTED';EOF)
if [ "$MOUNTED" -eq 1 ]; then echo "Diskgroup mounted successfully" exit 0fi
# Phase 2: Force mountecho "Phase 2: Attempting force mount..."$ORACLE_HOME/bin/sqlplus -s / as sysasm << EOFALTER DISKGROUP $DISKGROUP MOUNT FORCE;EOF
# Phase 3: Restricted mountecho "Phase 3: Attempting restricted mount..."$ORACLE_HOME/bin/sqlplus -s / as sysasm << EOFALTER DISKGROUP $DISKGROUP MOUNT RESTRICTED;EOF
# Phase 4: Check and repairecho "Phase 4: Running check and repair..."$ORACLE_HOME/bin/sqlplus -s / as sysasm << EOFALTER DISKGROUP $DISKGROUP CHECK ALL REPAIR;EOF
echo "Emergency recovery completed. Check alert log for details."
Critical Data Extraction
Section titled “Critical Data Extraction”# Extract critical files before diskgroup failureamdu -diskstring '/dev/oracleasm/disks/*' \ -extract 'DATA.256' \ -output /backup/extracted_files/
# Extract all database filesamdu -diskstring '/dev/oracleasm/disks/*' \ -extract 'DATA.*' \ -output /backup/extracted_files/ \ -report /backup/extraction_report.txt
Best Practices
Section titled “Best Practices”- Regular metadata backups using md_backup
- Monitor disk health and availability continuously
- Maintain proper redundancy levels
- Test mount/dismount procedures regularly
- Keep ASM and Grid Infrastructure patched
- Document disk-to-diskgroup mappings
- Implement automated recovery procedures
Related Errors
Section titled “Related Errors”- ORA-15001: Diskgroup does not exist or is not mounted
- ORA-15032: Not all alterations performed
- ORA-15040: Diskgroup is incomplete
- ORA-15042: ASM disk is missing
Troubleshooting Checklist
Section titled “Troubleshooting Checklist”- Check alert log for specific mount errors
- Verify all disks are accessible
- Confirm disk permissions are correct
- Check disk header status
- Validate ASM discovery string
- Test force mount operation
- Run diskgroup check and repair
- Verify sufficient resources (memory/processes)