#!/bin/bash # Full DR Restore Procedure pentru Oracle ROA # Database: ROA (PRIMARY 10.0.20.36 → DR 10.0.20.37) # Restore din RMAN backup cross-platform (Windows → Linux) set -e # ==================== CONFIGURATION ==================== BACKUP_DIR="${1:-/opt/oracle/backups/primary}" CONTAINER_NAME="oracle-standby" ORACLE_SID="ROA" ORACLE_HOME="/opt/oracle/product/19c/dbhome_1" DBID="1363569330" # DBID pentru database ROA LOG_FILE="/opt/oracle/logs/dr/restore_$(date +%Y%m%d_%H%M%S).log" # ==================== FUNCTIONS ==================== log() { local message="$1" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[$timestamp] $message" | tee -a "$LOG_FILE" } error_exit() { log "ERROR: $1" exit 1 } check_prerequisites() { log "Checking prerequisites..." # Check container running if ! docker ps | grep -q "$CONTAINER_NAME"; then error_exit "Container $CONTAINER_NAME is not running!" fi # Check backup files exist if [ ! -d "$BACKUP_DIR" ]; then error_exit "Backup directory not found: $BACKUP_DIR" fi local backup_count=$(find "$BACKUP_DIR" -name "*.BKP" -o -name "*.bkp" 2>/dev/null | wc -l) if [ "$backup_count" -eq 0 ]; then error_exit "No backup files found in $BACKUP_DIR" fi log "Found $backup_count backup files" # Check PRIMARY is really down (IMPORTANT!) log "Verifying PRIMARY server is down..." if ping -c 3 -W 2 10.0.20.36 &>/dev/null; then log "WARNING: PRIMARY 10.0.20.36 is responding to ping!" log "Press Ctrl+C within 10 seconds to ABORT, or wait to continue anyway..." sleep 10 fi log "✅ Prerequisites check passed" } cleanup_old_data() { log "Cleaning up old database files..." # Stop any running database docker exec -u oracle $CONTAINER_NAME bash -c " export ORACLE_SID=$ORACLE_SID export ORACLE_HOME=$ORACLE_HOME echo 'SHUTDOWN ABORT;' | \$ORACLE_HOME/bin/sqlplus -S / as sysdba 2>/dev/null || true " 2>/dev/null || true # Clean old datafiles docker exec $CONTAINER_NAME rm -rf /opt/oracle/oradata/ROA/* 2>/dev/null || true docker exec $CONTAINER_NAME mkdir -p /opt/oracle/oradata/ROA docker exec $CONTAINER_NAME chown -R oracle:dba /opt/oracle/oradata/ROA log "✅ Cleanup complete" } restore_database() { log "=========================================" log "Starting RMAN RESTORE" log "=========================================" # Găsește cel mai recent backup local latest_backup=$(find "$BACKUP_DIR" -name "*.BKP" -o -name "*.bkp" | head -1) log "Using backup from: $BACKUP_DIR" log "First backup file: $(basename $latest_backup)" # RMAN Restore log "Executing RMAN restore..." docker exec -u oracle $CONTAINER_NAME bash -c " export ORACLE_SID=$ORACLE_SID export ORACLE_HOME=$ORACLE_HOME export PATH=\$ORACLE_HOME/bin:\$PATH \$ORACLE_HOME/bin/rman TARGET / <&1 | tee -a "$LOG_FILE" if [ ${PIPESTATUS[0]} -ne 0 ]; then error_exit "RMAN RESTORE failed! Check log: $LOG_FILE" fi log "✅ RESTORE completed successfully" } recover_database() { log "=========================================" log "Starting RMAN RECOVER" log "=========================================" docker exec -u oracle $CONTAINER_NAME bash -c " export ORACLE_SID=$ORACLE_SID export ORACLE_HOME=$ORACLE_HOME export PATH=\$ORACLE_HOME/bin:\$PATH \$ORACLE_HOME/bin/rman TARGET / <&1 | tee -a "$LOG_FILE" # Recovery poate să eșueze dacă nu sunt archive logs - e OK log "✅ RECOVER completed" } open_database() { log "=========================================" log "Opening database with RESETLOGS" log "=========================================" docker exec -u oracle $CONTAINER_NAME bash -c " export ORACLE_SID=$ORACLE_SID export ORACLE_HOME=$ORACLE_HOME export PATH=\$ORACLE_HOME/bin:\$PATH \$ORACLE_HOME/bin/sqlplus / as sysdba <&1 | tee -a "$LOG_FILE" if [ ${PIPESTATUS[0]} -ne 0 ]; then error_exit "Failed to open database! Check log: $LOG_FILE" fi log "✅ Database OPEN!" } verify_database() { log "=========================================" log "Running verification checks" log "=========================================" docker exec -u oracle $CONTAINER_NAME bash -c " export ORACLE_SID=$ORACLE_SID export ORACLE_HOME=$ORACLE_HOME \$ORACLE_HOME/bin/sqlplus / as sysdba <&1 | tee -a "$LOG_FILE" log "✅ Verification complete" } # ==================== MAIN ==================== log "=========================================" log "Oracle DR FULL RESTORE Started" log "=========================================" log "Backup directory: $BACKUP_DIR" log "Container: $CONTAINER_NAME" log "Database SID: $ORACLE_SID" log "DBID: $DBID" log "Log file: $LOG_FILE" log "=========================================" # Execute steps check_prerequisites cleanup_old_data restore_database recover_database open_database verify_database log "=========================================" log "DR RESTORE COMPLETED SUCCESSFULLY!" log "=========================================" log "" log "Database ROA is now running on 10.0.20.37:1521" log "" log "⚠️ NEXT ACTIONS REQUIRED:" log " 1. Update application connection strings to: 10.0.20.37:1521/ROA" log " 2. Notify users about DR activation" log " 3. Test application connectivity" log " 4. Monitor database performance" log " 5. Plan PRIMARY server rebuild when ready" log "" log "=========================================" exit 0