- 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>
261 lines
7.4 KiB
Bash
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
|