ORA-15042 ASM Disk Is Missing - Disk Recovery and Replacement Guide
ORA-15042: ASM Disk “disk_name” Is Missing
Section titled “ORA-15042: ASM Disk “disk_name” Is Missing”Error Overview
Section titled “Error Overview”Error Text: ORA-15042: ASM disk "disk_name" is missing
This error occurs when ASM (Automatic Storage Management) cannot find a disk that is supposed to be part of a diskgroup. The disk may have failed, been removed, or become inaccessible due to various reasons. This error indicates a potential risk to data redundancy and requires immediate attention to prevent data loss.
Understanding ASM Disk Management
Section titled “Understanding ASM Disk Management”ASM Disk States
Section titled “ASM Disk States”ASM Disk Lifecycle States├── CANDIDATE - Available for ASM use├── MEMBER - Part of a diskgroup├── FORMER - Was part of a diskgroup├── PROVISIONED - Prepared but not used├── CONFLICT - Header conflicts└── FOREIGN - Contains non-ASM data
Disk Discovery Process
Section titled “Disk Discovery Process”ASM Disk Discovery├── Read ASM_DISKSTRING paths├── Open and read disk headers├── Validate ASM metadata├── Check disk membership└── Update v$asm_disk view
Common Causes
Section titled “Common Causes”Hardware Issues
Section titled “Hardware Issues”- Physical disk failure
- Controller failure
- Cable disconnection
- Power supply issues
- Storage array problems
Configuration Problems
Section titled “Configuration Problems”# Path changes# Multipathing issues# Permission changes# Disk partition changes# Device naming changes
Operating System Issues
Section titled “Operating System Issues”- Device driver problems
- Kernel module not loaded
- UDEV rules misconfigured
- Filesystem mounted over ASM disk
- SELinux/permissions blocking access
Storage Network Problems
Section titled “Storage Network Problems”- SAN connectivity issues
- iSCSI target problems
- Fiber channel path failures
- Network timeout issues
Diagnostic Steps
Section titled “Diagnostic Steps”Identify Missing Disk
Section titled “Identify Missing Disk”-- Connect to ASM instancesqlplus / as sysasm
-- Find missing disk detailsSELECT dg.name as diskgroup_name, d.name as disk_name, d.path, d.header_status, d.mount_status, d.stateFROM v$asm_disk d, v$asm_diskgroup dgWHERE d.group_number = dg.group_number(+)AND (d.mount_status = 'MISSING' OR d.header_status = 'FORMER')ORDER BY dg.name, d.name;
-- Check specific diskgroup for missing disksSELECT disk_number, name, path, mount_status, header_status, stateFROM v$asm_diskWHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')AND mount_status = 'MISSING';
Verify Disk at OS Level
Section titled “Verify Disk at OS Level”# List all available disksls -la /dev/oracleasm/disks/lsblkfdisk -l
# Check specific diskls -la /dev/oracleasm/disks/DISK1file /dev/oracleasm/disks/DISK1
# Check disk accessibilitydd if=/dev/oracleasm/disks/DISK1 of=/dev/null bs=1M count=1
# Check multipath statusmultipath -llmultipath -v3 -ll | grep -A5 -B5 "DISK1"
Analyze System Logs
Section titled “Analyze System Logs”# Check system messagesdmesg | grep -i "error\|fail\|offline"tail -100 /var/log/messages | grep -i "disk\|scsi\|error"
# Check ASM logstail -500 $ORACLE_BASE/diag/asm/+asm/+ASM/trace/alert_+ASM.log | grep -i "disk\|missing\|offline"
# Check disk eventsjournalctl -u oracleasm -n 100
Storage Validation
Section titled “Storage Validation”# For Oracle ASM disksoracleasm statusoracleasm scandisksoracleasm listdisks
# Query specific diskoracleasm querydisk DISK1
# Check disk headerkfed read /dev/oracleasm/disks/DISK1 | head -20
Resolution Steps
Section titled “Resolution Steps”1. Rediscover Missing Disk
Section titled “1. Rediscover Missing Disk”Force Disk Discovery
Section titled “Force Disk Discovery”-- Clear and reset discovery stringALTER SYSTEM SET asm_diskstring = '' SCOPE=MEMORY;ALTER SYSTEM SET asm_diskstring = '/dev/oracleasm/disks/*' SCOPE=MEMORY;
-- Check if disk reappearsSELECT path, header_status, mount_status, stateFROM v$asm_diskWHERE path LIKE '%DISK1%';
-- Force specific path discoveryALTER SYSTEM SET asm_diskstring = '/dev/oracleasm/disks/DISK1' SCOPE=MEMORY;ALTER SYSTEM SET asm_diskstring = '/dev/oracleasm/disks/*' SCOPE=MEMORY;
Rescan at OS Level
Section titled “Rescan at OS Level”# Rescan SCSI devicesfor host in /sys/class/scsi_host/*; do echo "- - -" > $host/scandone
# Rescan Oracle ASM disksoracleasm scandisks
# Restart Oracle ASMoracleasm stoporacleasm startoracleasm scandisks
2. Repair Disk Access
Section titled “2. Repair Disk Access”Fix Permissions
Section titled “Fix Permissions”# Check and fix permissionsls -la /dev/oracleasm/disks/chown grid:asmadmin /dev/oracleasm/disks/DISK1chmod 660 /dev/oracleasm/disks/DISK1
# For raw deviceschown grid:asmadmin /dev/sdb1chmod 660 /dev/sdb1
# Update UDEV rules if neededvi /etc/udev/rules.d/99-oracle-asmdevices.rulesudevadm control --reload-rulesudevadm trigger
Fix Multipath Issues
Section titled “Fix Multipath Issues”# Check multipath configurationcat /etc/multipath.conf
# Reload multipathmultipath -r
# Check specific devicemultipath -ll /dev/sdb
# Add device to multipathmultipath -a /dev/sdb
3. Bring Disk Online
Section titled “3. Bring Disk Online”Online Missing Disk
Section titled “Online Missing Disk”-- Attempt to online the diskALTER DISKGROUP data ONLINE DISK data_0001;
-- Force onlineALTER DISKGROUP data ONLINE DISK data_0001 FORCE;
-- Online by pathALTER DISKGROUP data ONLINE DISK '/dev/oracleasm/disks/DISK1';
-- Online all missing disksALTER DISKGROUP data ONLINE DISKS IN FAILGROUP failure_group_1;
4. Replace Missing Disk
Section titled “4. Replace Missing Disk”Add Replacement Disk
Section titled “Add Replacement Disk”-- Drop missing disk and add replacementALTER DISKGROUP data DROP DISK data_0001 FORCE ADD DISK '/dev/oracleasm/disks/NEWDISK1' NAME data_0001_newREBALANCE POWER 10;
-- Monitor rebalanceSELECT * FROM v$asm_operation;
-- Check disk status after rebalanceSELECT name, path, mount_status, header_status, stateFROM v$asm_diskWHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA');
Advanced Recovery Procedures
Section titled “Advanced Recovery Procedures”Disk Header Recovery
Section titled “Disk Header Recovery”# Backup disk header before repair attemptsdd if=/dev/oracleasm/disks/DISK1 of=/backup/disk1_header.bak bs=4M count=1
# Analyze disk headerkfed read /dev/oracleasm/disks/DISK1 | grep -E "grpname|dskname|dsknum|grptyp"
# Clear disk header if corrupted (WARNING: Destructive)dd if=/dev/zero of=/dev/oracleasm/disks/DISK1 bs=4M count=1
# Re-add disk to ASMoracleasm createdisk DISK1 /dev/sdb1
Force Mount with Missing Disks
Section titled “Force Mount with Missing Disks”-- Mount diskgroup despite missing disksALTER DISKGROUP data MOUNT FORCE;
-- Check redundancy statusSELECT file_number, redundancy_lowered, mirror_lowered, needs_resilverFROM v$asm_fileWHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')AND (redundancy_lowered = 'Y' OR mirror_lowered = 'Y');
-- Drop missing disks after force mountALTER DISKGROUP data DROP DISK data_0001 FORCE;
Extract Data from Remaining Disks
Section titled “Extract Data from Remaining Disks”# Use AMDU to extract filesamdu -diskstring '/dev/oracleasm/disks/*' -extract 'DATA.256' -output /recovery/
# Extract all files from diskgroupamdu -diskstring '/dev/oracleasm/disks/*' -dump 'DATA' -output /recovery/dump/
Monitoring and Prevention
Section titled “Monitoring and Prevention”Missing Disk Detection Script
Section titled “Missing Disk Detection Script”#!/bin/bash# Monitor for missing ASM disks
ORACLE_HOME=/u01/app/19.0.0/gridORACLE_SID=+ASMexport ORACLE_HOME ORACLE_SID
check_missing_disks() { MISSING=$($ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF SET PAGESIZE 0 FEEDBACK OFF HEADING OFF SELECT COUNT(*) FROM v\$asm_disk WHERE mount_status = 'MISSING' OR header_status = 'FORMER';EOF )
if [ "$MISSING" -gt 0 ]; then echo "ALERT: $MISSING missing ASM disks detected"
# Get details $ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF SET LINESIZE 200 COL diskgroup_name FORMAT A15 COL disk_name FORMAT A15 COL path FORMAT A30 SELECT dg.name as diskgroup_name, d.name as disk_name, d.path, d.mount_status FROM v\$asm_disk d, v\$asm_diskgroup dg WHERE d.group_number = dg.group_number(+) AND (d.mount_status = 'MISSING' OR d.header_status = 'FORMER');EOF
# Send alert else echo "All ASM disks are present" fi}
# Run checkcheck_missing_disks
Proactive Disk Health Monitoring
Section titled “Proactive Disk Health Monitoring”-- Create disk monitoring tableCREATE TABLE asm_disk_monitor ( check_time TIMESTAMP, path VARCHAR2(256), diskgroup_name VARCHAR2(30), mount_status VARCHAR2(20), header_status VARCHAR2(20), state VARCHAR2(20), read_errors NUMBER, write_errors NUMBER);
-- Monitoring procedureCREATE OR REPLACE PROCEDURE monitor_asm_disk_health ASBEGIN -- Log disk status INSERT INTO asm_disk_monitor SELECT SYSTIMESTAMP, d.path, dg.name, d.mount_status, d.header_status, d.state, d.read_errs, d.write_errs FROM v$asm_disk d, v$asm_diskgroup dg WHERE d.group_number = dg.group_number(+);
-- Alert on issues FOR rec IN ( SELECT path, mount_status, read_errs, write_errs FROM v$asm_disk WHERE mount_status != 'CACHED' OR read_errs > 0 OR write_errs > 0 ) LOOP DBMS_OUTPUT.PUT_LINE('Disk issue: ' || rec.path || ' Status: ' || rec.mount_status || ' Read Errors: ' || rec.read_errs || ' Write Errors: ' || rec.write_errs); END LOOP;
COMMIT;END;/
-- Schedule regular monitoringBEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'ASM_DISK_HEALTH_CHECK', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN monitor_asm_disk_health; END;', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=HOURLY', enabled => TRUE );END;/
Automated Recovery Procedure
Section titled “Automated Recovery Procedure”#!/bin/bash# Automated disk recovery script
ORACLE_HOME=/u01/app/19.0.0/gridORACLE_SID=+ASMexport ORACLE_HOME ORACLE_SID
recover_missing_disk() { local disk_path=$1 local disk_name=$2 local diskgroup=$3
echo "Attempting to recover disk $disk_name at $disk_path"
# Step 1: Check OS level if [ ! -e "$disk_path" ]; then echo "Disk path does not exist, scanning for new devices..." oracleasm scandisks sleep 5 fi
# Step 2: Check permissions if [ -e "$disk_path" ]; then chown grid:asmadmin "$disk_path" chmod 660 "$disk_path" fi
# Step 3: Force rediscovery $ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF ALTER SYSTEM SET asm_diskstring = '$disk_path' SCOPE=MEMORY; ALTER SYSTEM SET asm_diskstring = '/dev/oracleasm/disks/*' SCOPE=MEMORY;EOF
# Step 4: Try to online disk $ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF ALTER DISKGROUP $diskgroup ONLINE DISK '$disk_name';EOF
# Check result RESULT=$($ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF SET PAGESIZE 0 FEEDBACK OFF HEADING OFF SELECT mount_status FROM v\$asm_disk WHERE name = '$disk_name';EOF )
if [ "$RESULT" = "CACHED" ]; then echo "Disk $disk_name successfully recovered" return 0 else echo "Failed to recover disk $disk_name" return 1 fi}
# Main recovery loop$ORACLE_HOME/bin/sqlplus -s / as sysasm << EOF > /tmp/missing_disks.txtSET PAGESIZE 0 FEEDBACK OFF HEADING OFFSELECT d.path || '|' || d.name || '|' || dg.nameFROM v\$asm_disk d, v\$asm_diskgroup dgWHERE d.group_number = dg.group_number(+)AND d.mount_status = 'MISSING';EOF
while IFS='|' read -r path name diskgroup; do recover_missing_disk "$path" "$name" "$diskgroup"done < /tmp/missing_disks.txt
Emergency Procedures
Section titled “Emergency Procedures”Critical Disk Recovery
Section titled “Critical Disk Recovery”-- Emergency script for critical diskgroupsDECLARE v_critical_dg VARCHAR2(30) := 'DATA'; v_missing_count NUMBER;BEGIN -- Count missing disks SELECT COUNT(*) INTO v_missing_count FROM v$asm_disk WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = v_critical_dg) AND mount_status = 'MISSING';
IF v_missing_count > 0 THEN DBMS_OUTPUT.PUT_LINE('CRITICAL: ' || v_missing_count || ' disks missing from ' || v_critical_dg);
-- Attempt force mount BEGIN EXECUTE IMMEDIATE 'ALTER DISKGROUP ' || v_critical_dg || ' MOUNT FORCE'; DBMS_OUTPUT.PUT_LINE('Force mount successful'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Force mount failed: ' || SQLERRM); END;
-- Drop missing disks FOR disk IN ( SELECT name FROM v$asm_disk WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = v_critical_dg) AND mount_status = 'MISSING' ) LOOP BEGIN EXECUTE IMMEDIATE 'ALTER DISKGROUP ' || v_critical_dg || ' DROP DISK ' || disk.name || ' FORCE'; DBMS_OUTPUT.PUT_LINE('Dropped missing disk: ' || disk.name); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Failed to drop ' || disk.name || ': ' || SQLERRM); END; END LOOP; END IF;END;/
Best Practices
Section titled “Best Practices”- Monitor disk health continuously
- Configure proper disk discovery strings
- Maintain consistent device naming
- Use ASM disk labels for easy identification
- Implement redundancy appropriate to SLA
- Regular disk path and permission audits
- Automate disk recovery procedures
Related Errors
Section titled “Related Errors”- ORA-15001: Diskgroup does not exist or is not mounted
- ORA-15017: Diskgroup cannot be mounted
- ORA-15040: Diskgroup is incomplete
- ORA-15063: ASM discovered an insufficient number of disks
Troubleshooting Checklist
Section titled “Troubleshooting Checklist”- Identify missing disk name and path
- Check disk existence at OS level
- Verify disk permissions and ownership
- Scan for new/changed disk devices
- Check multipath configuration
- Force ASM disk rediscovery
- Attempt to online the disk
- Consider disk replacement if unrecoverable