ORA-19815 Flash Recovery Area Full - Backup Storage Management Guide
ORA-19815: WARNING: db_recovery_file_dest_size is 100% used
Section titled “ORA-19815: WARNING: db_recovery_file_dest_size is 100% used”Error Overview
Section titled “Error Overview”Error Text: ORA-19815: WARNING: db_recovery_file_dest_size of nnnn bytes is 100.00% used, and has 0 remaining bytes available.
This critical warning indicates that the Flash Recovery Area (FRA) has reached maximum capacity. While initially appearing as a warning, ORA-19815 can quickly escalate to database-stopping errors when archive logs cannot be created, potentially halting all database transactions.
Understanding Flash Recovery Area
Section titled “Understanding Flash Recovery Area”FRA Architecture
Section titled “FRA Architecture”Flash Recovery Area (FRA)├── Archive Logs (*.arc)├── RMAN Backups│ ├── Database Backups│ ├── Archive Log Backups│ ├── Control File Backups│ └── SPFILE Backups├── Flashback Logs├── Control File Autobackups└── Multiplexed Control Files
Space Management Flow
Section titled “Space Management Flow”- Archive logs created first priority
- RMAN backups stored based on retention policy
- Obsolete files marked for deletion
- Space pressure triggers automatic cleanup
- Full FRA prevents new archive logs → database hang
Common Causes
Section titled “Common Causes”1. Insufficient FRA Size
Section titled “1. Insufficient FRA Size”- FRA configured too small for workload
- High transaction volume generating excessive archive logs
- Large database requiring more backup space
- Inadequate capacity planning
2. Backup Management Issues
Section titled “2. Backup Management Issues”- RMAN retention policy too long
- Backups not being deleted after successful completion
- Failed RMAN DELETE commands
- Manual files consuming FRA space
3. Archive Log Accumulation
Section titled “3. Archive Log Accumulation”- High redo generation rate
- Long-running transactions
- Archive log backup failures
- Network issues preventing archive log deletion
4. Configuration Problems
Section titled “4. Configuration Problems”- Archive log deletion policy misconfigured
- RMAN crosscheck not running regularly
- Manual cleanup scripts not executing
- Monitoring alerts not configured
Diagnostic Steps
Section titled “Diagnostic Steps”1. Check FRA Usage and Configuration
Section titled “1. Check FRA Usage and Configuration”-- FRA space usage summarySELECT space_limit/1024/1024/1024 as size_gb, space_used/1024/1024/1024 as used_gb, space_reclaimable/1024/1024/1024 as reclaimable_gb, number_of_files, ROUND((space_used/space_limit)*100, 2) as pct_usedFROM v$recovery_file_dest;
-- FRA configurationSHOW PARAMETER db_recovery_file_dest;SHOW PARAMETER db_recovery_file_dest_size;
-- Detailed FRA file breakdownSELECT file_type, COUNT(*) as file_count, ROUND(SUM(percent_space_used), 2) as pct_space_used, ROUND(SUM(percent_space_reclaimable), 2) as pct_reclaimable, ROUND(SUM(bytes)/1024/1024/1024, 2) as size_gbFROM v$recovery_area_usageGROUP BY file_typeORDER BY SUM(bytes) DESC;
2. Analyze Archive Log Generation
Section titled “2. Analyze Archive Log Generation”-- Archive log generation rateSELECT TO_CHAR(first_time, 'YYYY-MM-DD HH24') as hour, COUNT(*) as logs_generated, ROUND(SUM(blocks * block_size)/1024/1024/1024, 2) as gb_generated, ROUND(AVG(blocks * block_size)/1024/1024, 2) as avg_log_size_mbFROM v$archived_logWHERE first_time > SYSDATE - 7GROUP BY TO_CHAR(first_time, 'YYYY-MM-DD HH24')ORDER BY hour DESC;
-- Current archive log statusSELECT dest_name, status, destination, errorFROM v$archive_destWHERE status != 'INACTIVE';
-- Archive log space projectionWITH hourly_generation AS ( SELECT AVG(gb_per_hour) as avg_gb_per_hour FROM ( SELECT TO_CHAR(first_time, 'YYYY-MM-DD HH24') as hour, SUM(blocks * block_size)/1024/1024/1024 as gb_per_hour FROM v$archived_log WHERE first_time > SYSDATE - 3 GROUP BY TO_CHAR(first_time, 'YYYY-MM-DD HH24') ))SELECT avg_gb_per_hour, avg_gb_per_hour * 24 as gb_per_day, avg_gb_per_hour * 24 * 7 as gb_per_weekFROM hourly_generation;
3. Check RMAN Backup Status
Section titled “3. Check RMAN Backup Status”-- Recent RMAN backup statusSELECT session_key, input_type, status, start_time, end_time, input_bytes/1024/1024/1024 as input_gb, output_bytes/1024/1024/1024 as output_gb, compression_ratioFROM v$rman_backup_job_detailsWHERE start_time > SYSDATE - 7ORDER BY start_time DESC;
-- RMAN configurationSELECT name, valueFROM v$rman_configurationORDER BY name;
-- Obsolete backups that can be deletedRMAN TARGET /LIST EXPIRED BACKUP;LIST EXPIRED ARCHIVELOG ALL;DELETE NOPROMPT EXPIRED BACKUP;DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;EXIT;
4. Identify Large Files in FRA
Section titled “4. Identify Large Files in FRA”# Find largest files in FRAFRA_DEST=$(sqlplus -s / as sysdba <<< "SELECT value FROM v\$parameter WHERE name='db_recovery_file_dest';" | grep -v '^$' | tail -1)
echo "FRA Location: $FRA_DEST"echo ""echo "Largest files in FRA:"find "$FRA_DEST" -type f -exec ls -lh {} \; | sort -k5 -hr | head -20
echo ""echo "Space usage by directory:"du -sh "$FRA_DEST"/*
echo ""echo "File count by type:"find "$FRA_DEST" -name "*.arc" | wc -l && echo "Archive logs"find "$FRA_DEST" -name "*.bkp" | wc -l && echo "Backup pieces"find "$FRA_DEST" -name "*.log" | wc -l && echo "Flashback logs"
Immediate Solutions
Section titled “Immediate Solutions”Solution 1: Increase FRA Size
Section titled “Solution 1: Increase FRA Size”Temporarily Increase FRA Size
Section titled “Temporarily Increase FRA Size”-- Check current size and usageSELECT ROUND(space_limit/1024/1024/1024, 2) as current_size_gb, ROUND(space_used/1024/1024/1024, 2) as used_gb, ROUND((space_used/space_limit)*100, 2) as pct_usedFROM v$recovery_file_dest;
-- Increase FRA size (adjust based on available disk space)ALTER SYSTEM SET db_recovery_file_dest_size = 50G SCOPE = BOTH;
-- Verify the changeSHOW PARAMETER db_recovery_file_dest_size;
-- Check new usage percentageSELECT ROUND(space_limit/1024/1024/1024, 2) as new_size_gb, ROUND(space_used/1024/1024/1024, 2) as used_gb, ROUND((space_used/space_limit)*100, 2) as new_pct_usedFROM v$recovery_file_dest;
Solution 2: Clean Up Obsolete Files with RMAN
Section titled “Solution 2: Clean Up Obsolete Files with RMAN”Automated RMAN Cleanup
Section titled “Automated RMAN Cleanup”#!/bin/bash# rman_cleanup.sh - Emergency FRA cleanup
ORACLE_SID=${1:-ORCL}export ORACLE_SID
echo "Starting RMAN cleanup for $ORACLE_SID..."
rman target / << EOF# Delete expired and obsolete backupsCROSSCHECK BACKUP;CROSSCHECK ARCHIVELOG ALL;DELETE NOPROMPT EXPIRED BACKUP;DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;DELETE NOPROMPT OBSOLETE;
# Report current space usageREPORT OBSOLETE;REPORT NEED BACKUP;
# Delete old archive logs (keep last 2 days)DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-2';
EXIT;EOF
echo "RMAN cleanup completed"
# Check FRA usage after cleanupsqlplus -s / as sysdba << EOFSET PAGESIZE 0 FEEDBACK OFFSELECT 'FRA Usage After Cleanup: ' || ROUND((space_used/space_limit)*100, 2) || '%'FROM v\$recovery_file_dest;EXIT;EOF
Manual RMAN Commands for Emergency Cleanup
Section titled “Manual RMAN Commands for Emergency Cleanup”-- Connect to RMANRMAN TARGET /
-- Crosscheck to identify missing filesCROSSCHECK BACKUP;CROSSCHECK ARCHIVELOG ALL;
-- Delete expired entriesDELETE NOPROMPT EXPIRED BACKUP;DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
-- Delete obsolete backups based on retention policyDELETE NOPROMPT OBSOLETE;
-- Force delete old archive logs (emergency only)DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-1'; -- Keep last 24 hours
-- Check what can be deleted safelyREPORT OBSOLETE;LIST ARCHIVELOG ALL;
-- Delete specific archive logs by sequence (if needed)DELETE NOPROMPT ARCHIVELOG FROM SEQUENCE 1000 UNTIL SEQUENCE 1500;
EXIT;
Solution 3: Move Files to Alternative Location
Section titled “Solution 3: Move Files to Alternative Location”Move Archive Logs Temporarily
Section titled “Move Archive Logs Temporarily”#!/bin/bash# move_archive_logs.sh - Temporary archive log relocation
ORACLE_SID=${1:-ORCL}FRA_DEST=$(sqlplus -s / as sysdba <<< "SELECT value FROM v\$parameter WHERE name='db_recovery_file_dest';" | grep -v '^$' | tail -1)TEMP_LOCATION=${2:-/tmp/archive_backup}
echo "Moving archive logs from FRA to temporary location..."echo "FRA: $FRA_DEST"echo "Temp: $TEMP_LOCATION"
# Create temporary directorymkdir -p "$TEMP_LOCATION"
# Find and move older archive logs (keep last 24 hours)find "$FRA_DEST" -name "*.arc" -mtime +1 -exec mv {} "$TEMP_LOCATION/" \;
echo "Moved archive logs to $TEMP_LOCATION"echo "Files moved: $(ls -1 $TEMP_LOCATION/*.arc 2>/dev/null | wc -l)"
# Update RMAN catalogrman target / << EOFCROSSCHECK ARCHIVELOG ALL;DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;EXIT;EOF
echo "Archive log move completed"
Relocate FRA to Larger Filesystem
Section titled “Relocate FRA to Larger Filesystem”-- Option 1: Change FRA location entirelyALTER SYSTEM SET db_recovery_file_dest = '/new/larger/location' SCOPE = BOTH;
-- Option 2: Add additional archive destinationsALTER SYSTEM SET log_archive_dest_2 = 'LOCATION=/additional/archive/location' SCOPE = BOTH;ALTER SYSTEM SET log_archive_dest_state_2 = ENABLE SCOPE = BOTH;
Long-Term Solutions
Section titled “Long-Term Solutions”1. Optimize RMAN Backup Strategy
Section titled “1. Optimize RMAN Backup Strategy”Configure Efficient Retention Policy
Section titled “Configure Efficient Retention Policy”-- Connect to RMAN and configure retentionRMAN TARGET /
-- Set appropriate retention policyCONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;-- OR for specific backup counts:-- CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
-- Configure backup optimizationCONFIGURE BACKUP OPTIMIZATION ON;CONFIGURE CONTROLFILE AUTOBACKUP ON;CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/location/%F';
-- Configure compression for space efficiencyCONFIGURE COMPRESSION ALGORITHM 'MEDIUM'; -- Oracle 12c+CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
-- Enable automatic deletion of filesCONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;-- OR for non-standby environments:-- CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK;
-- View current configurationSHOW ALL;
EXIT;
Implement Automated Backup Cleanup
Section titled “Implement Automated Backup Cleanup”#!/bin/bash# automated_backup_cleanup.sh - Daily FRA maintenance
ORACLE_SID=${1:-ORCL}RETENTION_DAYS=${2:-7}LOG_FILE="/var/log/oracle/fra_cleanup_${ORACLE_SID}.log"
exec > >(tee -a "$LOG_FILE")exec 2>&1
echo "========================================"echo "FRA Cleanup started: $(date)"echo "Oracle SID: $ORACLE_SID"echo "Retention: $RETENTION_DAYS days"echo "========================================"
export ORACLE_SID
# Check FRA usage before cleanupecho "FRA usage before cleanup:"sqlplus -s / as sysdba << EOFSET PAGESIZE 0 FEEDBACK OFFSELECT 'Size: ' || ROUND(space_limit/1024/1024/1024, 2) || 'GB, Used: ' || ROUND(space_used/1024/1024/1024, 2) || 'GB (' || ROUND((space_used/space_limit)*100, 2) || '%)'FROM v\$recovery_file_dest;EXIT;EOF
# RMAN cleanupecho ""echo "Running RMAN cleanup..."
rman target / << EOF# Crosscheck and delete expired filesCROSSCHECK BACKUP;CROSSCHECK ARCHIVELOG ALL;DELETE NOPROMPT EXPIRED BACKUP;DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
# Delete obsolete backupsDELETE NOPROMPT OBSOLETE;
# Delete old archive logs based on retentionDELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-${RETENTION_DAYS}';
# Report remaining filesREPORT OBSOLETE;EXIT;EOF
# Check FRA usage after cleanupecho ""echo "FRA usage after cleanup:"sqlplus -s / as sysdba << EOFSET PAGESIZE 0 FEEDBACK OFFSELECT 'Size: ' || ROUND(space_limit/1024/1024/1024, 2) || 'GB, Used: ' || ROUND(space_used/1024/1024/1024, 2) || 'GB (' || ROUND((space_used/space_limit)*100, 2) || '%)'FROM v\$recovery_file_dest;EXIT;EOF
echo "FRA Cleanup completed: $(date)"echo "========================================"
# Schedule this script in crontab:# 0 2 * * * /path/to/automated_backup_cleanup.sh ORCL 7
2. FRA Capacity Planning and Monitoring
Section titled “2. FRA Capacity Planning and Monitoring”Calculate Optimal FRA Size
Section titled “Calculate Optimal FRA Size”-- FRA sizing calculationWITH archive_stats AS ( SELECT AVG(daily_gb) as avg_daily_archive_gb, MAX(daily_gb) as max_daily_archive_gb FROM ( SELECT TO_CHAR(first_time, 'YYYY-MM-DD') as day, SUM(blocks * block_size)/1024/1024/1024 as daily_gb FROM v$archived_log WHERE first_time > SYSDATE - 30 GROUP BY TO_CHAR(first_time, 'YYYY-MM-DD') )),backup_stats AS ( SELECT AVG(backup_size_gb) as avg_backup_gb, MAX(backup_size_gb) as max_backup_gb FROM ( SELECT session_key, SUM(output_bytes)/1024/1024/1024 as backup_size_gb FROM v$rman_backup_job_details WHERE start_time > SYSDATE - 30 AND status = 'COMPLETED' GROUP BY session_key ))SELECT a.avg_daily_archive_gb, a.max_daily_archive_gb, b.avg_backup_gb, b.max_backup_gb, -- Recommended FRA size calculation ROUND( (a.max_daily_archive_gb * 7) + -- 7 days of max archive logs (b.max_backup_gb * 2) + -- 2 full backup sets 5 -- 5GB overhead , 0) as recommended_fra_size_gbFROM archive_stats a, backup_stats b;
Implement FRA Monitoring
Section titled “Implement FRA Monitoring”-- Create FRA monitoring tableCREATE TABLE fra_usage_log ( log_time TIMESTAMP DEFAULT SYSTIMESTAMP, size_gb NUMBER, used_gb NUMBER, reclaimable_gb NUMBER, pct_used NUMBER, file_count NUMBER, alert_sent CHAR(1) DEFAULT 'N');
-- Create FRA monitoring procedureCREATE OR REPLACE PROCEDURE monitor_fra_usage AS v_size_gb NUMBER; v_used_gb NUMBER; v_reclaimable_gb NUMBER; v_pct_used NUMBER; v_file_count NUMBER; v_alert_threshold NUMBER := 85; -- Alert at 85%BEGIN -- Get FRA usage statistics SELECT ROUND(space_limit/1024/1024/1024, 2), ROUND(space_used/1024/1024/1024, 2), ROUND(space_reclaimable/1024/1024/1024, 2), ROUND((space_used/space_limit)*100, 2), number_of_files INTO v_size_gb, v_used_gb, v_reclaimable_gb, v_pct_used, v_file_count FROM v$recovery_file_dest;
-- Log usage statistics INSERT INTO fra_usage_log ( size_gb, used_gb, reclaimable_gb, pct_used, file_count ) VALUES ( v_size_gb, v_used_gb, v_reclaimable_gb, v_pct_used, v_file_count );
-- Alert if usage exceeds threshold IF v_pct_used > v_alert_threshold THEN DBMS_OUTPUT.PUT_LINE('ALERT: FRA usage at ' || v_pct_used || '%'); DBMS_OUTPUT.PUT_LINE('Used: ' || v_used_gb || 'GB of ' || v_size_gb || 'GB'); DBMS_OUTPUT.PUT_LINE('Reclaimable: ' || v_reclaimable_gb || 'GB');
-- Update alert flag UPDATE fra_usage_log SET alert_sent = 'Y' WHERE log_time = (SELECT MAX(log_time) FROM fra_usage_log); END IF;
COMMIT;END;/
-- Schedule FRA monitoringBEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'MONITOR_FRA_JOB', job_type => 'STORED_PROCEDURE', job_action => 'monitor_fra_usage', repeat_interval => 'FREQ=HOURLY', enabled => TRUE );END;/
3. Advanced FRA Management
Section titled “3. Advanced FRA Management”Configure Multiple Archive Destinations
Section titled “Configure Multiple Archive Destinations”-- Configure additional archive destinations for overflowALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' SCOPE = BOTH;ALTER SYSTEM SET log_archive_dest_2 = 'LOCATION=/archive/overflow MANDATORY' SCOPE = BOTH;ALTER SYSTEM SET log_archive_dest_3 = 'LOCATION=/archive/remote OPTIONAL' SCOPE = BOTH;
-- Enable destinationsALTER SYSTEM SET log_archive_dest_state_1 = ENABLE SCOPE = BOTH;ALTER SYSTEM SET log_archive_dest_state_2 = ENABLE SCOPE = BOTH;ALTER SYSTEM SET log_archive_dest_state_3 = ENABLE SCOPE = BOTH;
-- Configure minimum successful destinationsALTER SYSTEM SET log_archive_min_succeed_dest = 1 SCOPE = BOTH;
Implement Archive Log Compression
Section titled “Implement Archive Log Compression”-- Enable archive log compression (12c+)ALTER SYSTEM SET archive_lag_target = 900 SCOPE = BOTH; -- Force log switch every 15 minALTER SYSTEM SET log_archive_format = 'arch_%t_%s_%r.arc' SCOPE = SPFILE;
-- Create compressed archive destination-- Note: Requires RMAN for compression, not direct ALTER SYSTEM
Prevention Strategies
Section titled “Prevention Strategies”1. Proactive Monitoring Setup
Section titled “1. Proactive Monitoring Setup”#!/bin/bash# fra_monitor.sh - Continuous FRA monitoring
ORACLE_SID=${1:-ORCL}ALERT_THRESHOLD=${2:-80}EMAIL_ALERT=${3:-dba@company.com}
export ORACLE_SID
while true; do FRA_PCT=$(sqlplus -s / as sysdba << EOFSET PAGESIZE 0 FEEDBACK OFFSELECT ROUND((space_used/space_limit)*100, 2)FROM v\$recovery_file_dest;EXIT;EOF)
if (( $(echo "$FRA_PCT > $ALERT_THRESHOLD" | bc -l) )); then echo "$(date): ALERT - FRA usage at ${FRA_PCT}%"
# Send email alert echo "FRA usage critical: ${FRA_PCT}%" | \ mail -s "Oracle FRA Alert - $ORACLE_SID" "$EMAIL_ALERT"
# Trigger automatic cleanup /path/to/automated_backup_cleanup.sh "$ORACLE_SID" 3 else echo "$(date): FRA usage OK: ${FRA_PCT}%" fi
sleep 300 # Check every 5 minutesdone
2. Capacity Planning Automation
Section titled “2. Capacity Planning Automation”-- Create capacity planning viewCREATE OR REPLACE VIEW fra_capacity_forecast ASWITH daily_growth AS ( SELECT TO_DATE(TO_CHAR(log_time, 'YYYY-MM-DD'), 'YYYY-MM-DD') as log_date, MAX(used_gb) - MIN(used_gb) as daily_growth_gb FROM fra_usage_log WHERE log_time > SYSDATE - 30 GROUP BY TO_DATE(TO_CHAR(log_time, 'YYYY-MM-DD'), 'YYYY-MM-DD')),growth_stats AS ( SELECT AVG(daily_growth_gb) as avg_daily_growth, MAX(daily_growth_gb) as max_daily_growth, PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY daily_growth_gb) as p95_daily_growth FROM daily_growth WHERE daily_growth_gb > 0),current_status AS ( SELECT size_gb, used_gb, (size_gb - used_gb) as free_gb, pct_used FROM fra_usage_log WHERE log_time = (SELECT MAX(log_time) FROM fra_usage_log))SELECT c.size_gb as current_size_gb, c.used_gb as current_used_gb, c.free_gb as current_free_gb, c.pct_used as current_pct_used, g.avg_daily_growth, g.max_daily_growth, g.p95_daily_growth, ROUND(c.free_gb / g.avg_daily_growth, 1) as days_until_full_avg, ROUND(c.free_gb / g.max_daily_growth, 1) as days_until_full_max, ROUND(c.size_gb + (g.p95_daily_growth * 30), 0) as recommended_size_gbFROM current_status c, growth_stats g;
-- Query capacity forecastSELECT * FROM fra_capacity_forecast;
Related Errors
Section titled “Related Errors”- ORA-00257 - Archiver error (escalation from ORA-19815)
- ORA-16038 - Log sequence cannot be archived
- ORA-01652 - Unable to extend temp segment
- ORA-19809 - Limit exceeded for recovery files (not documented yet)
Emergency Response
Section titled “Emergency Response”Quick Resolution Steps
Section titled “Quick Resolution Steps”-
Check FRA status immediately
SELECT ROUND((space_used/space_limit)*100,2) as pct_used FROM v$recovery_file_dest; -
Emergency space increase
ALTER SYSTEM SET db_recovery_file_dest_size = 100G SCOPE = BOTH; -
Quick RMAN cleanup
RMAN TARGET /DELETE NOPROMPT EXPIRED BACKUP;DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-1';EXIT; -
Monitor recovery
SELECT * FROM v$recovery_area_usage ORDER BY percent_space_used DESC;
Quick Reference Commands
Section titled “Quick Reference Commands”-- Check FRA usageSELECT space_limit/1024/1024/1024 as size_gb, space_used/1024/1024/1024 as used_gb, ROUND((space_used/space_limit)*100,2) as pct_usedFROM v$recovery_file_dest;
-- Increase FRA sizeALTER SYSTEM SET db_recovery_file_dest_size = 100G SCOPE = BOTH;
-- RMAN emergency cleanupDELETE NOPROMPT EXPIRED BACKUP;DELETE NOPROMPT OBSOLETE;DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-2';
-- Check what's consuming spaceSELECT file_type, percent_space_used, number_of_filesFROM v$recovery_area_usage ORDER BY percent_space_used DESC;
Emergency Shell Script
Section titled “Emergency Shell Script”#!/bin/bashORACLE_SID=${1:-ORCL}export ORACLE_SID
echo "Emergency FRA cleanup for $ORACLE_SID..."
# Increase FRA size temporarilysqlplus / as sysdba << EOFALTER SYSTEM SET db_recovery_file_dest_size = 200G SCOPE = MEMORY;EXIT;EOF
# RMAN cleanuprman target / << EOFCROSSCHECK BACKUP;DELETE NOPROMPT EXPIRED BACKUP;DELETE NOPROMPT OBSOLETE;DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-1';EXIT;EOF
echo "Emergency cleanup completed"