Files
ROMFASTSQL/oracle/standby-server-scripts/04_full_dr_restore.sh
Marius d5bfc6b5c7 Add Oracle DR standby server scripts and Proxmox troubleshooting docs
- Add comprehensive Oracle backup and DR strategy documentation
- Add RMAN backup scripts (full and incremental)
- Add PowerShell transfer scripts for DR site
- Add bash restore and verification scripts
- Reorganize Oracle documentation structure
- Add Proxmox troubleshooting guide for VM 201 HA errors and NFS storage issues

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-08 13:37:33 +03:00

261 lines
7.4 KiB
Bash

#!/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 / <<EOFRMAN
-- Set DBID (required for restore without catalog)
SET DBID $DBID;
-- Start instance NOMOUNT
STARTUP NOMOUNT FORCE;
-- Restore SPFILE from backup
RESTORE SPFILE FROM '$BACKUP_DIR';
-- Restart with restored SPFILE
SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;
-- Restore controlfile
RESTORE CONTROLFILE FROM '$BACKUP_DIR';
-- Mount database
ALTER DATABASE MOUNT;
-- Set new locations for datafiles (Linux paths)
RUN {
SET NEWNAME FOR DATABASE TO '/opt/oracle/oradata/ROA/%b';
-- Catalog toate backup-urile disponibile (full + incremental)
CATALOG START WITH '$BACKUP_DIR/';
-- Restore database (RMAN alege automat full + incremental!)
RESTORE DATABASE;
SWITCH DATAFILE ALL;
}
-- List what we have
LIST BACKUP SUMMARY;
EXIT;
EOFRMAN
" 2>&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 / <<EOFRMAN
-- Catalog arhivelog-urile dacă există
CATALOG START WITH '$BACKUP_DIR';
-- Recover database până la ultimul log disponibil
RECOVER DATABASE NOREDO;
EXIT;
EOFRMAN
" 2>&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 <<EOSQL
-- Open database cu RESETLOGS (obligatoriu după restore cross-platform)
ALTER DATABASE OPEN RESETLOGS;
-- Creare TEMP tablespace (nu e inclus în backup)
ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/oradata/ROA/temp01.dbf'
SIZE 500M AUTOEXTEND ON NEXT 10M MAXSIZE 2G;
-- Verificare status
SELECT name, open_mode, database_role FROM v\\\$database;
SELECT tablespace_name, status FROM dba_tablespaces;
EXIT;
EOSQL
" 2>&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 <<EOSQL
SET PAGESIZE 100
SELECT 'Total objects: ' || COUNT(*) as info FROM dba_objects;
SELECT 'Invalid objects: ' || COUNT(*) as info FROM dba_objects WHERE status='INVALID';
SELECT 'User tables: ' || COUNT(*) as info FROM dba_tables WHERE owner NOT IN ('SYS','SYSTEM');
SELECT tablespace_name, status FROM dba_tablespaces ORDER BY 1;
EXIT;
EOSQL
" 2>&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