Oracle DR: Complete Windows VM implementation and cleanup

Major changes:
- Implemented Windows VM 109 as DR target (replaces Linux LXC)
- Tested RMAN restore successfully (12-15 min RTO, 24h RPO)
- Added comprehensive DR documentation:
  * DR_WINDOWS_VM_STATUS_2025-10-09.md - Current implementation status
  * DR_UPGRADE_TO_CUMULATIVE_PLAN.md - Plan for cumulative incremental backups
  * DR_VM_MIGRATION_GUIDE.md - Guide for VM migration between Proxmox nodes
- Updated DR_WINDOWS_VM_IMPLEMENTATION_PLAN.md with completed phases

New scripts:
- add_system_key_dr.ps1 - SSH key setup for automated transfers
- configure_listener_dr.ps1 - Oracle Listener configuration
- fix_ssh_via_service.ps1 - SSH authentication fix
- rman_restore_final.cmd - Working RMAN restore script (tested)
- transfer_to_dr.ps1 - FULL backup transfer (renamed from 02_*)
- transfer_incremental.ps1 - Incremental backup transfer (renamed from 02b_*)

Cleanup:
- Removed 19 obsolete scripts for Linux LXC DR
- Removed 8 outdated documentation files
- Organized project structure

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Marius
2025-10-09 18:54:08 +03:00
parent 6a6ffe84af
commit ac2340c967
26 changed files with 2309 additions and 6208 deletions

BIN
input/screenshot.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@@ -1,19 +0,0 @@
RUN {
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE COMPRESSION ALGORITHM 'BASIC';
# Full backup COMPRESSED + Archive logs (șterge logs după backup)
BACKUP AS COMPRESSED BACKUPSET
INCREMENTAL LEVEL 0
TAG 'DAILY_FULL_COMPRESSED'
DATABASE
PLUS ARCHIVELOG DELETE INPUT;
# Backup SPFILE și Control File
BACKUP AS COMPRESSED BACKUPSET SPFILE;
BACKUP CURRENT CONTROLFILE;
# Cleanup old backups (păstrează ultimele 2 - REDUNDANCY 2)
DELETE NOPROMPT OBSOLETE;
}

View File

@@ -1,15 +0,0 @@
RUN {
# Incremental Level 1 CUMULATIVE backup
# Backup doar modificările de la ultimul Level 0 (full backup de la 02:00 AM)
BACKUP AS COMPRESSED BACKUPSET
INCREMENTAL LEVEL 1 CUMULATIVE
TAG 'MIDDAY_INCREMENTAL'
DATABASE
PLUS ARCHIVELOG DELETE INPUT;
# Backup SPFILE și controlfile (pentru siguranță)
BACKUP AS COMPRESSED BACKUPSET SPFILE;
BACKUP CURRENT CONTROLFILE;
# NU ștergem obsolete aici - se face la full backup
}

View File

@@ -1,99 +0,0 @@
# Setup Windows Task Scheduler pentru Oracle DR Transfer
# Rulează ca Administrator!
# Verificare admin rights
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Error "This script must be run as Administrator!"
exit 1
}
Write-Host "Setting up Oracle DR Transfer scheduled task..." -ForegroundColor Cyan
# Creare director logs dacă nu există
$logDir = "D:\rman_backup\logs"
if (-not (Test-Path $logDir)) {
New-Item -ItemType Directory -Force -Path $logDir | Out-Null
Write-Host "Created log directory: $logDir" -ForegroundColor Green
}
# Task pentru transfer DR (la 03:00 AM zilnic)
$taskName = "Oracle_DR_Transfer"
$scriptPath = "D:\rman_backup\transfer_to_dr.ps1"
# Verificare că scriptul există
if (-not (Test-Path $scriptPath)) {
Write-Error "Transfer script not found at: $scriptPath"
Write-Host "Please copy 02_transfer_to_dr.ps1 to D:\rman_backup\transfer_to_dr.ps1" -ForegroundColor Yellow
exit 1
}
# Creare task action
$action = New-ScheduledTaskAction `
-Execute "PowerShell.exe" `
-Argument "-ExecutionPolicy Bypass -NoProfile -File `"$scriptPath`""
# Trigger: zilnic la 03:00 AM (după backup RMAN de la 02:00)
$trigger = New-ScheduledTaskTrigger -Daily -At "03:00AM"
# Principal: SYSTEM account cu highest privileges
$principal = New-ScheduledTaskPrincipal `
-UserId "SYSTEM" `
-LogonType ServiceAccount `
-RunLevel Highest
# Settings
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 5)
# Șterge task-ul dacă există deja
$existingTask = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
if ($existingTask) {
Write-Host "Removing existing task: $taskName" -ForegroundColor Yellow
Unregister-ScheduledTask -TaskName $taskName -Confirm:$false
}
# Înregistrare task nou
try {
Register-ScheduledTask `
-TaskName $taskName `
-Action $action `
-Trigger $trigger `
-Principal $principal `
-Settings $settings `
-Description "Oracle DR - Transfer RMAN backups to DR server 10.0.20.37 daily at 3 AM" `
-ErrorAction Stop
Write-Host "✅ Task created successfully: $taskName" -ForegroundColor Green
# Afișare detalii
Write-Host "`nTask details:" -ForegroundColor Cyan
Write-Host " Name: $taskName"
Write-Host " Schedule: Daily at 03:00 AM"
Write-Host " Script: $scriptPath"
Write-Host " Logs: $logDir\transfer_YYYYMMDD.log"
# Test manual (opțional)
Write-Host "`nTo test the task manually, run:" -ForegroundColor Yellow
Write-Host " Start-ScheduledTask -TaskName '$taskName'" -ForegroundColor White
# Verificare task
$task = Get-ScheduledTask -TaskName $taskName
Write-Host "`nTask status: $($task.State)" -ForegroundColor Green
} catch {
Write-Error "Failed to create scheduled task: $_"
exit 1
}
Write-Host "`n=========================================" -ForegroundColor Green
Write-Host "Setup complete!" -ForegroundColor Green
Write-Host "=========================================" -ForegroundColor Green
Write-Host "`nNext steps:"
Write-Host "1. Setup SSH keys for passwordless login to DR server"
Write-Host "2. Test the transfer script manually:"
Write-Host " PowerShell -File $scriptPath"
Write-Host "3. Verify the scheduled task runs successfully tomorrow at 03:00 AM"

View File

@@ -1,158 +0,0 @@
# Setup Windows Task Scheduler pentru Incremental Backup și Transfer
# Rulează ca Administrator!
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Error "This script must be run as Administrator!"
exit 1
}
Write-Host "Setting up Oracle INCREMENTAL backup tasks..." -ForegroundColor Cyan
# ==================== TASK 1: Incremental RMAN Backup ====================
$taskName1 = "Oracle_IncrementalBackup"
$rmanScriptPath = "D:\rman_backup\rman_backup_incremental.bat"
# Creează BAT wrapper pentru RMAN incremental
$batContent = @"
@echo off
REM Incremental RMAN Backup - Midday
echo [%DATE% %TIME%] Starting incremental backup...
rman target sys/romfastsoft@roa @'D:\RMAN_BACKUP\rman_backup_incremental.txt'
echo [%DATE% %TIME%] Incremental backup completed
"@
New-Item -ItemType Directory -Force -Path "D:\rman_backup" | Out-Null
$batContent | Out-File -FilePath $rmanScriptPath -Encoding ASCII -Force
# Verificare că scriptul RMAN incremental există
$rmanIncrScript = "D:\rman_backup\rman_backup_incremental.txt"
if (-not (Test-Path $rmanIncrScript)) {
Write-Host "⚠️ RMAN incremental script not found at: $rmanIncrScript" -ForegroundColor Yellow
Write-Host "Please copy 01b_rman_backup_incremental.txt to D:\rman_backup\rman_backup_incremental.txt" -ForegroundColor Yellow
Write-Host "Continuing with task creation..." -ForegroundColor Yellow
}
# Task action pentru incremental backup
$action1 = New-ScheduledTaskAction `
-Execute "cmd.exe" `
-Argument "/c `"$rmanScriptPath`""
# Trigger: zilnic la 14:00 (mijlocul zilei - după pauza de masă)
$trigger1 = New-ScheduledTaskTrigger -Daily -At "14:00"
# Principal: SYSTEM account
$principal = New-ScheduledTaskPrincipal `
-UserId "SYSTEM" `
-LogonType ServiceAccount `
-RunLevel Highest
# Settings
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 5)
# Șterge task vechi dacă există
$existingTask1 = Get-ScheduledTask -TaskName $taskName1 -ErrorAction SilentlyContinue
if ($existingTask1) {
Write-Host "Removing existing task: $taskName1" -ForegroundColor Yellow
Unregister-ScheduledTask -TaskName $taskName1 -Confirm:$false
}
# Creare task incremental backup
try {
Register-ScheduledTask `
-TaskName $taskName1 `
-Action $action1 `
-Trigger $trigger1 `
-Principal $principal `
-Settings $settings `
-Description "Oracle - Incremental RMAN backup daily at 14:00 (midday)" `
-ErrorAction Stop
Write-Host "✅ Task created: $taskName1" -ForegroundColor Green
} catch {
Write-Error "Failed to create task $taskName1 : $_"
exit 1
}
# ==================== TASK 2: Transfer Incremental to DR ====================
$taskName2 = "Oracle_DR_TransferIncremental"
$transferScriptPath = "D:\rman_backup\transfer_incremental_to_dr.ps1"
# Verificare că scriptul de transfer există
if (-not (Test-Path $transferScriptPath)) {
Write-Host "⚠️ Transfer script not found at: $transferScriptPath" -ForegroundColor Yellow
Write-Host "Please copy 02b_transfer_incremental_to_dr.ps1 to D:\rman_backup\" -ForegroundColor Yellow
}
# Task action pentru transfer incremental
$action2 = New-ScheduledTaskAction `
-Execute "PowerShell.exe" `
-Argument "-ExecutionPolicy Bypass -NoProfile -File `"$transferScriptPath`""
# Trigger: zilnic la 14:30 (30 min după incremental backup)
$trigger2 = New-ScheduledTaskTrigger -Daily -At "14:30"
# Șterge task vechi
$existingTask2 = Get-ScheduledTask -TaskName $taskName2 -ErrorAction SilentlyContinue
if ($existingTask2) {
Write-Host "Removing existing task: $taskName2" -ForegroundColor Yellow
Unregister-ScheduledTask -TaskName $taskName2 -Confirm:$false
}
# Creare task transfer incremental
try {
Register-ScheduledTask `
-TaskName $taskName2 `
-Action $action2 `
-Trigger $trigger2 `
-Principal $principal `
-Settings $settings `
-Description "Oracle DR - Transfer incremental backups to DR server daily at 14:30" `
-ErrorAction Stop
Write-Host "✅ Task created: $taskName2" -ForegroundColor Green
} catch {
Write-Error "Failed to create task $taskName2 : $_"
exit 1
}
# ==================== SUMMARY ====================
Write-Host "`n=========================================" -ForegroundColor Green
Write-Host "Incremental Backup Tasks Setup Complete!" -ForegroundColor Green
Write-Host "=========================================" -ForegroundColor Green
Write-Host "`nTasks created:"
Write-Host " 1. $taskName1"
Write-Host " Schedule: Daily at 14:00"
Write-Host " Action: RMAN incremental backup"
Write-Host ""
Write-Host " 2. $taskName2"
Write-Host " Schedule: Daily at 14:30"
Write-Host " Action: Transfer to DR server"
Write-Host "`nDaily timeline:"
Write-Host " 02:00 → Full backup (existent)"
Write-Host " 03:00 → Transfer full to DR (existent)"
Write-Host " 14:00 → Incremental backup (NOU!)"
Write-Host " 14:30 → Transfer incremental to DR (NOU!)"
Write-Host " 21:00 → Copy to E:\ external HDD (existent)"
Write-Host "`n⚠️ IMPORTANT - Files needed:" -ForegroundColor Yellow
Write-Host " 1. Copy 01b_rman_backup_incremental.txt → D:\rman_backup\rman_backup_incremental.txt"
Write-Host " 2. Copy 02b_transfer_incremental_to_dr.ps1 → D:\rman_backup\transfer_incremental_to_dr.ps1"
Write-Host "`nVerify tasks:"
Write-Host " Get-ScheduledTask | Where-Object { `$_.TaskName -like 'Oracle*' }"
Write-Host "`nTest manual:"
Write-Host " Start-ScheduledTask -TaskName '$taskName1'"
Write-Host " Start-ScheduledTask -TaskName '$taskName2'"
Write-Host "`n=========================================" -ForegroundColor Green

View File

@@ -1,260 +0,0 @@
#!/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

View File

@@ -1,408 +0,0 @@
#!/bin/bash
# Test Restore pe DR - Verificare că backup-urile pot fi restaurate
# Rulează acest script LUNAR pentru a valida disaster recovery capability
# NU afectează production - folosește database temporar
set -e
# ==================== CONFIGURATION ====================
BACKUP_DIR="${1:-/opt/oracle/backups/primary}"
CONTAINER_NAME="oracle-standby"
ORACLE_SID="ROA"
TEST_SID="ROATEST" # Database temporar pentru test
ORACLE_HOME="/opt/oracle/product/19c/dbhome_1"
DBID="1363569330"
LOG_FILE="/opt/oracle/logs/dr/test_restore_$(date +%Y%m%d_%H%M%S).log"
# Colors pentru output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# ==================== FUNCTIONS ====================
log() {
local message="$1"
local level="${2:-INFO}"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
case "$level" in
"ERROR") color="$RED" ;;
"SUCCESS") color="$GREEN" ;;
"WARNING") color="$YELLOW" ;;
"INFO") color="$BLUE" ;;
*) color="$NC" ;;
esac
echo -e "${color}[$timestamp] [$level] $message${NC}" | tee -a "$LOG_FILE"
}
error_exit() {
log "$1" "ERROR"
cleanup_test_database
exit 1
}
check_prerequisites() {
log "=== Checking Prerequisites ===" "INFO"
# Check container running
if ! docker ps | grep -q "$CONTAINER_NAME"; then
error_exit "Container $CONTAINER_NAME is not running!"
fi
log "✅ Container is running" "SUCCESS"
# 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" "SUCCESS"
# Check disk space (need at least 30GB free)
local free_space=$(df -BG "$BACKUP_DIR" | tail -1 | awk '{print $4}' | sed 's/G//')
if [ "$free_space" -lt 30 ]; then
error_exit "Not enough disk space! Need 30GB, have ${free_space}GB"
fi
log "✅ Disk space available: ${free_space}GB" "SUCCESS"
}
cleanup_test_database() {
log "=== Cleaning up test database ===" "WARNING"
# Stop test database if running
docker exec -u oracle $CONTAINER_NAME bash -c "
export ORACLE_SID=$TEST_SID
export ORACLE_HOME=$ORACLE_HOME
echo 'SHUTDOWN ABORT;' | \$ORACLE_HOME/bin/sqlplus -S / as sysdba 2>/dev/null || true
" 2>/dev/null || true
# Remove test datafiles
docker exec $CONTAINER_NAME rm -rf /opt/oracle/oradata/ROATEST 2>/dev/null || true
# Remove test SPFILE/init file
docker exec $CONTAINER_NAME bash -c "
rm -f /opt/oracle/product/19c/dbhome_1/dbs/spfile${TEST_SID}.ora 2>/dev/null || true
rm -f /opt/oracle/product/19c/dbhome_1/dbs/init${TEST_SID}.ora 2>/dev/null || true
" 2>/dev/null || true
log "✅ Cleanup completed" "SUCCESS"
}
test_restore() {
log "=========================================" "INFO"
log "PHASE 1: RMAN RESTORE TEST" "INFO"
log "=========================================" "INFO"
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)"
docker exec -u oracle $CONTAINER_NAME bash -c "
export ORACLE_SID=$TEST_SID
export ORACLE_HOME=$ORACLE_HOME
export PATH=\$ORACLE_HOME/bin:\$PATH
\$ORACLE_HOME/bin/rman TARGET / <<EOFRMAN
-- Set DBID
SET DBID $DBID;
-- Start instance NOMOUNT
STARTUP NOMOUNT FORCE;
-- Restore SPFILE to test location
RESTORE SPFILE TO '/opt/oracle/product/19c/dbhome_1/dbs/spfile${TEST_SID}.ora' FROM '$BACKUP_DIR';
-- Restart with test SPFILE
SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT PFILE='/opt/oracle/product/19c/dbhome_1/dbs/spfile${TEST_SID}.ora';
-- Restore controlfile
RESTORE CONTROLFILE FROM '$BACKUP_DIR';
-- Mount database
ALTER DATABASE MOUNT;
-- Set new locations for test datafiles
RUN {
SET NEWNAME FOR DATABASE TO '/opt/oracle/oradata/ROATEST/%b';
RESTORE DATABASE;
SWITCH DATAFILE ALL;
}
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 phase completed successfully" "SUCCESS"
}
test_recover() {
log "=========================================" "INFO"
log "PHASE 2: RMAN RECOVER TEST" "INFO"
log "=========================================" "INFO"
docker exec -u oracle $CONTAINER_NAME bash -c "
export ORACLE_SID=$TEST_SID
export ORACLE_HOME=$ORACLE_HOME
export PATH=\$ORACLE_HOME/bin:\$PATH
\$ORACLE_HOME/bin/rman TARGET / <<EOFRMAN
-- Catalog archived logs if available
CATALOG START WITH '$BACKUP_DIR';
-- Recover database (best effort)
RECOVER DATABASE NOREDO;
EXIT;
EOFRMAN
" 2>&1 | tee -a "$LOG_FILE"
log "✅ RECOVER phase completed" "SUCCESS"
}
test_open() {
log "=========================================" "INFO"
log "PHASE 3: OPEN DATABASE TEST" "INFO"
log "=========================================" "INFO"
docker exec -u oracle $CONTAINER_NAME bash -c "
export ORACLE_SID=$TEST_SID
export ORACLE_HOME=$ORACLE_HOME
export PATH=\$ORACLE_HOME/bin:\$PATH
\$ORACLE_HOME/bin/sqlplus / as sysdba <<EOSQL
-- Open database with RESETLOGS
ALTER DATABASE OPEN RESETLOGS;
-- Create TEMP tablespace
ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/oradata/ROATEST/temp01.dbf'
SIZE 500M AUTOEXTEND ON NEXT 10M MAXSIZE 2G;
-- Verification queries
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 successfully" "SUCCESS"
}
test_data_integrity() {
log "=========================================" "INFO"
log "PHASE 4: DATA INTEGRITY VERIFICATION" "INFO"
log "=========================================" "INFO"
docker exec -u oracle $CONTAINER_NAME bash -c "
export ORACLE_SID=$TEST_SID
export ORACLE_HOME=$ORACLE_HOME
\$ORACLE_HOME/bin/sqlplus / as sysdba <<EOSQL
SET PAGESIZE 100
SET LINESIZE 150
PROMPT === Database Objects Count ===
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');
PROMPT
PROMPT === Tablespaces Status ===
SELECT tablespace_name, status, contents FROM dba_tablespaces ORDER BY 1;
PROMPT
PROMPT === Datafiles Status ===
SELECT file_name, tablespace_name, bytes/1024/1024 as MB, status
FROM dba_data_files
ORDER BY tablespace_name;
PROMPT
PROMPT === Sample Data Verification (if tables exist) ===
-- Try to query some application tables (adjust table names as needed)
DECLARE
v_count NUMBER;
BEGIN
-- Check if we can query data
SELECT COUNT(*) INTO v_count FROM dual;
DBMS_OUTPUT.PUT_LINE('✅ Basic query works: ' || v_count);
-- Add more specific checks for your tables here
-- Example: SELECT COUNT(*) INTO v_count FROM your_critical_table;
END;
/
EXIT;
EOSQL
" 2>&1 | tee -a "$LOG_FILE"
if [ ${PIPESTATUS[0]} -ne 0 ]; then
log "⚠️ Some verification queries failed (might be normal)" "WARNING"
else
log "✅ Data integrity verification completed" "SUCCESS"
fi
}
calculate_rto() {
log "=========================================" "INFO"
log "PHASE 5: RTO CALCULATION" "INFO"
log "=========================================" "INFO"
local start_time=$(head -1 "$LOG_FILE" | grep -oP '\[\K[^]]+')
local end_time=$(date '+%Y-%m-%d %H:%M:%S')
local start_epoch=$(date -d "$start_time" +%s)
local end_epoch=$(date -d "$end_time" +%s)
local duration=$((end_epoch - start_epoch))
local minutes=$((duration / 60))
local seconds=$((duration % 60))
log "Test started at: $start_time"
log "Test ended at: $end_time"
log "Total duration: $minutes minutes $seconds seconds"
if [ $minutes -lt 45 ]; then
log "✅ RTO EXCELLENT: Under 45 minutes!" "SUCCESS"
elif [ $minutes -lt 60 ]; then
log "✅ RTO GOOD: Under 60 minutes" "SUCCESS"
elif [ $minutes -lt 75 ]; then
log "⚠️ RTO ACCEPTABLE: Under 75 minutes" "WARNING"
else
log "❌ RTO TOO HIGH: Over 75 minutes - investigation needed!" "ERROR"
fi
log "Expected RTO for production: 45-75 minutes"
}
generate_test_report() {
log "=========================================" "INFO"
log "GENERATING TEST REPORT" "INFO"
log "=========================================" "INFO"
local report_file="/opt/oracle/logs/dr/test_report_$(date +%Y%m%d).txt"
cat > "$report_file" <<EOF
================================================================================
ORACLE DR RESTORE TEST REPORT
================================================================================
Test Date: $(date '+%Y-%m-%d %H:%M:%S')
Backup Location: $BACKUP_DIR
Test Database: $TEST_SID
Log File: $LOG_FILE
================================================================================
TEST PHASES COMPLETED:
================================================================================
✅ Phase 1: RMAN RESTORE - SUCCESS
✅ Phase 2: RMAN RECOVER - SUCCESS
✅ Phase 3: DATABASE OPEN - SUCCESS
✅ Phase 4: DATA INTEGRITY - VERIFIED
✅ Phase 5: RTO CALCULATION - MEASURED
================================================================================
SUMMARY:
================================================================================
EOF
# Extract key metrics from log
echo "" >> "$report_file"
echo "Backup Files Count:" >> "$report_file"
find "$BACKUP_DIR" -name "*.BKP" -o -name "*.bkp" | wc -l >> "$report_file"
echo "" >> "$report_file"
echo "Total Backup Size:" >> "$report_file"
du -sh "$BACKUP_DIR" >> "$report_file"
echo "" >> "$report_file"
echo "Test Duration:" >> "$report_file"
tail -20 "$LOG_FILE" | grep "Total duration" >> "$report_file"
echo "" >> "$report_file"
echo "================================================================================
CONCLUSION:
================================================================================
✅ DR RESTORE CAPABILITY: VERIFIED
✅ Backup-urile de pe DR server pot fi restaurate cu SUCCESS
✅ Database poate fi deschis și accesat
✅ RTO se încadrează în target-ul stabilit (45-75 min)
RECOMANDĂRI:
- Rulează acest test LUNAR (prima Duminică a lunii)
- Monitorizează RTO și optimizează dacă crește
- Verifică că backup-urile noi sunt transferate corect
NEXT TEST DUE: $(date -d "+1 month" '+%Y-%m-%d')
================================================================================
" >> "$report_file"
log "📄 Test report generated: $report_file" "SUCCESS"
# Display report
cat "$report_file"
}
# ==================== MAIN ====================
log "=========================================" "INFO"
log "ORACLE DR RESTORE TEST STARTED" "INFO"
log "=========================================" "INFO"
log "Backup directory: $BACKUP_DIR"
log "Container: $CONTAINER_NAME"
log "Test SID: $TEST_SID"
log "Log file: $LOG_FILE"
log "=========================================" "INFO"
# Execute test phases
check_prerequisites
cleanup_test_database # Clean any previous test data
log "" "INFO"
log "⚠️ WARNING: This test will take 30-60 minutes" "WARNING"
log "⚠️ The test database ($TEST_SID) will be created temporarily" "WARNING"
log "⚠️ Production database ($ORACLE_SID) will NOT be affected" "WARNING"
log "" "INFO"
read -p "Press ENTER to continue or Ctrl+C to abort..." dummy
test_restore
test_recover
test_open
test_data_integrity
calculate_rto
# Cleanup
cleanup_test_database
# Generate report
generate_test_report
log "=========================================" "SUCCESS"
log "DR RESTORE TEST COMPLETED SUCCESSFULLY!" "SUCCESS"
log "=========================================" "SUCCESS"
log ""
log "✅ Backup-urile pot fi restaurate cu SUCCESS"
log "✅ Database recovery e funcțional"
log "✅ DR capability VALIDAT"
log ""
log "📄 Full report: /opt/oracle/logs/dr/test_report_$(date +%Y%m%d).txt"
log "📝 Detailed log: $LOG_FILE"
exit 0

View File

@@ -1,124 +0,0 @@
#!/bin/bash
# Quick Backup Verification - Verificare zilnică că backup-urile sunt OK
# Rulează acest script ZILNIC (automat via cron) pentru monitoring
BACKUP_DIR="/opt/oracle/backups/primary"
LOG_FILE="/opt/oracle/logs/dr/verify_$(date +%Y%m%d).log"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log() {
local message="$1"
local level="${2:-INFO}"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
case "$level" in
"ERROR") color="$RED" ;;
"SUCCESS") color="$GREEN" ;;
"WARNING") color="$YELLOW" ;;
*) color="$NC" ;;
esac
echo -e "${color}[$timestamp] [$level] $message${NC}" | tee -a "$LOG_FILE"
}
alert_email() {
# TODO: Configure email alerts
# echo "$1" | mail -s "Oracle DR Alert" admin@company.com
log "ALERT: $1" "ERROR"
}
# ==================== CHECKS ====================
log "=== DR Backup Verification Started ===" "INFO"
# Check 1: Backup directory exists
if [ ! -d "$BACKUP_DIR" ]; then
alert_email "Backup directory not found: $BACKUP_DIR"
exit 1
fi
log "✅ Backup directory exists"
# Check 2: Backup files present
backup_count=$(find "$BACKUP_DIR" -name "*.BKP" -o -name "*.bkp" 2>/dev/null | wc -l)
if [ "$backup_count" -eq 0 ]; then
alert_email "No backup files found in $BACKUP_DIR"
exit 1
fi
log "✅ Found $backup_count backup file(s)"
# Check 3: Latest backup age
latest_backup=$(find "$BACKUP_DIR" -name "*.BKP" -o -name "*.bkp" 2>/dev/null | head -1)
if [ -z "$latest_backup" ]; then
alert_email "No backup files found!"
exit 1
fi
latest_backup_age=$(( ($(date +%s) - $(stat -c %Y "$latest_backup")) / 3600 ))
log "Latest backup: $(basename $latest_backup)"
log "Backup age: $latest_backup_age hours"
if [ $latest_backup_age -gt 30 ]; then
alert_email "Latest backup is too old: $latest_backup_age hours (expected <30h)"
log "❌ Backup TOO OLD!" "ERROR"
exit 1
elif [ $latest_backup_age -gt 26 ]; then
log "⚠️ Backup is getting old (>26h)" "WARNING"
else
log "✅ Backup age is good (<26h)" "SUCCESS"
fi
# Check 4: Backup size reasonable
backup_size=$(du -sh "$BACKUP_DIR" 2>/dev/null | awk '{print $1}')
log "Total backup size: $backup_size"
# Check 5: Disk space available
free_space=$(df -h "$BACKUP_DIR" | tail -1 | awk '{print $4}')
free_space_gb=$(df -BG "$BACKUP_DIR" | tail -1 | awk '{print $4}' | sed 's/G//')
log "Free disk space: $free_space ($free_space_gb GB)"
if [ "$free_space_gb" -lt 10 ]; then
alert_email "Low disk space on DR: only ${free_space_gb}GB free!"
log "❌ DISK SPACE LOW!" "ERROR"
elif [ "$free_space_gb" -lt 20 ]; then
log "⚠️ Disk space getting low (<20GB)" "WARNING"
else
log "✅ Disk space OK (>20GB free)" "SUCCESS"
fi
# Check 6: File integrity (quick check - just read first and last block)
log "Running quick file integrity check..."
if head -c 1024 "$latest_backup" > /dev/null 2>&1 && tail -c 1024 "$latest_backup" > /dev/null 2>&1; then
log "✅ Backup file is readable" "SUCCESS"
else
alert_email "Backup file appears corrupted: $latest_backup"
log "❌ BACKUP FILE CORRUPTED!" "ERROR"
exit 1
fi
# Check 7: List all backup files with details
log ""
log "=== Backup Files Inventory ===" "INFO"
find "$BACKUP_DIR" -name "*.BKP" -o -name "*.bkp" 2>/dev/null | while read file; do
size=$(du -h "$file" | awk '{print $1}')
age=$(( ($(date +%s) - $(stat -c %Y "$file")) / 3600 ))
log " - $(basename $file): $size (${age}h old)"
done
# Summary
log ""
log "=== Verification Summary ===" "INFO"
log "✅ Backup directory: OK"
log "✅ Backup files: $backup_count present"
log "✅ Latest backup age: ${latest_backup_age}h (threshold: 30h)"
log "✅ Disk space: ${free_space_gb}GB free"
log "✅ File integrity: OK"
log ""
log "=== DR Backup Verification COMPLETED ===" "SUCCESS"
exit 0

View File

@@ -1,561 +0,0 @@
# Oracle DR Restore - Troubleshooting și Progres Implementare
**Data:** 2025-10-08
**Obiectiv:** Implementare script DR restore cross-platform (Windows PRIMARY → Linux DR)
**Status:** 98% - Blocaj tehnic la CREATE CONTROLFILE (chicken-and-egg problem)
---
## CONTEXT GENERAL
### Infrastructură
- **PRIMARY:** Windows Server, Oracle 19c SE2, Database ROA, IP: 10.0.20.36
- **DR:** Linux LXC 109, Docker container oracle-standby, IP: 10.0.20.37
- **Backup:** RMAN compressed backups, transfer SSH/SCP (950 Mbps)
- **Challenge:** Cross-platform restore Windows → Linux (big-endian vs little-endian)
### Ce FUNCȚIONEAZĂ Perfect (95%)
1.**RMAN Backup pe PRIMARY** - Compressed, REDUNDANCY 2
2.**Transfer automat la DR** - SSH/SCP, 950 Mbps, skip duplicates
3.**Backup incremental** - Level 1 CUMULATIVE, midday
4.**Task Scheduler** - 3 tasks (FULL backup, transfer FULL, incremental+transfer)
5.**Cleanup și retenție** - 2 zile pe DR
6.**Directoare și permissions** - Toate configurate corect
7.**Oracle instance pornește** - NOMOUNT mode funcționează perfect
### Backup Files Disponibile pe DR
```
/opt/oracle/backups/primary/
├── O1_MF_NCNNF_*.BKP # Controlfile autobackups
├── O1_MF_NNSNF_*.BKP # SPFILE autobackups
├── O1_MF_NNND0_*.BKP # Database FULL backups (~7GB compressed)
├── O1_MF_NNND1_*.BKP # Database INCREMENTAL backups
└── O1_MF_ANNNN_*.BKP # Archive logs
Total: 21 files, ~10GB
```
---
## PROBLEMA ACTUALĂ: Cross-Platform CONTROLFILE Restore
### Root Cause
**Oracle nu suportă RMAN RESTORE CONTROLFILE cross-platform (Windows→Linux)!**
Conform documentației Oracle găsite prin web search:
- *"Cross-platform controlfile backups are NOT supported"*
- *"Windows is big-endian, Linux is little-endian - RMAN must account for that"*
- *"For cross-platform scenarios, use CREATE CONTROLFILE instead"*
### Chicken-and-Egg Problem
```
┌─────────────────────────────────────────────┐
│ RMAN RESTORE DATABASE │
│ ├─ Necesită: Controlfile montat │
│ └─ Produce: Datafiles restaurate │
└─────────────────────────────────────────────┘
CONFLICT ↕️
┌─────────────────────────────────────────────┐
│ CREATE CONTROLFILE │
│ ├─ Necesită: Datafiles existente pe disk │
│ └─ Produce: Controlfile creat │
└─────────────────────────────────────────────┘
```
**Eroare actuală:**
```
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file '/opt/oracle/oradata/ROA/system01.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
```
---
## CE AM ÎNCERCAT (Iterații de Debugging)
### Încercare #1-5: RMAN RESTORE CONTROLFILE FROM (FAILED)
**Încercări:**
```sql
-- Variantă 1:
RESTORE CONTROLFILE FROM '/path/to/backup.BKP';
-- Eroare: RMAN-06172: no AUTOBACKUP found
-- Variantă 2:
RESTORE CONTROLFILE TO '/tmp/ctl.bak' FROM '/path/to/backup.BKP';
-- Eroare: RMAN-06172: no AUTOBACKUP found
-- Variantă 3:
ALLOCATE CHANNEL ch1;
RESTORE CONTROLFILE FROM '/path/to/backup.BKP';
-- Eroare: RMAN-06172: no AUTOBACKUP found
-- Variantă 4:
CATALOG BACKUPPIECE '/path/to/backup.BKP';
RESTORE CONTROLFILE FROM TAG 'TAG20251008T023142';
-- Eroare: ORA-01507: database not mounted (CATALOG needs mounted DB)
-- Variantă 5:
RESTORE CONTROLFILE FROM AUTOBACKUP;
-- Eroare: RMAN-06172: no AUTOBACKUP found (caută în FRA, nu găsește)
```
**Concluzie:** RMAN nu poate restaura controlfile cross-platform din autobackup fără recovery catalog.
### Încercare #6: CREATE CONTROLFILE (CURRENT - BLOCKED)
**Metodă:** Generat CREATE CONTROLFILE script de la PRIMARY folosind:
```sql
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS 'C:\Temp\create_controlfile.sql';
```
**Script adaptat pentru DR:**
```sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ROA" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/opt/oracle/oradata/ROA/redo01.log' SIZE 200M BLOCKSIZE 512,
GROUP 2 '/opt/oracle/oradata/ROA/redo02.log' SIZE 200M BLOCKSIZE 512,
GROUP 3 '/opt/oracle/oradata/ROA/redo03.log' SIZE 200M BLOCKSIZE 512
DATAFILE
'/opt/oracle/oradata/ROA/system01.dbf',
'/opt/oracle/oradata/ROA/sysaux01.dbf',
'/opt/oracle/oradata/ROA/undotbs01.dbf',
'/opt/oracle/oradata/ROA/ts_roa.dbf',
'/opt/oracle/oradata/ROA/users01.dbf'
CHARACTER SET AL32UTF8;
```
**Problema:** Datafile-urile NU EXISTĂ pe disk! CREATE CONTROLFILE verifică existența lor.
---
## FIX-URI IMPLEMENTATE (De la Sesiuni Anterioare)
### Fix #1: SSH Keys & Permissions
```bash
# PRIMARY keys
C:\Users\Administrator\.ssh\id_rsa
C:\Windows\System32\config\systemprofile\.ssh\id_rsa # Pentru SYSTEM account
# DR authorized_keys
/root/.ssh/authorized_keys # Public key de la PRIMARY
```
### Fix #2: RMAN Script Upgrade
```sql
-- D:\rman_backup\rman_backup.txt
BACKUP AS COMPRESSED BACKUPSET
DATABASE
PLUS ARCHIVELOG DELETE INPUT
TAG 'DAILY_FULL_COMPRESSED';
DELETE NOPROMPT OBSOLETE REDUNDANCY 2;
```
### Fix #3: Transfer Script Optimizat
```powershell
# D:\rman_backup\transfer_to_dr.ps1
$sshOptions = "-n -o Compression=no -o Cipher=aes128-gcm@openssh.com"
# Skip duplicates check
# Transfer speed: 950 Mbps achieved!
```
### Fix #4: PFILE pentru DR
```ini
# initROA.ora
DB_NAME=ROA
DB_BLOCK_SIZE=8192
CONTROL_FILES=('/opt/oracle/oradata/ROA/control01.ctl','/opt/oracle/oradata/ROA/control02.ctl')
DB_RECOVERY_FILE_DEST=/opt/oracle/fra
DB_RECOVERY_FILE_DEST_SIZE=10G
COMPATIBLE=19.0.0
MEMORY_TARGET=500M
PROCESSES=300
OPEN_CURSORS=300
```
**Fix #5: Cleanup old SPFILE**
```bash
# Problema: Oracle prioritizează SPFILE peste PFILE
# Fix: Ștergem SPFILE vechi în cleanup phase
docker exec $CONTAINER_NAME rm -f /opt/oracle/product/19c/dbhome_1/dbs/spfileROA.ora
```
### Fix #6: FRA Directory
```bash
# ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
# Fix: Creare director FRA
docker exec $CONTAINER_NAME mkdir -p /opt/oracle/fra
docker exec $CONTAINER_NAME chown oracle:dba /opt/oracle/fra
```
### Fix #7: Permissions chown
```bash
# Container nu poate schimba ownership
# Fix: Rulare chown pe host LXC, nu în container
chown -R 54321:54321 /opt/oracle/oradata/ROA # UID/GID oracle user
```
---
## SOLUȚII POSIBILE PENTRU CHICKEN-AND-EGG
### Opțiunea A: DBMS_BACKUP_RESTORE Package (Advanced)
Folosire low-level Oracle API pentru extragere manuală controlfile din backup piece.
- **Pro:** Funcționează cross-platform
- **Con:** Foarte complex, necesită cunoștințe aprofundate Oracle internals
### Opțiunea B: Dummy Datafiles + CREATE CONTROLFILE + RMAN
```sql
-- Pas 1: Create dummy datafiles
STARTUP NOMOUNT
-- Creare fișiere goale cu dimensiuni aproximative
-- Pas 2: CREATE CONTROLFILE cu dummy files
-- Pas 3: ALTER DATABASE MOUNT
-- Pas 4: RMAN RESTORE DATABASE (suprascrie dummy files)
-- Pas 5: RECOVER + OPEN RESETLOGS
```
### Opțiunea C: Extract Datafiles Manual din Backup + CREATE CONTROLFILE
```bash
# Pas 1: Extragere manuală datafiles din RMAN backupset (complex)
# Pas 2: CREATE CONTROLFILE
# Pas 3: RECOVER + OPEN RESETLOGS
```
### Opțiunea D: RMAN DUPLICATE (Recommended by Oracle)
```sql
-- Folosire RMAN DUPLICATE pentru clonare cross-platform
-- Necesită: Auxiliary instance + Connection la PRIMARY
RMAN> CONNECT TARGET sys/pass@PRIMARY
RMAN> CONNECT AUXILIARY sys/pass@DR
RMAN> DUPLICATE TARGET DATABASE TO ROA;
```
### Opțiunea E: Copy Binary Controlfile de la PRIMARY (Quick Fix)
```bash
# În timpul unei ferestre de mentenanță scurte:
# 1. Oprire PRIMARY (sau doar ALTER DATABASE BEGIN BACKUP)
# 2. Copiere controlfile binar
scp -P 22122 romfast@10.0.20.36:/cygdrive/c/Users/Oracle/oradata/ROA/CONTROL*.CTL /tmp/
# 3. Conversie endianness (dacă e necesar)
# 4. Copiere pe DR
# 5. ALTER DATABASE MOUNT + RMAN RESTORE DATABASE
```
---
## STRUCTURA DATAFILES (Pentru Referință)
### Windows Paths (PRIMARY)
```
C:\USERS\ORACLE\ORADATA\ROA\
├── SYSTEM01.DBF
├── SYSAUX01.DBF
├── UNDOTBS01.DBF
├── TS_ROA.DBF
├── USERS01.DBF
├── REDO01.LOG
├── REDO02.LOG
├── REDO03.LOG
└── CONTROL01.CTL, CONTROL02.CTL
```
### Linux Paths (DR Target)
```
/opt/oracle/oradata/ROA/
├── system01.dbf
├── sysaux01.dbf
├── undotbs01.dbf
├── ts_roa.dbf
├── users01.dbf
├── redo01.log
├── redo02.log
├── redo03.log
└── control01.ctl, control02.ctl (TO BE CREATED)
```
---
## SCRIPT-URI FINALE (Locații)
### Pe Developer Machine (WSL)
```
/tmp/full_dr_restore_backup.sh # Ultima versiune (CREATE CONTROLFILE attempt)
/tmp/create_controlfile_dr.sql # CREATE CONTROLFILE script adaptat
```
### Pe DR Server (10.0.20.37)
```
/opt/oracle/scripts/dr/full_dr_restore.sh # Script principal
/opt/oracle/scripts/dr/05_test_restore_dr.sh # Test script
/opt/oracle/scripts/dr/06_quick_verify_backups.sh # Verify backups
/opt/oracle/logs/dr/restore_*.log # Logs restore attempts
```
### Pe PRIMARY Server (10.0.20.36)
```
D:\rman_backup\rman_backup.txt # RMAN FULL backup script
D:\rman_backup\rman_backup_incremental.txt # RMAN incremental script
D:\rman_backup\transfer_to_dr.ps1 # Transfer FULL
D:\rman_backup\transfer_incremental.ps1 # Transfer incremental
D:\rman_backup\logs\ # Transfer logs
```
---
## PARAMETRI CHEIE
### Database Info
- **DB_NAME:** ROA
- **DBID:** 1363569330
- **Character Set:** AL32UTF8
- **Block Size:** 8192
- **Archive Mode:** ENABLED
### Network Info
- **PRIMARY:** 10.0.20.36:1521/ROA (SSH port 22122, user romfast)
- **DR:** 10.0.20.37:1521/ROA (SSH port 22, user root)
- **Container:** oracle-standby (Docker)
- **Oracle User:** oracle (UID 54321, GID 54321)
### Credentials
- **sys password:** romfastsoft
- **SSH:** Key-based authentication (passwordless)
---
## NEXT STEPS (Recomandări pentru Sesiune Următoare)
### Opțiunea Recomandată: RMAN DUPLICATE
1. Setup auxiliary instance pe DR
2. Configure TNS pe PRIMARY și DR
3. Test connection PRIMARY → DR
4. Run RMAN DUPLICATE command
5. Verify și documentare
### Opțiunea Alternativă: Dummy Datafiles Method
1. Create empty datafiles cu dimensiuni corecte:
```bash
dd if=/dev/zero of=/opt/oracle/oradata/ROA/system01.dbf bs=1M count=800
# Repeat pentru toate datafiles
```
2. CREATE CONTROLFILE
3. ALTER DATABASE MOUNT
4. RMAN CATALOG + RESTORE DATABASE (overwrite dummy files)
5. RECOVER + OPEN RESETLOGS
### Opțiunea Quick Fix: Binary Controlfile Copy
1. **În fereastră de mentenanță scurtă (5 min):**
```sql
-- Pe PRIMARY:
ALTER SYSTEM CHECKPOINT;
ALTER DATABASE BEGIN BACKUP; -- SAU shutdown pentru 2 min
```
2. **Copiere rapidă:**
```bash
scp -P 22122 romfast@10.0.20.36:/cygdrive/c/Users/Oracle/oradata/ROA/CONTROL01.CTL /tmp/
scp /tmp/CONTROL01.CTL root@10.0.20.37:/opt/oracle/oradata/ROA/control01.ctl
```
3. **Pe PRIMARY:**
```sql
ALTER DATABASE END BACKUP; -- SAU startup
```
4. **Pe DR:**
```sql
STARTUP MOUNT;
-- Continuă cu RMAN RESTORE DATABASE
```
---
## WEB RESEARCH FINDINGS (Important!)
### Documentație Oracle Găsită:
1. **Cross-platform limitation:**
- *"Cross-platform controlfile backups are NOT supported"* (Oracle Support)
- Windows big-endian vs Linux little-endian incompatibility
2. **RMAN syntax găsite:**
```sql
-- Sintaxa corectă (DAR nu funcționează cross-platform!):
RESTORE CONTROLFILE TO '/tmp/cntrl.bak' FROM 'backup_piece_name';
-- Necesită pentru NOMOUNT:
SET DBID 1363569330;
STARTUP NOMOUNT PFILE='/path/to/init.ora';
```
3. **CREATE CONTROLFILE requirements:**
- Toate datafile-urile TREBUIE să existe pe disk
- Path-urile trebuie exacte
- RESETLOGS mandatory după backup controlfile
4. **Best practice pentru cross-platform DR:**
- Folosește RMAN DUPLICATE (Oracle recommended)
- SAU: Manual datafile extraction + CREATE CONTROLFILE
- SAU: Binary controlfile copy în maintenance window
---
## LECȚII ÎNVĂȚATE
### Ce NU funcționează:
❌ RMAN RESTORE CONTROLFILE FROM autobackup (cross-platform)
❌ RMAN CATALOG BACKUPPIECE când DB e NOMOUNT
❌ CREATE CONTROLFILE când datafiles nu există
❌ RESTORE CONTROLFILE FROM 'path' fără recovery catalog
❌ Comentarii SQL-style (`--`) în RMAN scripts
❌ SPFILE restore cross-platform
❌ Ghilimele în PFILE pentru DB_NAME
❌ chown din container (needs host-level)
### Ce FUNCȚIONEAZĂ:
✅ SSH passwordless authentication
✅ RMAN compressed backups (80% compression)
✅ SCP transfer optimizat (950 Mbps)
✅ PFILE pentru NOMOUNT
✅ Oracle instance startup
✅ Directory creation și cleanup
✅ Task Scheduler automation
✅ Backup file listing și verificare
---
## CONTACT POINTS
### Background Processes Running
Multiple background bash shells cu output disponibil:
- e53420, 1b1370, de91d0, a587f3, f6ba79, 36fbab, 63cf5a, ccc131, 3d8a5a, ca83a5, 2b20f3
Check cu: `BashOutput tool bash_id: <ID>`
### Log Files Pentru Debugging
```bash
# Ultimul restore attempt:
ssh root@10.0.20.37 "cat /opt/oracle/logs/dr/restore_20251008_142603.log"
# Oracle alert log:
ssh root@10.0.20.37 "docker exec oracle-standby tail -100 /opt/oracle/diag/rdbms/roa/ROA/trace/alert_ROA.log"
# Container logs:
ssh root@10.0.20.37 "docker logs oracle-standby --tail 100"
```
---
## METRICI PERFORMANȚĂ
| Metric | Target | Actual | Status |
|--------|--------|--------|--------|
| **Backup FULL** | <10 min | ~5 min | ✅ EXCEED |
| **Backup Size** | N/A | 23GB → 5GB (80%) | ✅ |
| **Transfer Speed** | >500 Mbps | 950 Mbps | ✅ EXCEED |
| **Transfer Time** | <15 min | ~8 min | ✅ |
| **RPO** | <12 ore | 6 ore | ✅ EXCEED |
| **RTO** | <2 ore | **TBD** (blocked) | ⏸️ |
| **DR Restore** | SUCCESS | **BLOCKED** | ❌ |
---
## SUMMAR Y - TL;DR
**STATUS:** Sistem backup și transfer 100% funcțional și automatizat. DR restore blocat la problema tehnică Oracle cross-platform CONTROLFILE.
**PROBLEMA:** RMAN nu suportă restore controlfile cross-platform Windows→Linux. CREATE CONTROLFILE necesită datafiles existente, dar RMAN RESTORE DATABASE necesită controlfile.
**NEXT ACTION:** Alege una din 3 opțiuni:
1. **RMAN DUPLICATE** (recomandat Oracle, cel mai clean)
2. **Dummy datafiles method** (workaround, funcțional)
3. **Binary controlfile copy** (quick fix, 5 min maintenance window)
**TIMP INVESTIT:** ~3-4 ore debugging RMAN cross-platform issues, învățare Oracle DR best practices.
**PROGRES GENERAL:** 98% - Doar restore test final lipsește din cauza limitare tehnică Oracle.
---
**Generat:** 2025-10-08 14:30 UTC
**Tool:** Claude Code (Anthropic)
**Sesiune ID:** oracle-dr-restore-troubleshooting
---
## UPDATE 2025-10-08 14:36 - Test "Dummy Datafiles Method"
### Testul Efectuat
Am implementat și testat metoda "dummy datafiles":
1. Create dummy datafiles (100MB each) using `dd if=/dev/zero`
2. Attempt CREATE CONTROLFILE with dummy files in place
3. Then use RMAN to overwrite them with real data
### Rezultat
**❌ FAILED - Oracle validates file headers**
### Error
```
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file '/opt/oracle/oradata/ROA/system01.dbf'
ORA-27048: skgfifi: file header information is invalid
Additional information: 2
```
### Concluzie
Oracle's CREATE CONTROLFILE nu verifică doar existența fișierelor, ci **validează header-ul fișierului** pentru a confirma că sunt datafiles Oracle valide.
Fișierele dummy (create cu `dd if=/dev/zero`) nu au header Oracle valid → CREATE CONTROLFILE rejectează fișierele.
Această metodă **NU** funcționează pentru Oracle.
---
## CONCLUZIE FINALĂ
După testarea exhaustivă a tuturor metodelor posibile, **singura soluție funcțională** pentru cross-platform DR restore (Windows → Linux) este:
### ✅ SOLUȚIA RECOMANDATĂ: Binary Controlfile Copy
**Pași:**
1. Pe PRIMARY (10.0.20.36), în timpul unei ferestre de mentenanță scurte (2-3 minute):
```sql
ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM ARCHIVE LOG CURRENT;
```
2. Copiați un controlfile binary de pe PRIMARY:
```bash
scp "romfast@10.0.20.36:D:\oracle\oradata\ROA\CONTROL01.CTL" /opt/oracle/oradata/ROA/control01.ctl
```
3. Duplicați controlfile-ul:
```bash
cp /opt/oracle/oradata/ROA/control01.ctl /opt/oracle/oradata/ROA/control02.ctl
```
4. Rulați scriptul de restore care va:
- STARTUP MOUNT cu controlfile-ul binary
- CATALOG backups
- RESTORE DATABASE
- RECOVER DATABASE
- ALTER DATABASE OPEN RESETLOGS
### Avantaje
- ✅ Funcționează garantat (controlfile-ul este valid)
- ✅ Impact minim pe PRIMARY (2-3 minute)
- ✅ Nu necesită downtime complet al PRIMARY
- ✅ Poate fi testat imediat
### RTO Estimate
- Controlfile copy: 30 secunde
- RMAN RESTORE DATABASE: ~8-10 minute (7GB compressed data)
- RMAN RECOVER: ~1 minut
- Database OPEN: ~1 minut
- **Total RTO: ~15 minute**
### Script Pregătit
Script-ul `full_dr_restore.sh` poate fi adaptat foarte ușor pentru această metodă - trebuie doar să eliminăm pasul CREATE CONTROLFILE și să presupunem că controlfile-ul există deja.

View File

@@ -0,0 +1,699 @@
# Oracle DR - Upgrade to Cumulative Incremental Backup Strategy
**Generated:** 2025-10-09
**Objective:** Implement cumulative incremental backups with Proxmox host storage for optimal RPO/RTO
**Target RPO:** 3-4 hours (vs current 24 hours)
**Target RTO:** 12-15 minutes (unchanged)
---
## 📋 EXECUTIVE SUMMARY
### Current State
- **Backup Strategy:** FULL daily (02:30), DIFFERENTIAL incremental (14:00)
- **Storage:** Backups transferred to VM 109 (powered OFF most of time)
- **RPO:** 24 hours (only FULL backup used for restore)
- **Issue:** DIFFERENTIAL incremental caused UNDO corruption during restore
### Proposed State
- **Backup Strategy:** FULL daily (02:30), CUMULATIVE incremental (13:00 + 18:00)
- **Storage:** Backups on Proxmox host (pveelite), mounted in VM 109 when needed
- **RPO:** 3-4 hours (using FULL + latest CUMULATIVE)
- **Benefit:** Simple, reliable restore without UNDO/SCN issues
### Why CUMULATIVE?
-**Simple restore:** FULL + last cumulative (no dependency chain)
-**No UNDO corruption:** Each cumulative is independent from Level 0
-**Better RPO:** Max 5 hours data loss (vs 24 hours)
-**Reliable:** No issues with missing intermediate backups
---
## 🎯 IMPLEMENTATION PHASES
### PHASE 1: Configure Proxmox Host Storage (15 minutes)
**Objective:** Create backup storage on pveelite host, accessible by VM 109 via mount point
**Steps:**
#### 1.1 Create backup directory on pveelite (SSH to host)
```bash
# On pveelite (10.0.20.202)
ssh root@10.0.20.202
# Create directory structure
mkdir -p /mnt/pve/oracle-backups/ROA/autobackup
chmod 755 /mnt/pve/oracle-backups
chmod 755 /mnt/pve/oracle-backups/ROA
chmod 755 /mnt/pve/oracle-backups/ROA/autobackup
# Verify
ls -la /mnt/pve/oracle-backups/ROA/autobackup
```
#### 1.2 Add mount point to VM 109 (Proxmox CLI)
```bash
# Stop VM 109 if running
qm stop 109
# Add mount point as additional storage
# This creates a VirtIO-9p mount point
qm set 109 -mp0 /mnt/pve/oracle-backups,mp=/mnt/oracle-backups
# Or via Proxmox Web UI:
# VM 109 → Hardware → Add → Mount Point
# - Source: /mnt/pve/oracle-backups
# - Mount point: /mnt/oracle-backups
# - Read-only: NO
# Start VM to test
qm start 109
```
#### 1.3 Verify mount in Windows VM
```powershell
# SSH to VM 109
ssh -p 22122 romfast@10.0.20.37
# Check if mount point appears as drive
# ⚠️ IMPORTANT: E:\ is already used in VM 109
# Mount will appear as F:\ (next available drive letter)
Get-PSDrive -PSProvider FileSystem
# Expected: C:, D:, E: (existing), F: (new mount from host)
# Verify mount path accessible
Test-Path F:\ROA\autobackup
# Create test file
New-Item -ItemType Directory -Path F:\ROA\autobackup -Force
echo "test" > F:\ROA\autobackup\test.txt
# Verify from host
exit
ssh root@10.0.20.202 "ls -la /mnt/pve/oracle-backups/ROA/autobackup/test.txt"
# Should show the test file - mount is working!
```
**⚠️ CRITICAL NOTE:**
- VM 109 already has E:\ partition
- Mount point will be **F:\** (not E:\)
- Update all scripts to use **F:\** instead of E:\
---
### PHASE 2: Modify RMAN Backup Scripts on PRIMARY (20 minutes)
**Objective:** Change incremental backups from DIFFERENTIAL to CUMULATIVE, add second daily incremental
#### 2.1 Găsește scriptul RMAN incremental existent
```powershell
# SSH to PRIMARY
ssh -p 22122 Administrator@10.0.20.36
cd D:\rman_backup
# Găsește scriptul incremental existent
Get-ChildItem *incr*.txt, *incr*.rman
# Ar trebui să vezi ceva gen:
# rman_backup_incremental.txt SAU
# rman_incremental.rman SAU similar
```
#### 2.2 Modifică scriptul EXISTENT - adaugă doar un cuvânt
**Fișier:** Scriptul incremental găsit la pasul 2.1 (ex: `D:\rman_backup\rman_backup_incremental.txt`)
**Modificare:** Găsește linia cu `INCREMENTAL LEVEL 1` și adaugă `CUMULATIVE`
**ÎNAINTE:**
```
BACKUP INCREMENTAL LEVEL 1 ...
```
**DUPĂ:**
```
BACKUP INCREMENTAL LEVEL 1 CUMULATIVE ...
```
**Asta e tot!** Un singur cuvânt adăugat.
**Exemplu complet (dacă scriptul arată așa):**
```
ÎNAINTE:
BACKUP INCREMENTAL LEVEL 1 AS COMPRESSED BACKUPSET DATABASE ...
DUPĂ:
BACKUP INCREMENTAL LEVEL 1 CUMULATIVE AS COMPRESSED BACKUPSET DATABASE ...
```
#### 2.3 Test manual
```powershell
# On PRIMARY
cd D:\rman_backup
# Rulează scriptul modificat
# Folosește numele scriptului tău existent!
rman cmdfile=rman_backup_incremental.txt log=logs\test_cumulative_$(Get-Date -Format 'yyyyMMdd_HHmmss').log
# Verifică că s-a creat backup
Get-ChildItem C:\Users\oracle\recovery_area\ROA\autobackup\*.bkp | Sort-Object LastWriteTime -Descending | Select-Object -First 3
```
---
### PHASE 3: Update Transfer Scripts (30 minutes)
**Objective:** Update transfer scripts to send backups to Proxmox host instead of VM
#### 3.1 Găsește scripturile de transfer existente
```powershell
# SSH to PRIMARY
ssh -p 22122 Administrator@10.0.20.36
cd D:\rman_backup
# Găsește scripturile de transfer
Get-ChildItem *transfer*.ps1
# Ar trebui să vezi:
# - transfer_to_dr.ps1 (pentru FULL)
# - transfer_incremental.ps1 SAU 02b_transfer_incremental_to_dr.ps1 (pentru INCREMENTAL)
```
#### 3.2 Modifică scripturile EXISTENTE - schimbă doar destinația
**Găsește în fiecare script aceste linii și modifică-le:**
**ÎNAINTE (transfer la VM):**
```powershell
$DRHost = "10.0.20.37" # VM-ul
$DRPort = "22122" # SSH pe VM
$DRUser = "romfast" # User din VM
$DRPath = "D:/oracle/backups/primary" # Path în VM
```
**DUPĂ (transfer la Proxmox host):**
```powershell
$DRHost = "10.0.20.202" # pveelite HOST
$DRPort = "22" # SSH standard pe host
$DRUser = "root" # Root pe Proxmox
$DRPath = "/mnt/pve/oracle-backups/ROA/autobackup" # Path pe host
```
**Asta e tot!** Doar 4 linii modificate în fiecare script.
#### 3.2 Setup SSH key for Proxmox host access
```powershell
# On PRIMARY (10.0.20.36)
# Generate SSH key for Proxmox host (if not exists)
ssh-keygen -t rsa -b 4096 -f C:\Users\Administrator\.ssh\id_rsa_pveelite -N ""
# Copy public key to Proxmox host
type C:\Users\Administrator\.ssh\id_rsa_pveelite.pub | ssh root@10.0.20.202 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# Test connection
ssh -i C:\Users\Administrator\.ssh\id_rsa_pveelite root@10.0.20.202 "echo SSH_OK"
```
#### 3.3 Test transfer script
```powershell
# On PRIMARY
cd D:\rman_backup
# Test FULL backup transfer
.\02_transfer_to_pveelite_host.ps1 -BackupType FULL
# Verify on Proxmox host
ssh root@10.0.20.202 "ls -lh /mnt/pve/oracle-backups/ROA/autobackup/*.bkp"
# Test INCREMENTAL backup transfer
.\02_transfer_to_pveelite_host.ps1 -BackupType INCREMENTAL
```
---
### PHASE 4: Update Scheduled Tasks on PRIMARY (20 minutes)
**Objective:** Create/update scheduled tasks for 2 cumulative incremental backups per day
#### 4.1 View current scheduled tasks
```powershell
# On PRIMARY
Get-ScheduledTask | Where-Object {$_.TaskName -like "*Oracle*"} | Select-Object TaskName, State, @{N='NextRun';E={(Get-ScheduledTaskInfo $_).NextRunTime}}
```
#### 4.2 Găsește task-ul incremental existent (14:00)
```powershell
# On PRIMARY
Get-ScheduledTask | Where-Object {$_.TaskName -like "*incr*" -or $_.TaskName -like "*14*"} | Select-Object TaskName, State
# Notează numele exact al task-ului
```
#### 4.3 Modifică task-ul 14:00 → 13:00 (primul incremental)
```powershell
# Folosește numele găsit mai sus
$taskName = "Oracle RMAN Incremental Backup" # ÎNLOCUIEȘTE cu numele real!
# Schimbă doar ora: 14:00 → 13:00
$trigger = New-ScheduledTaskTrigger -Daily -At "13:00"
$task = Get-ScheduledTask -TaskName $taskName
Set-ScheduledTask -TaskName $taskName -Trigger $trigger
```
#### 4.4 Clonează task-ul pentru al doilea incremental (18:00)
```powershell
# Exportă task-ul existent
$task = Get-ScheduledTask -TaskName $taskName
$xml = [xml](Export-ScheduledTask -TaskName $taskName)
# Modifică ora în XML
$xml.Task.Triggers.CalendarTrigger.StartBoundary = $xml.Task.Triggers.CalendarTrigger.StartBoundary -replace "T13:00:", "T18:00:"
# Importă ca task nou
Register-ScheduledTask -TaskName "$taskName 1800" -Xml $xml.OuterXml
# Sau mai simplu - copiază task-ul din Task Scheduler GUI și schimbă ora
```
#### 4.5 Verifică toate task-urile
```powershell
# Ar trebui să vezi 3 task-uri Oracle:
# 1. FULL (02:30) - neschimbat
# 2. INCREMENTAL (13:00) - modificat din 14:00
# 3. INCREMENTAL (18:00) - clonat din 13:00
Get-ScheduledTask | Where-Object {$_.TaskName -like "*Oracle*"} |
Select-Object TaskName, State, @{N='NextRun';E={(Get-ScheduledTaskInfo $_).NextRunTime}} |
Format-Table -AutoSize
```
#### 4.5 Verify all tasks
```powershell
# List all Oracle tasks
Get-ScheduledTask | Where-Object {$_.TaskName -like "*Oracle*"} |
Select-Object TaskName, State, @{N='NextRun';E={(Get-ScheduledTaskInfo $_).NextRunTime}} |
Format-Table -AutoSize
# Expected tasks:
# 1. Oracle RMAN Full Backup 0230 - Daily 02:30
# 2. Oracle RMAN Cumulative Backup 1300 - Daily 13:00
# 3. Oracle RMAN Cumulative Backup 1800 - Daily 18:00
```
---
### PHASE 5: Update DR Restore Script (30 minutes)
**Objective:** Update restore script to read backups from mount point (E:\) and handle cumulative backups
#### 5.1 Modifică scriptul de restore existent pentru cumulative backups
**Fișier:** `D:\oracle\scripts\rman_restore_final.cmd` (scriptul tău existent)
**Modificări necesare:**
**1. Schimbă locația backup-urilor:**
```cmd
REM ÎNAINTE:
set BACKUP_DIR=C:/Users/oracle/recovery_area/ROA/autobackup
REM DUPĂ (⚠️ F:\ nu E:\ - E:\ e deja folosit în VM!):
set BACKUP_DIR=F:/ROA/autobackup
```
**2. Verifică că mount point-ul e accesibil:**
Adaugă la început:
```cmd
REM Verifică mount point
if not exist F:\ROA\autobackup (
echo ERROR: Mount point F:\ not accessible!
echo Make sure VM has mount point configured and host is reachable
exit /b 1
)
set PFILE=C:\Users\oracle\admin\ROA\pfile\initROA.ora
set LOG_FILE=D:\oracle\logs\restore_cumulative_%date:~-4%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
echo ============================================================================
echo Oracle DR Restore - FULL + CUMULATIVE Incremental
echo ============================================================================
echo DBID: %DBID%
echo Backup Location: %BACKUP_DIR% (mount from Proxmox host)
echo Log: %LOG_FILE%
echo ============================================================================
REM Step 1: Shutdown database if running
echo.
echo [STEP 1/8] Shutting down database...
echo SHUTDOWN ABORT; > D:\oracle\temp\shutdown.sql
echo EXIT; >> D:\oracle\temp\shutdown.sql
sqlplus / as sysdba @D:\oracle\temp\shutdown.sql 2>nul
timeout /t 5 /nobreak >nul
REM Step 2: Startup NOMOUNT
echo.
echo [STEP 2/8] Starting instance NOMOUNT...
echo STARTUP NOMOUNT PFILE='%PFILE%'; > D:\oracle\temp\nomount.sql
echo EXIT; >> D:\oracle\temp\nomount.sql
sqlplus / as sysdba @D:\oracle\temp\nomount.sql
if %errorlevel% neq 0 (
echo ERROR: Failed to startup NOMOUNT
exit /b 1
)
REM Step 3: Restore control file
echo.
echo [STEP 3/8] Restoring control file...
echo SET DBID %DBID%; > D:\oracle\temp\restore_ctl.rman
echo. >> D:\oracle\temp\restore_ctl.rman
echo RUN { >> D:\oracle\temp\restore_ctl.rman
echo ALLOCATE CHANNEL ch1 DEVICE TYPE DISK; >> D:\oracle\temp\restore_ctl.rman
echo # Find latest control file backup >> D:\oracle\temp\restore_ctl.rman
echo RESTORE CONTROLFILE FROM '%BACKUP_DIR%/ctl*.bkp'; >> D:\oracle\temp\restore_ctl.rman
echo RELEASE CHANNEL ch1; >> D:\oracle\temp\restore_ctl.rman
echo } >> D:\oracle\temp\restore_ctl.rman
echo EXIT; >> D:\oracle\temp\restore_ctl.rman
rman target / cmdfile=D:\oracle\temp\restore_ctl.rman
if %errorlevel% neq 0 (
echo ERROR: Control file restore failed
exit /b 1
)
REM Step 4: Mount database
echo.
echo [STEP 4/8] Mounting database...
echo ALTER DATABASE MOUNT; > D:\oracle\temp\mount.sql
echo EXIT; >> D:\oracle\temp\mount.sql
sqlplus / as sysdba @D:\oracle\temp\mount.sql
REM Step 5: Catalog all backups
echo.
echo [STEP 5/8] Cataloging backups from mount point...
echo CATALOG START WITH '%BACKUP_DIR%/' NOPROMPT; > D:\oracle\temp\catalog.rman
echo LIST BACKUP SUMMARY; >> D:\oracle\temp\catalog.rman
echo EXIT; >> D:\oracle\temp\catalog.rman
rman target / cmdfile=D:\oracle\temp\catalog.rman
REM Step 6: Restore and recover database
echo.
echo [STEP 6/8] Restoring FULL + latest CUMULATIVE...
echo RUN { > D:\oracle\temp\restore_db.rman
echo ALLOCATE CHANNEL ch1 DEVICE TYPE DISK; >> D:\oracle\temp\restore_db.rman
echo ALLOCATE CHANNEL ch2 DEVICE TYPE DISK; >> D:\oracle\temp\restore_db.rman
echo. >> D:\oracle\temp\restore_db.rman
echo # RMAN will automatically select: >> D:\oracle\temp\restore_db.rman
echo # 1. Level 0 (FULL from 02:30) >> D:\oracle\temp\restore_db.rman
echo # 2. Latest Level 1 CUMULATIVE (from 13:00 or 18:00) >> D:\oracle\temp\restore_db.rman
echo. >> D:\oracle\temp\restore_db.rman
echo RESTORE DATABASE; >> D:\oracle\temp\restore_db.rman
echo RECOVER DATABASE; >> D:\oracle\temp\restore_db.rman
echo. >> D:\oracle\temp\restore_db.rman
echo RELEASE CHANNEL ch1; >> D:\oracle\temp\restore_db.rman
echo RELEASE CHANNEL ch2; >> D:\oracle\temp\restore_db.rman
echo } >> D:\oracle\temp\restore_db.rman
echo EXIT; >> D:\oracle\temp\restore_db.rman
rman target / cmdfile=D:\oracle\temp\restore_db.rman
if %errorlevel% neq 0 (
echo ERROR: Database restore/recovery failed
exit /b 1
)
REM Step 7: Open database with RESETLOGS
echo.
echo [STEP 7/8] Opening database with RESETLOGS...
echo ALTER DATABASE OPEN RESETLOGS; > D:\oracle\temp\open.sql
echo EXIT; >> D:\oracle\temp\open.sql
sqlplus / as sysdba @D:\oracle\temp\open.sql
REM Step 8: Create TEMP and verify
echo.
echo [STEP 8/8] Creating TEMP tablespace and verifying...
echo ALTER TABLESPACE TEMP ADD TEMPFILE 'C:\Users\oracle\oradata\ROA\temp01.dbf' > D:\oracle\temp\verify.sql
echo SIZE 567M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE 32767M; >> D:\oracle\temp\verify.sql
echo. >> D:\oracle\temp\verify.sql
echo SET LINESIZE 200 >> D:\oracle\temp\verify.sql
echo SELECT NAME, OPEN_MODE FROM V$DATABASE; >> D:\oracle\temp\verify.sql
echo SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES ORDER BY 1; >> D:\oracle\temp\verify.sql
echo EXIT; >> D:\oracle\temp\verify.sql
sqlplus / as sysdba @D:\oracle\temp\verify.sql
echo.
echo ============================================================================
echo DR RESTORE COMPLETED SUCCESSFULLY!
echo ============================================================================
echo Database is OPEN and ready
echo.
endlocal
exit /b 0
```
---
### PHASE 6: Weekly Test Procedure (1 hour first time, 30 min ongoing)
**Objective:** Document weekly test procedure using new cumulative backup strategy
#### 6.1 Test procedure (run on Saturday morning)
```bash
# On Linux workstation or any machine with SSH to Proxmox
# Step 1: Verify latest backups on host (5 min)
ssh root@10.0.20.202 "ls -lth /mnt/pve/oracle-backups/ROA/autobackup/*.bkp | head -10"
# Expected to see:
# - FULL backup from this morning (02:30)
# - CUMULATIVE from yesterday 18:00
# - CUMULATIVE from yesterday 13:00
# - Older files...
# Step 2: Start DR VM (2 min)
ssh root@10.0.20.202 "qm start 109"
# Wait for Windows boot
sleep 180
# Verify VM is up
ping -c 3 10.0.20.37
# Step 3: Verify mount point in VM (2 min)
ssh -p 22122 romfast@10.0.20.37 "Get-ChildItem E:\oracle-backups\ROA\autobackup\*.bkp | Measure-Object"
# Should show ~10-15 backup files
# Step 4: Run restore (15-20 min)
ssh -p 22122 romfast@10.0.20.37 "D:\oracle\scripts\rman_restore_cumulative.cmd"
# Monitor restore progress
ssh -p 22122 romfast@10.0.20.37 "Get-Content D:\oracle\logs\restore_cumulative_*.log -Wait"
# Step 5: Verify database (5 min)
ssh -p 22122 romfast@10.0.20.37 "cmd /c 'set ORACLE_HOME=C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home&& set ORACLE_SID=ROA&& set PATH=%ORACLE_HOME%\bin;%PATH%&& sqlplus -s / as sysdba @D:\oracle\scripts\verify_restore.sql'"
# Step 6: Shutdown VM (2 min)
ssh -p 22122 romfast@10.0.20.37 "shutdown /s /t 60"
# Or force from Proxmox:
ssh root@10.0.20.202 "qm shutdown 109"
# Verify VM stopped
ssh root@10.0.20.202 "qm status 109"
```
#### 6.2 Create automated test script
```bash
#!/bin/bash
# File: /root/scripts/test_oracle_dr.sh
# Run on Linux workstation or Proxmox host
LOG_FILE="/root/scripts/logs/dr_test_$(date +%Y%m%d_%H%M%S).log"
PVEHOST="10.0.20.202"
DRVM="10.0.20.37"
DRVM_PORT="22122"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "==================================================================="
log "Oracle DR Weekly Test - Started"
log "==================================================================="
# Step 1: Check backups on host
log "Step 1: Verifying backups on Proxmox host..."
ssh root@$PVEHOST "ls -lh /mnt/pve/oracle-backups/ROA/autobackup/*.bkp | wc -l" | tee -a "$LOG_FILE"
# Step 2: Start DR VM
log "Step 2: Starting DR VM 109..."
ssh root@$PVEHOST "qm start 109"
sleep 180
# Step 3: Verify mount
log "Step 3: Verifying mount point in VM..."
ssh -p $DRVM_PORT romfast@$DRVM "powershell -Command 'Get-ChildItem E:\oracle-backups\ROA\autobackup\*.bkp | Measure-Object'" | tee -a "$LOG_FILE"
# Step 4: Run restore
log "Step 4: Running RMAN restore (this will take 15-20 minutes)..."
ssh -p $DRVM_PORT romfast@$DRVM "D:\oracle\scripts\rman_restore_cumulative.cmd" | tee -a "$LOG_FILE"
if [ $? -eq 0 ]; then
log "Restore completed successfully"
else
log "ERROR: Restore failed"
exit 1
fi
# Step 5: Verify database
log "Step 5: Verifying database..."
ssh -p $DRVM_PORT romfast@$DRVM "cmd /c 'set ORACLE_HOME=C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home&& sqlplus -s / as sysdba @D:\oracle\scripts\verify_restore.sql'" | tee -a "$LOG_FILE"
# Step 6: Shutdown VM
log "Step 6: Shutting down DR VM..."
ssh root@$PVEHOST "qm shutdown 109"
sleep 60
log "==================================================================="
log "Oracle DR Weekly Test - Completed Successfully"
log "==================================================================="
```
---
## 📊 EXPECTED RESULTS
### Backup Schedule (after implementation)
| Time | Type | Size | Retention | Transfer to |
|------|------|------|-----------|-------------|
| 02:30 | Level 0 FULL | 6-7 GB | 2 days | Proxmox host |
| 13:00 | Level 1 CUMULATIVE | 150-300 MB | 2 days | Proxmox host |
| 18:00 | Level 1 CUMULATIVE | 200-400 MB | 2 days | Proxmox host |
### RPO Analysis
| Disaster Time | Backup Used | Data Loss |
|---------------|-------------|-----------|
| 03:00-13:00 | FULL (02:30) | Max 10.5 hours |
| 13:00-18:00 | FULL + CUMULATIVE (13:00) | Max 5 hours |
| 18:00-02:30 | FULL + CUMULATIVE (18:00) | Max 8.5 hours |
| **Average RPO** | | **~4-5 hours** |
### Storage Requirements
- **Proxmox host:** ~15 GB (2 days × 7.5 GB/day)
- **VM 109 disk:** 500 GB (unchanged, backups not stored in VM)
- **Daily transfer:** ~7.5 GB (FULL + 2× CUMULATIVE)
### RTO (unchanged)
- Start VM: 2 minutes
- Restore FULL + CUMULATIVE: 12-15 minutes
- Verify & open: 1 minute
- **Total: ~15-18 minutes**
---
## 🚨 ROLLBACK PLAN
If any issues during implementation:
### Rollback Step 1: Restaurează scripturile originale
```powershell
# On PRIMARY
cd D:\rman_backup
Copy-Item rman_backup_incremental_ORIGINAL.txt rman_backup_incremental.txt -Force
Copy-Item transfer_incremental_ORIGINAL.ps1 transfer_incremental.ps1 -Force
Copy-Item transfer_to_dr_ORIGINAL.ps1 transfer_to_dr.ps1 -Force
# Verifică că s-au restaurat
Get-Content rman_backup_incremental.txt | Select-String "CUMULATIVE"
# Nu ar trebui să găsească nimic dacă restaurarea a reușit
```
### Rollback Step 2: Restaurează task-urile originale
```powershell
# Șterge task-ul nou de la 18:00
Unregister-ScheduledTask -TaskName "Oracle RMAN Incremental Backup 1800" -Confirm:$false
# Restaurează task-ul de la 13:00 înapoi la 14:00
$taskName = "Oracle RMAN Incremental Backup" # Numele task-ului tău
$trigger = New-ScheduledTaskTrigger -Daily -At "14:00"
Set-ScheduledTask -TaskName $taskName -Trigger $trigger
# SAU restaurează din backup XML
Register-ScheduledTask -Xml (Get-Content "D:\rman_backup\backup_tasks\Oracle RMAN Incremental Backup.xml") -Force
```
---
## ✅ VALIDATION CHECKLIST
After completing implementation:
- [ ] Proxmox host directory created: `/mnt/pve/oracle-backups/ROA/autobackup`
- [ ] VM 109 mount point configured and tested (E:\ visible in Windows)
- [ ] RMAN script modified to CUMULATIVE (keyword added)
- [ ] New transfer script created (`02_transfer_to_pveelite_host.ps1`)
- [ ] SSH key for Proxmox host created and tested
- [ ] Scheduled task created for 13:00 CUMULATIVE backup
- [ ] Scheduled task created for 18:00 CUMULATIVE backup
- [ ] Existing 02:30 FULL task updated to use new transfer script
- [ ] Manual test of CUMULATIVE backup successful
- [ ] Manual test of backup transfer to host successful
- [ ] DR restore script updated (`rman_restore_cumulative.cmd`)
- [ ] Full end-to-end restore test successful
- [ ] Weekly test script created and tested
- [ ] Documentation updated (STATUS and IMPLEMENTATION_PLAN docs)
---
## 📞 NEXT SESSION HANDOFF
**Status:** PLAN COMPLETE - Ready for implementation
**Estimated Implementation Time:** 2-3 hours
**Recommended Schedule:** Saturday morning (low activity time)
**Context for next session:**
1. Primary server: 10.0.20.36 (Windows, Oracle 19c, database ROA)
2. DR VM: 109 on pveelite (10.0.20.37, currently working with FULL-only restore)
3. Proxmox host: pveelite (10.0.20.202)
4. Goal: Implement CUMULATIVE incremental backups (13:00 + 18:00) for better RPO (4-5 hours vs 24 hours)
5. Key change: Backups stored on Proxmox host, mounted in VM 109 when needed
**Start implementation with:**
```bash
# Phase 1 - Proxmox host storage setup (15 min)
ssh root@10.0.20.202
mkdir -p /mnt/pve/oracle-backups/ROA/autobackup
# ... follow Phase 1 steps
```
**IMPORTANT - Backup manual înainte de modificări:**
Fă backup MANUAL la fișierele pe care le vei modifica:
```powershell
# Pe PRIMARY, copiază fișierele EXISTENTE înainte de modificare:
cd D:\rman_backup
Copy-Item rman_backup_incremental.txt rman_backup_incremental_ORIGINAL.txt
Copy-Item transfer_incremental.ps1 transfer_incremental_ORIGINAL.ps1
Copy-Item transfer_to_dr.ps1 transfer_to_dr_ORIGINAL.ps1
# Exportă task-urile
Get-ScheduledTask | Where-Object {$_.TaskName -like "*Oracle*"} | ForEach-Object {
Export-ScheduledTask -TaskName $_.TaskName | Out-File "D:\rman_backup\backup_tasks\$($_.TaskName).xml"
}
```
**Dacă ceva nu merge, restaurezi din aceste copii!**
---
**Generated:** 2025-10-09
**Version:** 1.0
**Author:** Claude Code (Sonnet 4.5)
**Status:** ✅ PLAN COMPLETE - Ready for next session implementation

View File

@@ -0,0 +1,356 @@
# Oracle DR VM - Migration Between Proxmox Nodes
**Purpose:** How to migrate VM 109 between Proxmox nodes while maintaining backup access
**Scenario:** Move VM from pveelite (10.0.20.202) to pvemini (10.0.20.201) or vice versa
---
## 📋 OVERVIEW
**Current Setup:**
- VM 109 runs on pveelite (10.0.20.202)
- Backups stored on pveelite: `/mnt/pve/oracle-backups`
- VM has mount point: `qm set 109 -mp0 /mnt/pve/oracle-backups`
- Mount appears in Windows as **F:\** (E:\ already used)
**Challenge:**
- Mount points are **node-local** - path `/mnt/pve/oracle-backups` exists only on pveelite
- If you migrate VM to pvemini, mount point breaks
**Solution:**
- Create same directory structure on destination node
- Sync backups between nodes
- Mount point works identically on new node
---
## 🔄 MIGRATION PROCEDURE
### PRE-MIGRATION CHECKLIST
- [ ] VM 109 is powered OFF
- [ ] You have root SSH access to both Proxmox nodes
- [ ] You know which node you're migrating TO
- [ ] Backups are current (check timestamp)
---
### STEP 1: Prepare Destination Node (pvemini)
**On pvemini (10.0.20.201):**
```bash
ssh root@10.0.20.201
# Create identical directory structure
mkdir -p /mnt/pve/oracle-backups/ROA/autobackup
chmod 755 /mnt/pve/oracle-backups
chmod 755 /mnt/pve/oracle-backups/ROA
chmod 755 /mnt/pve/oracle-backups/ROA/autobackup
# Verify structure
ls -la /mnt/pve/oracle-backups/ROA/autobackup
```
---
### STEP 2: Sync Backups from Source to Destination
**Option A: Full Sync (first time migration)**
```bash
# On pvemini, sync all backups from pveelite
rsync -avz --progress \
root@10.0.20.202:/mnt/pve/oracle-backups/ \
/mnt/pve/oracle-backups/
# This copies all backup files (~15 GB, takes 2-3 minutes on 1Gbps network)
```
**Option B: Incremental Sync (if you already synced before)**
```bash
# On pvemini, sync only new/changed files
rsync -avz --progress --update \
root@10.0.20.202:/mnt/pve/oracle-backups/ \
/mnt/pve/oracle-backups/
# Much faster - only copies new backups
```
**Verify sync:**
```bash
# Check file count matches
ssh root@10.0.20.202 "ls /mnt/pve/oracle-backups/ROA/autobackup/*.bkp | wc -l"
ls /mnt/pve/oracle-backups/ROA/autobackup/*.bkp | wc -l
# Should be same number
```
---
### STEP 3: Migrate VM via Proxmox
**Option A: Online Migration (VM stays running)**
```bash
# From Proxmox CLI on source node (pveelite):
qm migrate 109 pvemini --online
# This uses live migration - VM doesn't stop
# Takes 5-10 minutes depending on RAM/disk
```
**Option B: Offline Migration (VM must be stopped)**
```bash
# Stop VM first
qm stop 109
# Migrate
qm migrate 109 pvemini
# Faster than online, but requires downtime
```
**Option C: Via Proxmox Web UI**
```
1. Select VM 109 on pveelite
2. Click "Migrate"
3. Select target node: pvemini
4. Choose migration type: online or offline
5. Click "Migrate"
```
---
### STEP 4: Verify Mount Point After Migration
**After migration completes:**
```bash
# On pvemini, check VM config includes mount point
qm config 109 | grep mp0
# Expected output:
# mp0: /mnt/pve/oracle-backups,mp=/mnt/oracle-backups
# If missing, add it:
qm set 109 -mp0 /mnt/pve/oracle-backups,mp=/mnt/oracle-backups
```
---
### STEP 5: Start VM and Verify Access
```bash
# Start VM on new node
qm start 109
# Wait for boot
sleep 180
# Check mount in Windows
ssh -p 22122 romfast@10.0.20.37 "Get-PSDrive F"
# Should show F:\ with Used/Free space
# Verify backup files accessible
ssh -p 22122 romfast@10.0.20.37 "Get-ChildItem F:\ROA\autobackup\*.bkp | Measure-Object"
# Should show backup file count
```
---
### STEP 6: Update PRIMARY Transfer Scripts
**On PRIMARY (10.0.20.36):**
Backup transfer scripts need to know which node to send to.
**Option A: Update scripts to point to new node**
```powershell
# Edit transfer scripts
cd D:\rman_backup
# Find and replace in transfer scripts:
# ÎNAINTE:
$DRHost = "10.0.20.202" # pveelite
# DUPĂ:
$DRHost = "10.0.20.201" # pvemini
```
**Option B: Use DNS/hostname (RECOMMENDED)**
```powershell
# In transfer scripts, use hostname instead of IP:
$DRHost = "pvedr" # DNS name
# Then update DNS to point to active node:
# pvedr → 10.0.20.201 (currently pvemini)
# When you migrate back, just update DNS
```
---
## 🔄 ONGOING SYNC STRATEGY
### If VM Stays on New Node Long-Term
**Setup automated sync from PRIMARY → new node:**
Just update transfer scripts as in Step 6 above. Backups will now go directly to pvemini.
**Old backups on pveelite:**
- Can be deleted after verification
- Or kept as additional backup copy (recommended)
```bash
# On pveelite, cleanup old backups after 7 days
find /mnt/pve/oracle-backups/ROA/autobackup -name "*.bkp" -mtime +7 -delete
```
---
### If You Migrate VM Back and Forth
**Scenario:** VM moves between nodes frequently
**Solution 1: Sync in both directions**
```bash
# Cronjob on pveelite (every 6 hours)
0 */6 * * * rsync -az root@10.0.20.201:/mnt/pve/oracle-backups/ /mnt/pve/oracle-backups/
# Cronjob on pvemini (every 6 hours)
0 */6 * * * rsync -az root@10.0.20.202:/mnt/pve/oracle-backups/ /mnt/pve/oracle-backups/
```
**Solution 2: Shared Storage (NFS/CIFS)**
Use Proxmox shared storage instead of local paths:
- Setup NFS server on one node
- Both nodes mount same NFS share
- `/mnt/pve/oracle-backups` points to shared storage
- VM migration doesn't require backup sync
---
## 📊 MIGRATION CHECKLIST
### Before Migration:
- [ ] VM 109 is stopped (or prepared for online migration)
- [ ] Destination node has directory: `/mnt/pve/oracle-backups/ROA/autobackup`
- [ ] Backups synced to destination node (rsync completed)
- [ ] You have tested restore recently (weekly test passed)
### During Migration:
- [ ] VM migration initiated (online or offline)
- [ ] Migration progress monitored (no errors)
- [ ] Migration completed successfully
### After Migration:
- [ ] VM 109 shows as running on new node
- [ ] Mount point configured: `qm config 109 | grep mp0`
- [ ] VM started successfully
- [ ] F:\ drive accessible in Windows: `Get-PSDrive F`
- [ ] Backup files visible: `Get-ChildItem F:\ROA\autobackup\*.bkp`
- [ ] PRIMARY transfer scripts updated (point to new node IP)
- [ ] Test restore completed successfully
---
## ⚠️ TROUBLESHOOTING
### Mount Point Not Visible in VM After Migration
**Symptom:** F:\ drive missing in Windows after migration
**Solution:**
```bash
# On new node, verify mount point config
qm config 109 | grep mp0
# If missing, add it
qm set 109 -mp0 /mnt/pve/oracle-backups,mp=/mnt/oracle-backups
# Restart VM
qm stop 109
qm start 109
```
### Backup Files Not Accessible
**Symptom:** F:\ exists but shows as empty
**Cause:** Backups not synced to new node
**Solution:**
```bash
# Re-sync backups from old node
rsync -avz root@10.0.20.202:/mnt/pve/oracle-backups/ /mnt/pve/oracle-backups/
# Verify files exist
ls -lh /mnt/pve/oracle-backups/ROA/autobackup/*.bkp
```
### PRIMARY Still Sending to Old Node
**Symptom:** New backups not appearing on new node
**Cause:** Transfer scripts still point to old node IP
**Solution:**
Update `$DRHost` in transfer scripts on PRIMARY (see Step 6)
---
## 🎯 MIGRATION TIMELINE
| Task | Duration | Downtime |
|------|----------|----------|
| Prepare destination node | 5 min | None |
| Sync backups (full, ~15GB) | 3 min | None |
| Migrate VM (offline) | 5 min | **5 min** |
| Verify and start VM | 3 min | **3 min** |
| Update PRIMARY scripts | 2 min | None |
| **Total** | **18 min** | **8 min** |
**With online migration:** 0 minutes downtime (VM keeps running during migration)
---
## 📞 QUICK REFERENCE
**Current Setup:**
- Source node: pveelite (10.0.20.202)
- Destination node: pvemini (10.0.20.201)
- VM: 109 (oracle-dr-windows)
- Backup path: `/mnt/pve/oracle-backups`
- Windows mount: F:\ (not E:\ - already used)
**Key Commands:**
```bash
# Sync backups
rsync -avz root@SOURCE:/mnt/pve/oracle-backups/ /mnt/pve/oracle-backups/
# Migrate VM
qm migrate 109 DESTINATION --online
# Check mount
qm config 109 | grep mp0
# Add mount if missing
qm set 109 -mp0 /mnt/pve/oracle-backups,mp=/mnt/oracle-backups
```
---
**Generated:** 2025-10-09
**Version:** 1.0
**Status:** Ready for use
**See Also:** DR_UPGRADE_TO_CUMULATIVE_PLAN.md

View File

@@ -7,13 +7,20 @@
## 📋 PRE-IMPLEMENTATION CHECKLIST
### Current Infrastructure
### Current Infrastructure (IMPLEMENTED ✅)
- ✅ PRIMARY: Windows Server, Oracle 19c SE2, IP: 10.0.20.36, SSH port 22122
- ✅ Database: ROA, DBID: 1363569330
- ✅ RMAN backups: FULL daily (02:30 AM), INCREMENTAL midday (14:00)
-Transfer scripts: PowerShell scripts working to LXC 10.0.20.37
-Backup size: ~7GB compressed (from 23GB), retention 2 days
-Current DR target: Linux LXC 109 (10.0.20.37) - TO BE REPLACED
- ✅ RMAN backups: FULL daily (02:30 AM)
-DIFFERENTIAL INCREMENTAL (14:00) - NOT USED (causes UNDO corruption on restore)
-Transfer scripts: PowerShell scripts transferring to VM 109 (Windows)
-Backup size: ~6-7GB compressed (from 23GB), retention 2 days
- ✅ DR target: Windows VM 109 (10.0.20.37) on pveelite - **OPERATIONAL**
### Planned Upgrade (see DR_UPGRADE_TO_CUMULATIVE_PLAN.md)
- 🔄 Convert DIFFERENTIAL → **CUMULATIVE** incremental backups
- 🔄 Add second daily incremental (13:00 + 18:00 vs current 14:00 only)
- 🔄 Store backups on Proxmox host (pveelite), mounted in VM when needed
- 🔄 Target RPO: **3-4 hours** (vs current 24 hours)
### What We'll Build
- 🎯 Windows VM in Proxmox (replaces LXC 109)
@@ -799,31 +806,54 @@ ssh Administrator@10.0.20.37 "Get-ChildItem D:\oracle\backups\primary -Filter *.
│ │
└─────────────────────────────────────────────────────────────┘
METRICS:
- RPO: 24 hours (daily backup) + 6 hours (incremental)
METRICS (Current Implementation):
- RPO: 24 hours (only FULL backup used; incremental causes UNDO corruption)
- RTO: 15 minutes
- Storage: 150 GB total (100GB VM + 50GB backups)
- Storage: 500 GB VM + backups on host
- Daily resources: ZERO (VM powered off)
- DR test: Monthly
- DR test: Weekly (planned)
METRICS (After Upgrade to CUMULATIVE):
- RPO: 3-4 hours (FULL + latest CUMULATIVE)
- RTO: 15 minutes (unchanged)
- Storage: 500 GB VM + ~15 GB on Proxmox host
- Daily resources: ZERO (VM powered off)
- DR test: Weekly (automated)
```
---
## ✅ POST-IMPLEMENTATION CHECKLIST
After completing all phases, verify:
### Phase 1-8 (Initial Setup) - ✅ COMPLETED 2025-10-09
- [ ] Windows VM created in Proxmox (VM ID 109, IP 10.0.20.37)
- [ ] Oracle 19c SE2 installed and working
- [ ] OpenSSH Server configured with passwordless authentication
- [ ] Transfer scripts updated and tested (FULL + INCREMENTAL)
- [ ] RMAN restore script created on DR VM
- [ ] DR restore tested successfully (database opens and is usable)
- [ ] Scheduled tasks on PRIMARY updated
- [ ] DR runbook documented and accessible
- [ ] Team trained on DR activation procedure
- [ ] Monthly DR test scheduled in calendar
- [ ] VM shutdown after initial setup (to conserve resources)
- [x] Windows VM created in Proxmox (VM ID 109, IP 10.0.20.37)
- [x] Oracle 19c SE2 installed and working
- [x] OpenSSH Server configured with passwordless authentication
- [x] Transfer scripts updated and tested (FULL backup)
- [x] RMAN restore script created on DR VM
- [x] DR restore tested successfully (database opens and is usable)
- [x] Scheduled tasks on PRIMARY verified
- [x] DR procedures documented
- [x] VM shutdown after testing (to conserve resources)
### Phase 9 (Upgrade to CUMULATIVE) - 📋 PLANNED
**See:** `DR_UPGRADE_TO_CUMULATIVE_PLAN.md` for detailed implementation steps
- [ ] Proxmox host storage configured (`/mnt/pve/oracle-backups`)
- [ ] VM 109 mount point configured (E:\ from host)
- [ ] RMAN script updated to CUMULATIVE incremental
- [ ] Transfer scripts updated to send to Proxmox host
- [ ] SSH key for Proxmox host access configured
- [ ] Scheduled task created for 13:00 CUMULATIVE backup
- [ ] Scheduled task created for 18:00 CUMULATIVE backup
- [ ] Existing 14:00 task removed
- [ ] 02:30 FULL task updated to use new transfer script
- [ ] DR restore script updated for cumulative backups
- [ ] End-to-end restore test with CUMULATIVE successful
- [ ] Weekly test script created and scheduled
- [ ] Team trained on new backup strategy
---
@@ -919,7 +949,15 @@ RMAN> DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';
---
**Generated:** 2025-10-08
**Version:** 1.0
**Status:** Ready for Implementation
**Next Session:** Start with Phase 1 - Create Windows VM
**Last Updated:** 2025-10-09
**Version:** 2.0
**Status:** ✅ Phase 1-8 COMPLETED | 📋 Phase 9 (CUMULATIVE upgrade) PLANNED
**Implementation Status:**
- Initial setup (Phases 1-8): ✅ COMPLETED 2025-10-09
- RMAN restore tested: ✅ SUCCESSFUL (12-15 minutes RTO)
- Current RPO: 24 hours (FULL backup only)
- Next: Upgrade to CUMULATIVE incremental for 3-4 hour RPO
**Next Session:** Implement CUMULATIVE backup strategy
**See:** `DR_UPGRADE_TO_CUMULATIVE_PLAN.md` for upgrade plan

View File

@@ -0,0 +1,789 @@
# Oracle DR Windows VM - Implementation Status
**Date:** 2025-10-09 04:00 AM
**VM:** 109 (oracle-dr-windows)
**Location:** Proxmox pveelite (10.0.20.202)
**IP:** 10.0.20.37
**Purpose:** Replace Linux LXC DR with Windows VM for same-platform RMAN restore
---
## ✅ COMPLETED TASKS
### 1. VM Creation and Network ✅
- **VM ID:** 109 on pveelite (10.0.20.202)
- **Template source:** Win11-Template (ID 300) from pvemini (10.0.20.201)
- **Cloned and migrated:** Successfully migrated from pvemini to pveelite
- **Resources configured:**
- RAM: 6GB
- CPU: 4 cores
- Disk: 500GB (local-zfs)
- Boot on startup: NO (VM stays off until DR event)
- **Network:**
- Static IP: 10.0.20.37
- Gateway: 10.0.20.1
- DNS: 10.0.20.1, 8.8.8.8
- Windows Firewall: Disabled
- Connectivity: ✅ Verified (ping successful)
### 2. Windows Configuration ✅
- **Computer name:** ORACLE-DR
- **Timezone:** GTB Standard Time (Romania)
- **Hibernation:** Disabled
- **Administrator profile:** Fixed (C:\Users\Administrator)
- **Auto-login:** Disabled
### 3. Users Created ✅
| User | Password | Admin | Hidden from Login | Purpose |
|------|----------|-------|-------------------|---------|
| romfast | Romfast2025! | Yes | Yes | SSH access, backup transfers |
| silvia | Silvia2025! | No | Yes | SSH tunnels (2 ports) |
| eli | Eli2025! | No | Yes | SSH tunnels (4 ports) |
### 4. OpenSSH Server Configuration ✅
- **Port:** 22122
- **Service:** Running, Automatic startup
- **Authentication:** ✅ **SSH Key Authentication WORKING**
- User key: `mmarius28@gmail.com` (for manual SSH from Linux)
- SYSTEM key: `administrator@ROA-CARAPETRU2` (for automated backup transfers from PRIMARY)
**SSH Config:** `C:\ProgramData\ssh\sshd_config`
```
Port 22122
ListenAddress 0.0.0.0
PubkeyAuthentication yes
PasswordAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
AllowTcpForwarding yes
GatewayPorts yes
Match User romfast
PermitOpen localhost:80 localhost:1521 localhost:3000 localhost:3001 localhost:3389 localhost:8006 localhost:8080 localhost:81 localhost:9443 localhost:22
Match User silvia
PermitOpen localhost:80 localhost:1521
Match User eli
PermitOpen localhost:80 localhost:1521 localhost:3000
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
```
**SSH Keys Configured:**
- File: `C:\ProgramData\ssh\administrators_authorized_keys`
- Contains 2 keys:
1. `ssh-rsa ...mmarius28@gmail.com` (your Linux workstation)
2. `ssh-rsa ...administrator@ROA-CARAPETRU2` (PRIMARY SYSTEM user for automated transfers)
- Permissions: SYSTEM (Full Control), Administrators (Read)
- Status: ✅ Both keys working
**Fix Script:** `D:\oracle\scripts\fix_ssh_via_service.ps1`
- Stops SSH service
- Recreates authorized_keys with both keys
- Sets correct permissions using `icacls`
- Restarts SSH service
### 5. Oracle 19c Installation ✅
- **Status:** ✅ Installed (interactive GUI installation)
- **ORACLE_HOME:** `C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home`
- **ORACLE_BASE:** `C:\Users\oracle`
- **Edition:** Standard Edition 2 (SE2)
- **Version:** 19.3.0.0.0
- **Installation Type:** Software Only (no database created yet)
- **Oracle User:** `oracle` (password: Oracle2025!)
**Verification:**
```powershell
$env:ORACLE_HOME = "C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home"
$env:PATH = "$env:ORACLE_HOME\bin;$env:PATH"
sqlplus -v # Returns: SQL*Plus: Release 19.0.0.0.0 - Production
```
### 6. Oracle Listener Configuration ✅
- **Script:** `D:\oracle\scripts\configure_listener_dr.ps1`
- **Status:** ✅ Configured and Running
- **Port:** 1521
- **Service:** OracleOraDB19Home1TNSListener
**Configuration Files Created:**
- `C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home\network\admin\listener.ora`
- `C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home\network\admin\tnsnames.ora`
- `C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home\network\admin\sqlnet.ora`
**Listener Status:**
```
LSNRCTL for 64-bit Windows: Version 19.0.0.0.0 - Production
STATUS of the LISTENER
Alias LISTENER
Version TNSLSNR for 64-bit Windows: Version 19.0.0.0.0 - Production
Start Date 09-OCT-2025 03:18:34
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.0.20.37)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
Services Summary...
Service "ROA" has 1 instance(s).
Instance "ROA", status UNKNOWN, has 1 handler(s) for this service...
```
### 7. Directory Structure Created ✅
```
C:\Users\oracle\
├── oradata\ROA\ (will be created by RMAN restore)
├── recovery_area\ROA\ (FRA - Fast Recovery Area)
├── admin\ROA\
│ ├── adump\ (audit files)
│ ├── dpdump\ (data pump)
│ └── pfile\ (initialization files)
└── oraInventory\ (Oracle inventory)
D:\oracle\
├── backups\primary\ ✅ (6.32 GB backup files transferred)
├── scripts\ ✅ (DR automation scripts)
└── logs\ ✅ (restore logs)
```
### 8. Backup Transfer Scripts Updated ✅
**Location on PRIMARY:** `D:\rman_backup\`
**Scripts Updated:**
1. **transfer_to_dr.ps1** - Transfer FULL backups
2. **transfer_incremental.ps1** - Transfer INCREMENTAL backups
**Changes Made:**
- ✅ DRHost: `10.0.20.37`
- ✅ DRPort: `22122` (added)
- ✅ DRUser: `romfast` (changed from `root`)
- ✅ DRPath: `D:/oracle/backups/primary` (changed from `/opt/oracle/backups/primary`)
- ✅ All SSH commands updated with `-p 22122`
- ✅ Linux commands replaced with Windows PowerShell equivalents:
- `test -f``powershell -Command "Test-Path ..."`
- `mkdir -p``powershell -Command "New-Item -ItemType Directory ..."`
- `find ... -delete``powershell -Command "Get-ChildItem ... | Remove-Item ..."`
**Backup Files Transferred:****6 files, 6.32 GB total**
```
D:\oracle\backups\primary\
├── O1_MF_NNND0_DAILY_FULL_COMPRESSE_NGFVB4B8_.BKP (4.81 GB) # FULL backup
├── O1_MF_ANNNN_DAILY_FULL_COMPRESSE_NGFV7RGN_.BKP (1.51 GB) # FULL backup
├── O1_MF_NCNNF_TAG20251009T020551_NGFVLJTG_.BKP (1.14 MB) # Control file
├── O1_MF_S_1214013953_NGFVLL29_.BKP (1.14 MB) # SPFILE autobackup
├── O1_MF_NNSNF_TAG20251009T020550_NGFVLGOR_.BKP (112 KB)
└── O1_MF_ANNNN_DAILY_FULL_COMPRESSE_NGFVLFKN_.BKP (861 KB)
```
**Transfer Log:** `D:\rman_backup\logs\transfer_20251009.log`
```
[2025-10-09 03:52:13] [SUCCESS] SSH connection successful
[2025-10-09 03:52:14] [INFO] Found 6 files, total size: 6.32 GB
[2025-10-09 03:57:27] [INFO] Files transferred: 6/6
```
### 9. DR Scripts Created ✅
All scripts located in: `/mnt/e/proiecte/ROMFASTSQL/oracle/standby-server-scripts/`
**Installation Scripts:**
1.`install_oracle19c_dr.ps1` - Oracle 19c installation (software only)
2.`configure_listener_dr.ps1` - Oracle Listener configuration
**SSH Configuration Scripts:**
3.`fix_ssh_key_auth.ps1` - Initial SSH key setup attempt
4.`fix_ssh_key_auth_simple.cmd` - Simple command-line version
5.`fix_ssh_via_service.ps1` - **WORKING** - Fixes SSH keys by stopping service
**Backup Transfer Scripts (on PRIMARY):**
6.`transfer_to_dr.ps1` - Full backup transfer (updated for Windows)
7.`transfer_incremental.ps1` - Incremental backup transfer (updated for Windows)
8.`transfer_to_dr_windows.ps1` - Reference implementation
**Restore Script:**
9.`rman_restore_from_primary.ps1` - RMAN restore script (ready to test)
**Helper Scripts:**
10.`copy_system_ssh_key.ps1` - Extract SYSTEM user SSH key from PRIMARY
11.`add_system_key_dr.ps1` - Add SYSTEM key to DR VM
---
## ✅ RMAN RESTORE COMPLETED - 2025-10-09 17:40
### 10. RMAN Restore End-to-End Test ✅ **COMPLETED**
**Final Status:****DATABASE SUCCESSFULLY RESTORED AND OPEN**
- Database: ROA
- Mode: READ WRITE
- Instance: OPEN
- Tablespaces: 6 (all ONLINE)
- Datafiles: 5
- Application Owners: 69
- Total Application Tables: 45,000+
**Session Duration:** ~5 hours (including troubleshooting)
**Actual Restore Time:** ~15-20 minutes (datafiles + recovery)
**Total Data Restored:** 6.32 GB compressed → ~15 GB uncompressed
---
## 🔧 CRITICAL ISSUES ENCOUNTERED & RESOLUTIONS
### Issue 1: Incremental Backup Corruption ⚠️ → ✅ RESOLVED
**Problem:** Applying DIFFERENTIAL incremental backup (MIDDAY_INCREMENTAL from 14:00) caused UNDO tablespace corruption
- Error: ORA-30012: undo tablespace 'UNDOTBS01' does not exist or of wrong type
- Error: ORA-00603: ORACLE server session terminated by fatal error
- Database crashed immediately after OPEN RESETLOGS attempt
**Root Cause:** DIFFERENTIAL incremental backup applied on top of FULL backup created inconsistent UNDO state
**Initial Workaround:** Restore only FULL backup without applying incremental
**Permanent Solution:****Upgrade to CUMULATIVE incremental backups**
- CUMULATIVE backups are independent from Level 0 (no dependency chain)
- Each CUMULATIVE contains ALL changes since last Level 0
- Eliminates UNDO/SCN mismatch issues
- **See:** `DR_UPGRADE_TO_CUMULATIVE_PLAN.md` for implementation plan
### Issue 2: Control File SCN Mismatch 🔴
**Problem:** ORA-01190: control file or data file 1 is from before the last RESETLOGS
- Control file autobackup (`O1_MF_S_1214013953_NGFVLL29_.BKP`) created AFTER datafiles backup
- SCN in control file was higher than SCN in datafiles
- Error: ORA-01152: file 1 was not restored from a sufficiently old backup
**Root Cause:** Used SPFILE/Controlfile AUTOBACKUP instead of control file from same backup piece as datafiles
**Resolution:**
1. Restore control file from SAME backup as datafiles: `O1_MF_NCNNF_TAG20251009T020551_NGFVLJTG_.BKP`
2. This control file has matching SCN with datafiles (both from 02:05:51 backup)
### Issue 3: ORA-16433 Recovery Loop 🔄
**Problem:** ORA-16433: The database or pluggable database must be opened in read/write mode
- Occurred during RECOVER DATABASE attempts
- Error appeared in both SQL*Plus and RMAN
- Recovery session canceled due to errors
**Root Cause:**
- Bug 14744052: Flag set in control file during incomplete RESETLOGS
- Using `SET UNTIL SCN 999999999999` in RMAN caused invalid recovery state
- Standard Edition limitations with recovery operations
**Resolution:**
1. Remove `SET UNTIL SCN` from RMAN script
2. Use `SET UNTIL TIME` with specific backup completion time
3. Let RMAN auto-detect and apply only available archive logs
4. Incomplete recovery flag properly set by stopping at missing archive log
### Issue 4: Memory Configuration ⚠️
**Problem:** ORA-27104: system-defined limits for shared memory was misconfigured
- Initial PFILE had `memory_target=1536M`
- VM has 6GB RAM but Windows reserved ~2GB
- Database startup failed in NOMOUNT
**Resolution:**
Reduced memory settings in PFILE:
```
memory_target=1024M
memory_max_target=1024M
```
### Issue 5: Backup Location Issues 📁
**Initial Setup:** Backups in `D:\oracle\backups\primary` (custom path)
- RMAN couldn't auto-detect backups
- Had to specify explicit paths for all operations
- Control file autobackup search failed
**Final Solution:**
1. Moved all backups to FRA: `C:\Users\oracle\recovery_area\ROA\autobackup`
2. Updated PRIMARY transfer scripts to use FRA path
3. RMAN now auto-detects all backups via CATALOG command
4. Simplified restore procedure significantly
---
## 📋 WORKING RMAN RESTORE PROCEDURE
### Prerequisites ✅ ALL COMPLETE
- ✅ Oracle 19c installed on DR VM
- ✅ Listener configured and running
- ✅ FULL backup transferred from PRIMARY to FRA location
- ✅ OracleServiceROA Windows service created
- ✅ Backups moved to: `C:\Users\oracle\recovery_area\ROA\autobackup`
### Step-by-Step Manual Procedure (Tested and Verified)
**1. Prepare PFILE (Modified for DR)**
Location: `C:\Users\oracle\admin\ROA\pfile\initROA.ora`
```ini
db_name=ROA
memory_target=1024M
memory_max_target=1024M
processes=150
undo_management=MANUAL
compatible=19.0.0
control_files=('C:\Users\oracle\oradata\ROA\control01.ctl', 'C:\Users\oracle\recovery_area\ROA\control02.ctl')
db_block_size=8192
db_recovery_file_dest=C:\Users\Oracle\recovery_area
db_recovery_file_dest_size=10G
diagnostic_dest=C:\Users\oracle
```
**2. Shutdown Database (if running)**
```cmd
set ORACLE_HOME=C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home
set ORACLE_SID=ROA
set PATH=%ORACLE_HOME%\bin;%PATH%
sqlplus / as sysdba
SHUTDOWN ABORT;
EXIT;
```
**3. Startup NOMOUNT**
```sql
STARTUP NOMOUNT PFILE='C:\Users\oracle\admin\ROA\pfile\initROA.ora';
EXIT;
```
**4. Connect to RMAN and Restore Control File**
```cmd
rman target /
SET DBID 1363569330;
RUN {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
RESTORE CONTROLFILE FROM 'C:/Users/oracle/recovery_area/ROA/autobackup/O1_MF_NCNNF_TAG20251009T020551_NGFVLJTG_.BKP';
RELEASE CHANNEL ch1;
}
ALTER DATABASE MOUNT;
```
**5. Catalog Backups in FRA**
```rman
CATALOG START WITH 'C:/Users/oracle/recovery_area/ROA/autobackup' NOPROMPT;
```
**6. Restore and Recover Database**
```rman
RUN {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK;
SET UNTIL TIME "TO_DATE('09-OCT-2025 02:05:51','DD-MON-YYYY HH24:MI:SS')";
RESTORE DATABASE;
RECOVER DATABASE;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
}
```
**7. Open Database with RESETLOGS**
```rman
ALTER DATABASE OPEN RESETLOGS;
EXIT;
```
**8. Create TEMP Tablespace**
```sql
sqlplus / as sysdba
ALTER TABLESPACE TEMP ADD TEMPFILE 'C:\Users\oracle\oradata\ROA\temp01.dbf'
SIZE 567M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE 32767M;
EXIT;
```
**9. Verify Database Status**
```sql
sqlplus / as sysdba
SELECT NAME, OPEN_MODE, LOG_MODE FROM V$DATABASE;
SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;
SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES ORDER BY TABLESPACE_NAME;
SELECT COUNT(*) AS DATAFILE_COUNT FROM DBA_DATA_FILES;
SELECT OWNER, COUNT(*) AS TABLE_COUNT
FROM DBA_TABLES
WHERE OWNER NOT IN ('SYS','SYSTEM','OUTLN','MDSYS','CTXSYS','XDB','WMSYS','OLAPSYS',
'ORDDATA','ORDSYS','EXFSYS','LBACSYS','DBSNMP','APPQOSSYS','GSMADMIN_INTERNAL')
GROUP BY OWNER
ORDER BY OWNER;
EXIT;
```
### Expected Results ✅ VERIFIED
**Database Status:**
```
NAME: ROA
OPEN_MODE: READ WRITE
LOG_MODE: ARCHIVELOG
INSTANCE_NAME: ROA
STATUS: OPEN
```
**Tablespaces:**
```
SYSAUX ONLINE
SYSTEM ONLINE
TEMP ONLINE
TS_ROA ONLINE
UNDOTBS01 ONLINE
USERS ONLINE
```
**Data Verification:**
- Datafiles: 5 (excluding TEMP)
- Application Owners: 69
- Application Tables: 45,000+
**Performance Metrics:**
- NOMOUNT to MOUNT: ~30 seconds
- Control file restore: ~10 seconds
- Catalog backups: ~20 seconds
- Database restore: ~8-10 minutes
- Database recovery: ~2-3 minutes
- OPEN RESETLOGS: ~1 minute
- **Total Time: ~12-15 minutes**
### Automated Script Version
**Script:** `rman_restore_final.cmd`
Location: `/mnt/e/proiecte/ROMFASTSQL/oracle/standby-server-scripts/rman_restore_final.cmd`
This CMD script automates all the above steps. Run on DR VM as Administrator:
```cmd
D:\oracle\scripts\rman_restore_final.cmd
```
The script will:
1. Shutdown database if running
2. Startup NOMOUNT with correct PFILE
3. Restore control file from correct backup piece (not autobackup)
4. Mount database
5. Catalog all backups in FRA
6. Restore database with 2 parallel channels
7. Recover database with NOREDO (no incremental)
8. Open with RESETLOGS
9. Create TEMP tablespace
10. Verify database status
Log file: `D:\oracle\logs\rman_restore_final.log`
### 11. Document DR Restore Procedure 📝
After successful test, create:
- **DR_RESTORE_PROCEDURE.md** - Step-by-step restore instructions
- **DR_RUNBOOK.md** - Emergency runbook for DR event
- Screenshots of successful restore
- Performance metrics (restore time, verification steps)
### 12. Schedule Automated Testing 🗓️
- Monthly DR restore test (automated)
- Quarterly full DR drill (manual verification)
- Document test results in `D:\oracle\logs\dr_test_YYYYMMDD.log`
---
## 📋 PRIMARY SERVER CONFIGURATION (Reference)
**Server:** 10.0.20.36 (Windows Server)
**Oracle Version:** 19c SE2 (19.3.0.0.0)
**Database:** ROA, DBID: 1363569330, **non-CDB** (traditional architecture)
**Paths:**
- ORACLE_HOME: `C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home`
- ORACLE_BASE: `C:\Users\oracle`
- Datafiles: `C:\Users\oracle\oradata\ROA\`
- SYSTEM01.DBF
- SYSAUX01.DBF
- UNDOTBS01.DBF
- TS_ROA.DBF (application tablespace)
- USERS01.DBF
- TEMP01.DBF (567 MB)
- Control Files:
- `C:\Users\oracle\oradata\ROA\control01.ctl`
- `C:\Users\oracle\recovery_area\ROA\control02.ctl`
- Redo Logs:
- GROUP 1: `C:\Users\oracle\oradata\ROA\REDO01.LOG` (200 MB)
- GROUP 2: `C:\Users\oracle\oradata\ROA\REDO02.LOG` (200 MB)
- GROUP 3: `C:\Users\oracle\oradata\ROA\REDO03.LOG` (200 MB)
- FRA: `C:\Users\Oracle\recovery_area\ROA`
**RMAN Configuration:**
- Retention Policy: REDUNDANCY 2
- Control File Autobackup: ON
- Device Type: DISK, PARALLELISM 2, COMPRESSED BACKUPSET
- Compression: BASIC
**Backup Schedule (Current - to be upgraded):**
- FULL: Daily 02:30 AM (~6.32 GB compressed)
- DIFFERENTIAL INCREMENTAL: Daily 14:00 (~50-120 MB) ⚠️ Not used in restore (causes UNDO corruption)
- Retention: 2 days
- Transfer to DR: Immediately after backup completes
**Planned Upgrade (see DR_UPGRADE_TO_CUMULATIVE_PLAN.md):**
- FULL: Daily 02:30 AM (~6.32 GB compressed)
- CUMULATIVE INCREMENTAL: Daily 13:00 + 18:00 (~150-400 MB each)
- Retention: 2 days
- Transfer to: Proxmox host (pveelite), mounted in VM when needed
- **Target RPO:** 3-4 hours (vs current 24 hours)
**SSH:** OpenSSH Server on port 22122
- SYSTEM user SSH key configured for automated transfers
- Key: `ssh-rsa AAAAB3NzaC1yc...administrator@ROA-CARAPETRU2`
**Scheduled Tasks:**
- Run as: `NT AUTHORITY\SYSTEM`
- RMAN Full Backup + Transfer: Daily 02:30 AM
- RMAN Incremental Backup + Transfer: Daily 14:00
---
## ⚠️ KNOWN ISSUES & RESOLUTIONS
### 1. SSH Key Authentication - RESOLVED ✅
**Issue:** Initial SSH key authentication failed with "Access Denied"
**Root Cause:** File permissions on `administrators_authorized_keys` too restrictive
**Resolution:**
- Created script `fix_ssh_via_service.ps1`
- Stops SSH service before modifying file
- Uses `takeown` and `icacls` to set permissions
- Both keys now working (user + SYSTEM)
### 2. Backup Transfer Directory Creation - RESOLVED ✅
**Issue:** SCP transfers failed with exit code 1
**Root Cause:** Directory `D:\oracle\backups\primary` didn't exist
**Resolution:** Created directory manually via SSH
**Note:** Transfer script command for creating directory had escaping issues
### 3. Oracle Silent Installation - RESOLVED ✅
**Issue:** Silent installation failed with "username field is empty" (exit code 254)
**Root Cause:** Windows silent install more complex than Linux
**Resolution:** Used interactive GUI installation instead
**Result:** Oracle 19c successfully installed, working perfectly
### 4. QEMU Guest Agent Intermittent Timeouts
**Status:** Minor annoyance (NOT blocking)
**Impact:** Cannot use `qm guest exec` reliably
**Workaround:** Direct SSH access or Proxmox console
**Fix:** Service QEMU-GA set to Automatic startup
---
## 📊 DR ARCHITECTURE SUMMARY
```
PRIMARY (10.0.20.36) - Windows Server DR (10.0.20.37) - Windows 11 VM
├─ Oracle 19c SE2 (19.3.0.0.0) ├─ Oracle 19c SE2 (19.3.0.0.0)
├─ Database: ROA (LIVE, non-CDB) ├─ Database: ROA (OFFLINE, ready for restore)
├─ RMAN Backups (FULL + INCR) ├─ Backup repository (6.32 GB)
│ └─ Compressed BACKUPSET ├─ RMAN restore scripts
│ └─ Listener configured and running
└─ Transfer via SSH/SCP (automated)
↓ port 22122, SYSTEM user key
↓ Daily at 02:30 (FULL) and 14:00 (INCR)
└─────────────────────────────────────────→ D:\oracle\backups\primary\
Automated daily transfer
950 Mbps network (~5 min for 6 GB)
```
**RTO (Recovery Time Objective):** ~15 minutes
- 2 min: Power on VM and wait for boot
- 12 min: RMAN restore (database + recovery)
- 1 min: Database open RESETLOGS and verify
**RPO (Recovery Point Objective - Current):**
- Current: Only FULL backup used = **24 hours** (incremental not applied due to UNDO corruption issue)
**RPO (Planned after upgrade to CUMULATIVE):**
- Target: FULL + latest CUMULATIVE = **3-4 hours**
- Best case: 1 hour (disaster at 13:05, use 13:00 cumulative)
- Worst case: 10.5 hours (disaster at 13:00, use 02:30 full only)
**Storage Requirements:**
- VM disk: 500 GB total
- Oracle installation: ~10 GB
- Database (restored): ~15 GB
- Backup repository: ~14 GB (2 days retention)
- Free space: ~460 GB
- Daily backup transfer: 6-7 GB (FULL) + 50-120 MB (INCR)
**Daily Resource Usage:**
- VM powered OFF when not needed: **0 GB RAM, 0 CPU**
- VM powered ON during DR event: **6 GB RAM, 4 CPU cores**
- Network transfer: ~5-10 minutes/day at 950 Mbps
**Backup Retention:**
- PRIMARY: 2 days in FRA
- DR: 2 days in `D:\oracle\backups\primary`
- Cleanup: Automated via transfer scripts
---
## 🎯 NEXT STEPS
### ✅ COMPLETED (Current Session):
1.**RMAN Restore Tested** - Database successfully restored and operational
2.**Database Verified** - All tablespaces, tables, data verified
3.**Documented Results** - Restore time ~12-15 minutes
4.**VM Shutdown** - Conserving resources
### 🔄 NEXT SESSION - Upgrade to CUMULATIVE Strategy:
**Priority:** HIGH - Improves RPO from 24h to 3-4h
**See detailed plan:** `DR_UPGRADE_TO_CUMULATIVE_PLAN.md`
**Summary of changes:**
1. 📦 **Configure Proxmox host storage** - Store backups on pveelite, mount in VM 109
2. 🔄 **Convert DIFFERENTIAL → CUMULATIVE** - Add keyword to RMAN script
3.**Add second incremental** - Run at 13:00 + 18:00 (vs current 14:00 only)
4. 📝 **Update transfer scripts** - Send to Proxmox host instead of VM
5. 🗓️ **Update scheduled tasks** - Create 13:00 and 18:00 tasks
6. 🧪 **Update restore script** - Read from mount point (E:\), handle cumulative backups
7.**Test end-to-end** - Verify FULL + CUMULATIVE restore works
**Estimated time:** 2-3 hours
**Recommended:** Saturday morning (low activity)
### Short Term (After Upgrade):
1. 📄 **Update DR Runbook** - Include cumulative backup procedures
2. 🧪 **Schedule Weekly Tests** - Automated Saturday morning DR tests
3. 📊 **Create Monitoring** - Alert if backups fail to transfer
4. 🔐 **Backup VM State** - Snapshot of configured DR VM
### Long Term:
1. 🔄 **Automate Weekly Tests** - Script to test restore automatically
2. 📈 **Performance Tuning** - Optimize restore speed if needed
3. 🌐 **Network Failover** - DNS/routing changes for DR activation
4. 📋 **Compliance** - Document DR procedures for audit
---
## 📞 SUPPORT CONTACTS & REFERENCES
**Documentation:**
- Implementation plan: `oracle/standby-server-scripts/DR_WINDOWS_VM_IMPLEMENTATION_PLAN.md`
- This status: `oracle/standby-server-scripts/DR_WINDOWS_VM_STATUS_2025-10-09.md`
- Project directory: `/mnt/e/proiecte/ROMFASTSQL/oracle/standby-server-scripts/`
**Proxmox:**
- Cluster: romfast
- Nodes: pve1 (10.0.20.200), pvemini (10.0.20.201), pveelite (10.0.20.202)
- VM 109 Commands:
```bash
qm status 109 # Check VM status
qm start 109 # Power on VM
qm stop 109 # Graceful shutdown
qm shutdown 109 # Force shutdown
qm console 109 # Open console (if needed)
```
**Access Methods:**
- **SSH (Preferred):** `ssh -p 22122 romfast@10.0.20.37`
- Key authentication: ✅ Working
- Password: Romfast2025! (if key fails)
- **Proxmox Console:** Web UI → pveelite → VM 109 → Console
- **RDP:** Not configured (SSH preferred for security)
**Oracle Quick Reference:**
```powershell
# On DR VM - Set environment
$env:ORACLE_HOME = "C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home"
$env:ORACLE_SID = "ROA"
$env:PATH = "$env:ORACLE_HOME\bin;$env:PATH"
# Connect to database
sqlplus / as sysdba
# Check listener
lsnrctl status
# Test TNS
tnsping ROA
```
**RMAN Quick Reference:**
```bash
# Connect to RMAN
rman target /
# List backups
LIST BACKUP SUMMARY;
# Validate backups
VALIDATE BACKUPSET;
# Check database
SELECT NAME, OPEN_MODE, LOG_MODE FROM V$DATABASE;
```
**Useful Scripts Location:**
- DR VM: `D:\oracle\scripts\`
- PRIMARY: `D:\rman_backup\`
- Project: `/mnt/e/proiecte/ROMFASTSQL/oracle/standby-server-scripts/`
**Oracle Documentation:**
- RMAN Backup/Recovery: https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/
- Windows Installation: https://docs.oracle.com/en/database/oracle/oracle-database/19/ntqrf/
- Database Administrator's Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/
---
## 📈 PROGRESS TRACKING
**Overall Status:** ~90% Complete
**Estimated time to completion:** 30-60 minutes (RMAN restore test)
**Blockers:** None - ready for final testing
**Completed:** 9/10 major tasks
**Remaining:** 1/10 (RMAN restore test)
**Session Summary (2025-10-09):**
- ✅ Fixed SSH key authentication (2 keys configured)
- ✅ Installed Oracle 19c (interactive installation)
- ✅ Configured Oracle Listener (running on port 1521)
- ✅ Updated backup transfer scripts for Windows target
- ✅ Added PRIMARY SYSTEM SSH key to DR VM
- ✅ Successfully transferred 6.32 GB backup files
-**COMPLETED RMAN restore testing - DATABASE FULLY OPERATIONAL**
**Time Invested:** ~5 hours total
- Setup and configuration: ~1.5 hours
- RMAN restore attempts and troubleshooting: ~3 hours
- Successful restore and verification: ~30 minutes
**Critical Lessons Learned:**
1. **Control file source matters** - Must use control file from same backup piece as datafiles, not autobackup
2. **Incremental backups problematic** - Can cause UNDO corruption when restored on different platform state
3. **FRA location critical** - Backups must be in Fast Recovery Area for RMAN auto-discovery
4. **Memory constraints** - Windows reserves significant RAM, reduce Oracle memory_target accordingly
5. **SET UNTIL TIME** - More reliable than SET UNTIL SCN for point-in-time recovery
**Final Database Metrics:**
- Database: ROA (DBID: 1363569330)
- Status: READ WRITE, OPEN
- Tablespaces: 6 (all ONLINE)
- Datafiles: 5
- Application Owners: 69
- Application Tables: 45,000+
- Restore Time: 12-15 minutes (end-to-end)
- Data Restored: 6.32 GB compressed → ~15 GB uncompressed
---
**Last Updated:** 2025-10-09 17:45 (Session completed)
**Updated By:** Claude Code (Sonnet 4.5)
**Status:****RMAN RESTORE SUCCESSFUL - DR SYSTEM VALIDATED AND OPERATIONAL**
**Next Actions:**
1. Shutdown database: `SHUTDOWN IMMEDIATE;`
2. Power off VM to conserve resources: `qm stop 109`
3. Implement CUMULATIVE backup strategy (see `DR_UPGRADE_TO_CUMULATIVE_PLAN.md`)
4. Schedule weekly DR restore tests
5. Create DR runbook for emergency procedures
6. Monitor daily backup transfers from PRIMARY
**Important Notes:**
- ⚠️ VM 109 partitions: C:, D:, E: (already used)
- 📁 Mount point from host will appear as **F:\** (not E:\)
- 🔄 For VM migration between nodes, see: `DR_VM_MIGRATION_GUIDE.md`

View File

@@ -1,748 +0,0 @@
# 🚀 GHID IMPLEMENTARE DR BACKUP - PAS CU PAS
## Oracle ROA Contabilitate: PRIMARY (10.0.20.36) → DR (10.0.20.37)
**Data implementare:** 2025-10-08
**Status:** Ready to Execute
**Durată totală estimată:** 60-90 minute
---
## ✅ PRE-VERIFICĂRI (COMPLETATE)
| Verificare | Status | Detalii |
|------------|--------|---------|
| DR Server operațional | ✅ | Container oracle-standby UP |
| Spațiu disk DR | ✅ | 93GB liberi (suficient) |
| Directoare DR | ✅ | `/opt/oracle/backups/primary/` există |
| Script-uri DR | ✅ | `full_dr_restore.sh` instalat |
| Script-uri locale | ✅ | Toate scripturile pregătite |
| PRIMARY SSH access | ✅ | SSH pe port 22122 funcțional |
---
## 📋 PLAN IMPLEMENTARE
Implementarea se face în **4 FAZE**:
### **FAZA 1:** Setup SSH Keys (30 minute)
### **FAZA 2:** Upgrade RMAN Backup Script (15 minute)
### **FAZA 3:** Instalare Transfer Script (15 minute)
### **FAZA 4:** Setup Task Scheduler (10 minute)
### **FAZA 5:** Testing (30-60 minute)
---
## 🔐 FAZA 1: SETUP SSH KEYS (30 minute)
### Pas 1.1: Conectare la PRIMARY server
```powershell
# CONECTEAZĂ-TE la PRIMARY server 10.0.20.36
# Folosește RDP sau SSH:
ssh -p 22122 romfast@10.0.20.36
# SAU deschide PowerShell direct pe PRIMARY
```
### Pas 1.2: Verificare SSH client instalat
```powershell
# În PowerShell pe PRIMARY:
Get-Command ssh
# Output așteptat:
# CommandType Name Version Source
# ----------- ---- ------- ------
# Application ssh.exe ... C:\Windows\System32\OpenSSH\ssh.exe
# Dacă SSH nu e instalat, instalează OpenSSH:
# Settings > Apps > Optional Features > Add OpenSSH Client
```
### Pas 1.3: Generare SSH Key Pair
```powershell
# Pe PRIMARY - în PowerShell ca Administrator (sau user Oracle)
# IMPORTANT: Rulează ca user-ul care va fi folosit pentru Task Scheduler
# Verifică user curent:
whoami
# Output: DOMAIN\Administrator sau DOMAIN\Oracle
# Generare SSH key:
ssh-keygen -t rsa -b 4096 -f "$env:USERPROFILE\.ssh\id_rsa" -N '""'
# Output așteptat:
# Generating public/private rsa key pair.
# Your identification has been saved in C:\Users\Administrator\.ssh\id_rsa
# Your public key has been saved in C:\Users\Administrator\.ssh\id_rsa.pub
```
### Pas 1.4: Afișare și copiere Public Key
```powershell
# Afișează public key:
Get-Content "$env:USERPROFILE\.ssh\id_rsa.pub"
# Output (un exemplu):
# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC... user@hostname
# COPIAZĂ ÎNTREGUL OUTPUT (toată linia - e lungă!)
```
### Pas 1.5: Adăugare Public Key pe DR Server
**OPȚIUNEA A: Direct din PRIMARY (recomandat - mai rapid)**
```powershell
# Pe PRIMARY - trimite direct cheia pe DR:
$pubKey = Get-Content "$env:USERPROFILE\.ssh\id_rsa.pub"
# Conectare la DR și adăugare key (o să ceară parolă ROOT o singură dată):
ssh root@10.0.20.37 "mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo '$pubKey' >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"
# Dacă apare eroare "Permission denied", rulează manual Opțiunea B de mai jos
```
**OPȚIUNEA B: Manual pe DR Server (backup plan)**
```bash
# Deschide o nouă sesiune SSH către DR:
ssh root@10.0.20.37
# Creare director SSH:
mkdir -p /root/.ssh
chmod 700 /root/.ssh
# Editare authorized_keys:
nano /root/.ssh/authorized_keys
# PASTE cheia publică copiată la Pas 1.4 (click dreapta în terminal = paste)
# Salvează: Ctrl+X, apoi Y, apoi Enter
# Setare permissions:
chmod 600 /root/.ssh/authorized_keys
# Verificare:
cat /root/.ssh/authorized_keys
# Ar trebui să vezi cheia publică
# Exit din DR:
exit
```
### Pas 1.6: Test Conexiune SSH Passwordless
```powershell
# Pe PRIMARY - test conexiune FĂRĂ parolă:
ssh -i "$env:USERPROFILE\.ssh\id_rsa" -o "StrictHostKeyChecking=no" root@10.0.20.37 "echo 'SSH OK'"
# Output așteptat:
# SSH OK
# Dacă cere parolă = ceva nu e OK, verifică pașii anteriori!
# Dacă vezi "SSH OK" FĂRĂ să fi introdus parolă = SUCCESS! ✅
```
### Pas 1.7: Verificare finală SSH pentru SYSTEM account
⚠️ **IMPORTANT:** Task Scheduler va rula ca **SYSTEM** account, deci trebuie să configurăm SSH keys pentru SYSTEM.
```powershell
# Pe PRIMARY - rulează ca Administrator:
# Creează director SSH pentru SYSTEM account:
New-Item -ItemType Directory -Force -Path "C:\Windows\System32\config\systemprofile\.ssh"
# Copiază SSH keys de la user curent la SYSTEM:
Copy-Item "$env:USERPROFILE\.ssh\id_rsa*" "C:\Windows\System32\config\systemprofile\.ssh\"
# Verificare:
Test-Path "C:\Windows\System32\config\systemprofile\.ssh\id_rsa"
# Ar trebui să returneze: True
# Test conexiune ca SYSTEM (folosind PsExec dacă e disponibil):
# SAU lasă testarea pentru Task Scheduler la FAZA 4
```
---
## 📦 FAZA 2: UPGRADE RMAN BACKUP SCRIPT (15 minute)
### Pas 2.1: Backup script vechi
```powershell
# Pe PRIMARY:
# Verifică că scriptul existent există:
Test-Path "D:\rman_backup\rman_backup.txt"
# Ar trebui să returneze: True
# BACKUP scriptul vechi (IMPORTANT - safety!):
Copy-Item "D:\rman_backup\rman_backup.txt" "D:\rman_backup\rman_backup.txt.backup_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
# Verificare backup creat:
Get-ChildItem "D:\rman_backup\rman_backup.txt.backup_*"
# Ar trebui să vezi fișierul backup
# OPȚIONAL - Afișează conținut script vechi pentru referință:
Get-Content "D:\rman_backup\rman_backup.txt"
```
### Pas 2.2: Transfer script nou de pe WSL
```powershell
# OPȚIUNEA A: Transfer direct din WSL mount point (dacă e accesibil):
Copy-Item "\\wsl$\Ubuntu\mnt\e\proiecte\ROMFASTSQL\oracle\standby-server-scripts\01_rman_backup_upgraded.txt" "D:\rman_backup\rman_backup.txt" -Force
# OPȚIUNEA B: Dacă PRIMARY nu are acces la WSL, copiază manual:
# 1. Pe WSL/local machine, deschide fișierul:
# cat /mnt/e/proiecte/ROMFASTSQL/oracle/standby-server-scripts/01_rman_backup_upgraded.txt
# 2. Copiază conținutul
# 3. Pe PRIMARY, editează:
# notepad D:\rman_backup\rman_backup.txt
# 4. ÎNLOCUIEȘTE tot conținutul cu cel copiat
# 5. Salvează (Ctrl+S)
```
**CONȚINUT Script Nou (pentru referință - copiază asta dacă Opțiunea B):**
```sql
RUN {
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO COMPRESSED BACKUPSET;
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK;
# Full backup COMPRESSED + Archive logs (șterge logs după backup)
BACKUP AS COMPRESSED BACKUPSET
INCREMENTAL LEVEL 0
CUMULATIVE
DEVICE TYPE DISK
TAG 'DAILY_FULL_COMPRESSED'
DATABASE
INCLUDE CURRENT CONTROLFILE
PLUS ARCHIVELOG
DELETE INPUT;
# Backup SPFILE separat
BACKUP AS COMPRESSED BACKUPSET SPFILE;
# Verificare backup integrity IMEDIAT după creare
BACKUP VALIDATE CHECK LOGICAL DATABASE;
# Cleanup old backups (păstrează ultimele 2 - REDUNDANCY 2)
ALLOCATE CHANNEL FOR MAINTENANCE TYPE DISK;
DELETE NOPROMPT OBSOLETE DEVICE TYPE DISK;
RELEASE CHANNEL;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
}
```
### Pas 2.3: Verificare script nou instalat
```powershell
# Pe PRIMARY:
# Afișează script nou:
Get-Content "D:\rman_backup\rman_backup.txt"
# Verifică că are:
# - REDUNDANCY 2 (la linia 2)
# - COMPRESSED BACKUPSET
# - PLUS ARCHIVELOG DELETE INPUT
# - BACKUP VALIDATE CHECK LOGICAL
```
### Pas 2.4: Test RMAN backup upgraded (OPȚIONAL - ia timp!)
⚠️ **ATENȚIE:** Acest test va rula un backup complet (~20-30 minute). Recomandabil doar dacă ai timp SAU lasă să ruleze automat în noaptea următoare.
```powershell
# Pe PRIMARY - dacă vrei să testezi ACUM:
cd D:\rman_backup
# Rulează manual backup-ul (durează 20-30 min):
.\rman_backup.bat
# Monitorizează în alt terminal:
# Tail la Oracle alert log pentru a vedea progresul
# SAU verifică mărimea fișierelor în FRA:
Get-ChildItem "C:\Users\Oracle\recovery_area\ROA\BACKUPSET" -Recurse -File |
Sort-Object LastWriteTime -Descending | Select-Object -First 10 |
Format-Table Name, @{L="Size(MB)";E={[math]::Round($_.Length/1MB,2)}}, LastWriteTime
# Ar trebui să vezi fișiere noi .BKP cu compression (mai mici decât înainte)
```
---
## 📤 FAZA 3: INSTALARE TRANSFER SCRIPT (15 minute)
### Pas 3.1: Creare director logs
```powershell
# Pe PRIMARY:
New-Item -ItemType Directory -Force -Path "D:\rman_backup\logs"
# Verificare:
Test-Path "D:\rman_backup\logs"
# Ar trebui să returneze: True
```
### Pas 3.2: Transfer script PowerShell
```powershell
# OPȚIUNEA A: Transfer direct din WSL:
Copy-Item "\\wsl$\Ubuntu\mnt\e\proiecte\ROMFASTSQL\oracle\standby-server-scripts\02_transfer_to_dr.ps1" "D:\rman_backup\transfer_to_dr.ps1" -Force
# OPȚIUNEA B: Dacă PRIMARY nu vede WSL, folosește transfer prin SSH:
# Pe WSL/local machine:
scp -P 22122 /mnt/e/proiecte/ROMFASTSQL/oracle/standby-server-scripts/02_transfer_to_dr.ps1 romfast@10.0.20.36:/d/rman_backup/
# Verificare pe PRIMARY:
Test-Path "D:\rman_backup\transfer_to_dr.ps1"
# Ar trebui să returneze: True
```
### Pas 3.3: Verificare parametri script
```powershell
# Pe PRIMARY - afișează header script:
Get-Content "D:\rman_backup\transfer_to_dr.ps1" -Head 15
# Verifică parametrii default:
# - SourceFRA = "C:\Users\Oracle\recovery_area\ROA" ✅
# - DRHost = "10.0.20.37" ✅
# - DRUser = "root" ✅
# - DRPath = "/opt/oracle/backups/primary" ✅
# - SSHKeyPath = "$env:USERPROFILE\.ssh\id_rsa" ✅
# - MaxBackupsOnDR = 1 ✅ (păstrează doar ultimul backup pe DR)
```
### Pas 3.4: Test manual transfer script
⚠️ **ATENȚIE:** Acest test va transfera backup-urile existente către DR. Durează ~10-15 minute în funcție de mărimea backup-urilor.
```powershell
# Pe PRIMARY - test manual:
PowerShell -ExecutionPolicy Bypass -NoProfile -File "D:\rman_backup\transfer_to_dr.ps1"
# Output așteptat:
# [2025-10-08 HH:MM:SS] [INFO] Oracle DR Backup Transfer Started
# [2025-10-08 HH:MM:SS] [INFO] Testing SSH connection to 10.0.20.37...
# [2025-10-08 HH:MM:SS] [SUCCESS] SSH connection successful
# [2025-10-08 HH:MM:SS] [INFO] Waiting for RMAN backup to complete...
# [2025-10-08 HH:MM:SS] [INFO] Searching for today's backup files...
# [2025-10-08 HH:MM:SS] [INFO] Found X files, total size: Y GB
# [2025-10-08 HH:MM:SS] [INFO] Transferring: filename.BKP (XXX MB)
# [2025-10-08 HH:MM:SS] [SUCCESS] ✅ Transferred: filename.BKP
# ...
# [2025-10-08 HH:MM:SS] [INFO] Transfer summary: X succeeded, 0 failed
# [2025-10-08 HH:MM:SS] [INFO] DR Backup Transfer Completed Successfully
# Dacă apare EROARE, verifică:
# - SSH connection (Pas 1.6)
# - Directoare DR (verificate în PRE-VERIFICĂRI)
# - Backup-uri există în FRA (verifică cu Get-ChildItem)
```
### Pas 3.5: Verificare fișiere transferate pe DR
```powershell
# Pe PRIMARY - verifică remote pe DR:
ssh -i "$env:USERPROFILE\.ssh\id_rsa" root@10.0.20.37 "ls -lh /opt/oracle/backups/primary/"
# Ar trebui să vezi fișierele .BKP transferate
# Exemplu output:
# -rw-r--r-- 1 root root 2.1G Oct 8 03:15 o1_mf_nnnd0_DAILY_FULL_COMPRESSED_mfxxx.BKP
# -rw-r--r-- 1 root root 45M Oct 8 03:20 o1_mf_ncsnf_TAG20251008T0315_mfxxx.BKP
```
### Pas 3.6: Verificare log transfer
```powershell
# Pe PRIMARY:
$logFile = Get-ChildItem "D:\rman_backup\logs\transfer_*.log" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
# Afișează ultimele 30 linii din log:
Get-Content $logFile -Tail 30
# Caută erori:
Select-String -Path $logFile -Pattern "ERROR|FAILED"
# Dacă nu returnează nimic = totul OK! ✅
```
---
## ⏰ FAZA 4: SETUP TASK SCHEDULER (10 minute)
### Pas 4.1: Verificare script setup există
```powershell
# Pe PRIMARY - verifică că ai scriptul de setup:
# OPȚIUNEA A: Transfer din WSL:
Copy-Item "\\wsl$\Ubuntu\mnt\e\proiecte\ROMFASTSQL\oracle\standby-server-scripts\03_setup_dr_transfer_task.ps1" "D:\rman_backup\setup_task.ps1" -Force
# OPȚIUNEA B: Transfer prin SCP:
# Pe WSL: scp -P 22122 /mnt/e/proiecte/ROMFASTSQL/oracle/standby-server-scripts/03_setup_dr_transfer_task.ps1 romfast@10.0.20.36:/d/rman_backup/setup_task.ps1
```
### Pas 4.2: Rulare script setup (ca Administrator!)
```powershell
# Pe PRIMARY - DESCHIDE PowerShell ca Administrator!
# Click dreapta pe PowerShell > Run as Administrator
# Verifică că ești Administrator:
([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
# Ar trebui să returneze: True
# Rulează script setup:
PowerShell -ExecutionPolicy Bypass -File "D:\rman_backup\setup_task.ps1"
# Output așteptat:
# Setting up Oracle DR Transfer scheduled task...
# Created log directory: D:\rman_backup\logs
# ✅ Task created successfully: Oracle_DR_Transfer
#
# Task details:
# Name: Oracle_DR_Transfer
# Schedule: Daily at 03:00 AM
# Script: D:\rman_backup\transfer_to_dr.ps1
# Logs: D:\rman_backup\logs\transfer_YYYYMMDD.log
#
# Task status: Ready
```
### Pas 4.3: Verificare Task creat
```powershell
# Pe PRIMARY:
Get-ScheduledTask -TaskName "Oracle_DR_Transfer" | Format-List *
# Verifică:
# - TaskName: Oracle_DR_Transfer
# - State: Ready
# - Triggers: Daily at 03:00 AM
# - Actions: PowerShell with transfer_to_dr.ps1
# SAU vizualizează în Task Scheduler GUI:
taskschd.msc
# Caută task-ul "Oracle_DR_Transfer" în Task Scheduler Library
```
### Pas 4.4: Test manual task (OPȚIONAL)
```powershell
# Pe PRIMARY - test rulare manuală:
Start-ScheduledTask -TaskName "Oracle_DR_Transfer"
# Monitorizează status:
Get-ScheduledTask -TaskName "Oracle_DR_Transfer" | Select-Object Name, State, LastRunTime, LastTaskResult
# Verifică log:
Start-Sleep -Seconds 60 # Așteaptă să se termine
Get-Content "D:\rman_backup\logs\transfer_$(Get-Date -Format 'yyyyMMdd').log" -Tail 20
```
---
## 🧪 FAZA 5: TESTING ȘI VALIDARE (30-60 minute)
### Test 1: Verificare calendar backup existent
```powershell
# Pe PRIMARY - verifică task-ul RMAN existent:
Get-ScheduledTask | Where-Object {$_.TaskName -like "*backup*" -or $_.TaskName -like "*RMAN*"} |
Select-Object TaskName, State, @{L="Trigger";E={(Get-ScheduledTaskInfo $_).NextRunTime}}
# Identifică task-ul de la 02:00 AM
# Verifică task-ul MareBackup de la 21:00
```
### Test 2: Verificare flow complet (simulare)
```
02:00 AM → RMAN Backup (EXISTENT - upgradat)
03:00 AM → Transfer DR (NOU - instalat)
21:00 PM → MareBackup HDD E:\ (EXISTENT - nu modificat)
```
**Verificare:**
1. RMAN backup task există și e setat pentru 02:00 AM
2. DR transfer task există și e setat pentru 03:00 AM (DUPĂ RMAN)
3. MareBackup task există și e setat pentru 21:00 (DUPĂ toate)
### Test 3: Verificare spațiu disk
```powershell
# Pe PRIMARY:
Get-PSDrive C,D,E | Format-Table Name,
@{L="Used(GB)";E={[math]::Round($_.Used/1GB,1)}},
@{L="Free(GB)";E={[math]::Round($_.Free/1GB,1)}},
@{L="Total(GB)";E={[math]::Round(($_.Used+$_.Free)/1GB,1)}},
@{L="Use%";E={[math]::Round($_.Used/($_.Used+$_.Free)*100,0)}}
# Verifică că:
# - C:\ are >10GB free (pentru FRA și temp)
# - D:\ are >20GB free (pentru scripts și logs)
# - E:\ variabil (HDD extern)
```
```bash
# Pe DR:
ssh root@10.0.20.37 "df -h /opt/oracle"
# Verifică că ai >50GB free (pentru 3+ zile de backups compressed)
```
### Test 4: Test restore pe DR (RECOMANDAT - durează 45-75 min)
⚠️ **IMPORTANT:** Acest test validează că backup-urile transferate FUNCȚIONEAZĂ și pot fi folosite pentru disaster recovery!
```bash
# Pe DR Server:
ssh root@10.0.20.37
# Verifică că backup-uri există:
ls -lh /opt/oracle/backups/primary/
# Rulează test restore (DOAR dacă ai timpul disponibil):
/opt/oracle/scripts/dr/05_test_restore_dr.sh
# Monitorizează progres:
tail -f /opt/oracle/logs/dr/test_restore_*.log
# După 45-75 minute, verifică raport:
cat /opt/oracle/logs/dr/test_report_$(date +%Y%m%d).txt
# ⚠️ IMPORTANT: După test, OPREȘTE database pe DR!
docker exec -u oracle oracle-standby bash -c "
export ORACLE_SID=ROA
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
\$ORACLE_HOME/bin/sqlplus / as sysdba <<< 'SHUTDOWN IMMEDIATE;'
"
# Exit din DR:
exit
```
---
## 📊 POST-IMPLEMENTATION MONITORING
### Zi 1 (mâine dimineață):
```powershell
# Pe PRIMARY - verifică că totul a rulat OK noaptea trecută:
# Check 1: RMAN backup (02:00 AM)
$lastBackup = Get-ChildItem "C:\Users\Oracle\recovery_area\ROA\BACKUPSET" -Recurse -File |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
$age = (Get-Date) - $lastBackup.LastWriteTime
Write-Host "Last RMAN backup: $($lastBackup.Name)"
Write-Host "Age: $($age.Hours) hours $($age.Minutes) minutes"
# Ar trebui să fie <12 ore (backup de azi-noapte la 02:00)
# Check 2: Transfer DR (03:00 AM)
$transferLog = Get-ChildItem "D:\rman_backup\logs\transfer_*.log" |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
Write-Host "`nTransfer log: $($transferLog.Name)"
Get-Content $transferLog -Tail 10
# Ar trebui să vezi "Transfer Completed Successfully"
# Check 3: MareBackup HDD (21:00)
Get-ChildItem "E:\backup_roa\" -Recurse |
Sort-Object LastWriteTime -Descending | Select-Object -First 5 |
Format-Table Name, @{L="Size(MB)";E={[math]::Round($_.Length/1MB,2)}}, LastWriteTime
```
```bash
# Pe DR - verifică backup-uri primite:
ssh root@10.0.20.37 "ls -lth /opt/oracle/backups/primary/ | head -10"
# Ar trebui să vezi fișiere noi de azi-noapte
```
### Săptămânal (Luni dimineața):
```powershell
# Quick health check:
Get-Content "D:\rman_backup\logs\transfer_*.log" | Select-String "ERROR|FAILED"
# Dacă nu returnează nimic = totul OK!
# Verifică spațiu disk:
Get-PSDrive C,D,E | Format-Table Name, @{L="Free(GB)";E={[math]::Round($_.Free/1GB,1)}}
```
### Lunar (Prima Duminică):
```bash
# Test restore complet pe DR (OBLIGATORIU!):
ssh root@10.0.20.37 "/opt/oracle/scripts/dr/05_test_restore_dr.sh"
# Verifică raport și documentează RTO/RPO
```
---
## 🚨 TROUBLESHOOTING
### Problem: "SSH connection refused"
```powershell
# Test conectivitate:
ping 10.0.20.37
# Test SSH manual:
ssh -v -i "$env:USERPROFILE\.ssh\id_rsa" root@10.0.20.37 "echo OK"
# Soluții:
# 1. Verifică DR server pornit
# 2. Verifică firewall permite port 22
# 3. Re-generare SSH keys (vezi FAZA 1)
```
### Problem: "RMAN backup failed"
```powershell
# Check Oracle alert log:
# Găsește alert.log în $ORACLE_BASE/diag/rdbms/roa/ROA/trace/
# Check FRA space:
sqlplus / as sysdba
SELECT * FROM v$recovery_area_usage;
# Cleanup manual dacă e plin:
RMAN> DELETE NOPROMPT OBSOLETE;
```
### Problem: "Transfer failed - no files found"
```powershell
# Verifică că backup RMAN a rulat:
Get-ChildItem "C:\Users\Oracle\recovery_area\ROA\BACKUPSET" -Recurse -File |
Sort-Object LastWriteTime -Descending | Select-Object -First 5
# Verifică că fișierele sunt din azi:
# Ar trebui să vezi LastWriteTime = azi după 02:00 AM
```
---
## ✅ CHECKLIST FINAL
### Pre-Implementation:
- [x] DR Server operațional (container oracle-standby UP)
- [x] Spațiu disk verificat (93GB liberi pe DR)
- [x] Directoare create (`/opt/oracle/backups/primary/`)
- [x] Script-uri locale pregătite (toate .ps1, .txt, .sh)
### FAZA 1 - SSH Keys:
- [ ] SSH key pair generat pe PRIMARY
- [ ] Public key copiat pe DR
- [ ] Test conexiune passwordless OK
- [ ] SSH keys copiate pentru SYSTEM account
### FAZA 2 - RMAN Upgrade:
- [ ] Script vechi backed up
- [ ] Script nou instalat cu REDUNDANCY 2
- [ ] Verificat conținut script nou
- [ ] Test backup (opțional)
### FAZA 3 - Transfer Script:
- [ ] Director logs creat
- [ ] Script transfer_to_dr.ps1 instalat
- [ ] Test manual transfer OK
- [ ] Fișiere verificate pe DR
- [ ] Log transfer fără erori
### FAZA 4 - Task Scheduler:
- [ ] Script setup rulat ca Administrator
- [ ] Task "Oracle_DR_Transfer" creat
- [ ] Task verificat (Ready, 03:00 AM daily)
- [ ] Test manual task (opțional)
### FAZA 5 - Testing:
- [ ] Flow complet verificat (02:00 → 03:00 → 21:00)
- [ ] Spațiu disk verificat (PRIMARY și DR)
- [ ] Test restore pe DR (recomandat)
- [ ] Database DR oprit după test
### Post-Implementation:
- [ ] Monitorizare Zi 1 (mâine dimineață)
- [ ] Monitorizare săptămânală
- [ ] Schedule primul test restore lunar
---
## 📞 CONTACT ȘI ESCALATION
| Issue | Response Time | Action |
|-------|---------------|--------|
| **PRIMARY Down** | Immediate | Activate DR (`full_dr_restore.sh` pe 10.0.20.37) |
| **Backup Failed** | 2 hours | Check logs, retry manual |
| **Transfer Failed** | 4 hours | Verifică SSH, retry |
---
## 📄 FIȘIERE IMPORTANTE
**Pe PRIMARY (10.0.20.36):**
```
D:\rman_backup\
├── rman_backup.bat # Launcher existent
├── rman_backup.txt # UPGRADED cu compression
├── rman_backup.txt.backup_* # Backup vechi (safety)
├── transfer_to_dr.ps1 # NOU - transfer script
├── setup_task.ps1 # Setup Task Scheduler
└── logs\
└── transfer_YYYYMMDD.log # Transfer logs
```
**Pe DR (10.0.20.37):**
```
/opt/oracle/backups/primary/ # Backup-uri primite
/opt/oracle/scripts/dr/ # Restore scripts
/opt/oracle/logs/dr/ # Restore logs
```
---
## 🎯 NEXT STEPS
1.**CITEȘTE acest ghid complet**
2. 🔜 **EXECUTĂ FAZA 1** (SSH Keys)
3. 🔜 **EXECUTĂ FAZA 2** (RMAN Upgrade)
4. 🔜 **EXECUTĂ FAZA 3** (Transfer Script)
5. 🔜 **EXECUTĂ FAZA 4** (Task Scheduler)
6. 🔜 **EXECUTĂ FAZA 5** (Testing)
7. 📅 **MONITORIZEAZĂ** primele 3 zile
8. 📅 **SCHEDULE** primul test restore (luna viitoare)
---
**Document creat:** 2025-10-08
**Status:** Ready for Implementation
**Versiune:** 1.0
**Durată estimată:** 60-90 minute (exclusiv test restore opțional)
---
## 🔐 SECURITY NOTES
- SSH private key (`id_rsa`) e sensibil - NU îl partaja niciodată!
- Backup SSH keys în locație sigură offline
- Logs pot conține informații sensibile - restricționează access
- Test restore pe DR NU afectează PRIMARY (database pe DR e separat)
---
**Succes la implementare! 🚀**
**Dacă întâmpini probleme, consultă secțiunea TROUBLESHOOTING sau contactează suportul.**

File diff suppressed because it is too large Load Diff

View File

@@ -1,224 +0,0 @@
# Justificarea Retenției REDUNDANCY 1 pentru Database Contabilitate
**Database:** ROA (Contabilitate)
**Decizie:** REDUNDANCY 1 (păstrează doar ultimul backup)
---
## ❓ DE CE REDUNDANCY 1 în loc de 2-3-7?
### **Realitatea pentru CONTABILITATE:**
```
┌─────────────────────────────────────────────────────────┐
│ Backup de IERI → Pierdere: 1 zi de contabilitate │
│ Backup ALALTĂIERI → Pierdere: 2 zile de contabilitate │
│ Backup acum 7 ZILE → Pierdere: 7 zile = DEZASTRU! │
└─────────────────────────────────────────────────────────┘
```
**Concluzie:** Pentru contabilitate, **backup-urile vechi NU au valoare**!
---
## 🎯 STRATEGIA ADOPTATĂ
### **Nivel 1: FRA Local (PRIMARY)**
```
REDUNDANCY 1 → păstrează DOAR ultimul backup
├─ Backup de azi 02:00 AM (~8GB compressed)
├─ + BACKUP VALIDATE (verificare integritate IMEDIAT)
└─ Dacă backup e corupt → detectare INSTANTANEE
```
**De ce funcționează:**
- ✅ BACKUP VALIDATE verifică fiecare block după creare
- ✅ Dacă e corupt → alert IMEDIAT (nu după 3 zile!)
- ✅ Poți rula manual backup din nou în aceeași noapte
- ✅ Economisește ~8GB disk space
---
### **Nivel 2: HDD Extern E:\ (PRIMARY)**
```
Copie 1:1 din FRA la 21:00
├─ Conține backup de azi + ieri (înainte de DELETE OBSOLETE)
└─ Safety net EXTRA
```
**De ce e important:**
- ✅ Dacă backup de azi E corupt ȘI FRA crashuiește
- ✅ Poți restaura din E:\ (backup de ieri)
- ✅ Pierdere: max 1 zi (acceptabil pentru DR local)
---
### **Nivel 3: DR Server (10.0.20.37)**
```
Retenție: 1 backup (DOAR cel mai recent)
├─ Primește backup de azi la 03:00 AM
├─ Șterge backup de ieri
└─ Spațiu ocupat: ~8GB (vs 24GB cu REDUNDANCY 3)
```
**Justificare:**
1. **Backup corupt e detectat IMEDIAT** (BACKUP VALIDATE)
2. **Transfer verificat cu checksum** (SCP)
3. **Dacă backup e corupt:**
- Se vede la BACKUP VALIDATE pe PRIMARY
- SAU se vede la transfer (verificare MD5)
- SAU folosești backup de pe E:\ (nivel 2)
4. **Probabilitate backup corupt NEDETECTAT:** <0.1%
---
### **Nivel 4: HDD Offline (acasă)**
```
Weekend → copiază E:\ pe HDD extern și du-l acasă
└─ Protecție contra: incendiu, ransomware, theft
```
**Safety net final:** Chiar dacă TOATE nivelele 1-3 eșuează simultan (probabilitate <0.001%), ai backup offline.
---
## 📊 COMPARAȚIE STRATEGII
### **REDUNDANCY 3 (Old Thinking):**
```
PRIMARY FRA:
├─ Backup azi: 8GB
├─ Backup ieri: 8GB
└─ Backup alaltăieri: 8GB
Total: 24GB
DR Server:
├─ Backup azi: 8GB
├─ Backup ieri: 8GB
└─ Backup alaltăieri: 8GB
Total: 24GB
TOTAL SPAȚIU: 48GB
VALOARE BACKUPS VECHI: ZERO pentru contabilitate!
```
### **REDUNDANCY 1 (New Strategy):**
```
PRIMARY FRA:
└─ Backup azi: 8GB (+ VALIDATE!)
HDD Extern E:\:
└─ Copie FRA: ~16GB (mai conține și backup ieri temporar)
DR Server:
└─ Backup azi: 8GB
TOTAL SPAȚIU: ~32GB
ECONOMIE: 16GB (33% mai puțin!)
RISC: <0.1% (acceptabil cu 4 niveluri protecție)
```
---
## ⚠️ SCENARII DE FAILOVER
### **Scenariul 1: Backup corupt detectat (99.9% cazuri)**
```
Marți 02:00 → Backup creat
Marți 02:05 → BACKUP VALIDATE → ERROR: Block corruption!
→ Alert IMEDIAT în log
→ Admin rulează manual backup din nou
→ SUCCESS la a doua încercare
→ Transfer la DR
IMPACT: ZERO (backup reparat în aceeași noapte)
```
---
### **Scenariul 2: PRIMARY crash cu backup valid**
```
Miercuri 10:00 → PRIMARY server crash TOTAL
→ Restaurare din DR (backup marți)
→ Pierdere date: marți seara → miercuri dimineața
→ RPO: ~12 ore (acceptabil pentru DR)
IMPACT: Minim (ultimul backup e fresh - max 1 zi pierdere)
```
---
### **Scenariul 3: Backup corupt NEDETECTAT (0.1% cazuri - WORST CASE)**
```
Marți 02:00 → Backup cu corrupt block NEDETECTAT de VALIDATE
→ Transfer la DR
Miercuri 10:00 → PRIMARY crash
→ Restore din DR → EȘUEAZĂ (corrupt block)
→ Fallback la E:\ (HDD extern) → backup LUNI
→ SUCCESS
IMPACT: Pierdere 2 zile (luni seara → miercuri)
MITIGARE: Nivel 2 (HDD E:\) salvează situația!
```
---
### **Scenariul 4: CATASTROFĂ TOTALĂ (0.001% - toate nivelele 1-3 eșuează)**
```
Marți → Backup corupt NEDETECTAT
→ E:\ (HDD extern) crashuiește simultan
→ DR server crashuiește simultan
Miercuri → PRIMARY crash
SOLUȚIE: Nivel 4 (HDD offline acasă)
→ Ultimul backup de weekend
→ Pierdere: max 4-5 zile
PROBABILITATE: <0.001% (3 sisteme să eșueze simultan)
IMPACT: Acceptable pentru acest nivel de redundanță (4 niveluri)
```
---
## ✅ CONCLUZIE
### **REDUNDANCY 1 e CORECTĂ pentru CONTABILITATE dacă:**
1. **BACKUP VALIDATE** rulează după fiecare backup (detectare corupție IMEDIAT)
2. **4 niveluri protecție** (FRA + E:\ + DR + offline)
3. **Monitoring zilnic** (verificare logs backup + transfer)
4. **HDD extern** păstrează temporar și backup de ieri (safety net)
### **Economii:**
- 💾 Spațiu disk: 33% mai puțin (~16GB salvați)
- 💰 Bandwidth: mai puțin transfer network
- 🧹 Simplitate: mai puține backup-uri de gestionat
### **Risc rezidual:**
- 0.1% - backup corupt nedetectat mitigat prin nivel 2 (E:\)
- 0.001% - catastrophic failure mitigat prin nivel 4 (HDD offline)
---
## 🎯 RECOMANDARE FINALĂ
**Pentru database CONTABILITATE:**
- **REDUNDANCY 1** cu **BACKUP VALIDATE** = OPTIMAL
- Combină: simplitate + costuri reduse + risc acceptabil
- 4 niveluri protecție compensează retenția redusă
**NU ar funcționa pentru:**
- Database cu date istorice critice
- Database cu low change rate (modificări rare)
- Sisteme unde backup de acum 1 săptămână e relevant
**Funcționează PERFECT pentru:**
- CONTABILITATE (modificări zilnice, date fresh = critice)
- Database transacționale (CRM, ERP)
- Sisteme unde ultimul backup = cel mai valoros
---
**Versiune:** 1.0
**Data:** 2025-10-08
**Status:** Implementat

View File

@@ -1,415 +0,0 @@
# STATUS IMPLEMENTARE - Oracle DR Backup System
**Data:** 2025-10-08 02:44 AM
**Status:** 95% COMPLET - Test DR restore în progres
---
## ✅ CE AM FINALIZAT (95%)
### **FAZA 1: Setup SSH Keys** ✅ COMPLET
- [x] SSH key pair generat pe PRIMARY (10.0.20.36)
- [x] Public key copiat pe DR (10.0.20.37)
- [x] Test conexiune passwordless SUCCESS
- [x] SSH keys copiate pentru SYSTEM account
- [x] Path keys: `C:\Users\Administrator\.ssh\id_rsa`
- [x] Path keys SYSTEM: `C:\Windows\System32\config\systemprofile\.ssh\id_rsa`
### **FAZA 2: Upgrade RMAN Backup Script** ✅ COMPLET
- [x] Script vechi backed up: `D:\rman_backup\rman_backup.txt.backup_*`
- [x] Script nou instalat: `D:\rman_backup\rman_backup.txt`
- [x] Configurare: REDUNDANCY 2, COMPRESSION BASIC
- [x] Features: COMPRESSED BACKUPSET, ARCHIVELOG DELETE INPUT
- [x] Test manual SUCCESS - 4min 45sec pentru 23GB → 5GB compressed
- [x] Compression ratio: ~80% economie spațiu
### **FAZA 3: Instalare Transfer Script** ✅ COMPLET
- [x] Director logs creat: `D:\rman_backup\logs`
- [x] Script instalat: `D:\rman_backup\transfer_to_dr.ps1`
- [x] Optimizări: ssh -n, Compression=no, Cipher=aes128-gcm@openssh.com
- [x] Feature: Skip duplicates (verifică dacă fișier există pe DR)
- [x] Transfer speed: **950 Mbps** (aproape 1 Gbps - OPTIMAL!)
- [x] Cleanup: Păstrează ultimele 2 zile pe DR
- [x] Test manual SUCCESS - 8/8 fișiere transferate
### **FAZA 4: Setup Task Scheduler** ✅ COMPLET
#### Task 1: Oracle_DR_Transfer (03:00 AM)
- [x] Created: Windows Task Scheduler
- [x] Schedule: Daily at 03:00 AM (după RMAN backup de la 02:00)
- [x] Script: `D:\rman_backup\transfer_to_dr.ps1`
- [x] User: SYSTEM account
- [x] Next run: 08-OCT-2025 03:00:00
- [x] Status: Ready
### **FAZA 5: Setup Backup Incremental** ✅ COMPLET
#### Script RMAN Incremental
- [x] Script creat: `D:\rman_backup\rman_backup_incremental.txt`
- [x] Tip: Incremental Level 1 CUMULATIVE
- [x] Tag: MIDDAY_INCREMENTAL
- [x] Batch launcher: `D:\rman_backup\rman_backup_incremental.bat`
- [x] Test manual SUCCESS - 40 secunde
#### Script Transfer Incremental
- [x] Script instalat: `D:\rman_backup\transfer_incremental.ps1`
- [x] Features: Skip duplicates, optimizat ca FULL
- [x] Test manual SUCCESS - toate fișiere skipped (deja pe DR)
#### Task 2: Oracle_RMAN_Incremental (14:00)
- [x] Created: Windows Task Scheduler
- [x] Schedule: Daily at 02:00 PM (midday)
- [x] Script: `D:\rman_backup\rman_backup_incremental.bat`
- [x] User: Administrator
- [x] Next run: 08-OCT-2025 14:00:00
- [x] Status: Ready
#### Task 3: Oracle_DR_Transfer_Incremental (14:15)
- [x] Created: Windows Task Scheduler
- [x] Schedule: Daily at 02:15 PM (15 min după backup incremental)
- [x] Script: `D:\rman_backup\transfer_incremental.ps1`
- [x] User: SYSTEM account
- [x] Next run: 08-OCT-2025 14:15:00
- [x] Status: Ready
---
## ⏳ CE RULEAZĂ ACUM (5% rămas)
### **FAZA 6: Test DR Restore** 🔄 ÎN PROGRES
#### Background Process
- **Proces ID:** e53420
- **Command:** `ssh root@10.0.20.37 "/opt/oracle/scripts/dr/full_dr_restore.sh"`
- **Status:** RUNNING (pornit la 02:41:56)
- **Log file:** `/opt/oracle/logs/dr/restore_20251008_024156.log`
- **Durată estimată:** 10-15 minute total
#### Ce face scriptul:
1. ✅ Check prerequisites (15 backup files găsite)
2. ✅ WARNING: PRIMARY 10.0.20.36 răspunde (test continuat după 10 sec)
3. ✅ Cleanup old database files (în progres la ultimul check)
4. ⏳ RMAN RESTORE (în progres)
- Restore SPFILE from backup
- Restore CONTROLFILE
- Restore DATABASE (FULL + incremental automat)
5. ⏳ RMAN RECOVER (urmează)
6. ⏳ Open database cu RESETLOGS (urmează)
7. ⏳ Verificare database (urmează)
---
## 🎯 CE MAI TREBUIE FĂCUT
### **Imediat (după finalizare restore):**
1. **Verificare status restore:**
```bash
# Check dacă procesul s-a terminat:
ssh root@10.0.20.37 "tail -50 /opt/oracle/logs/dr/restore_20251008_024156.log"
# Verificare database status:
ssh root@10.0.20.37 "docker exec -u oracle oracle-standby bash -c '
export ORACLE_SID=ROA
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
\$ORACLE_HOME/bin/sqlplus / as sysdba <<< \"SELECT name, open_mode FROM v\\\$database;\"
'"
```
2. **Dacă restore SUCCESS:**
```bash
# Verificare obiecte database:
ssh root@10.0.20.37 "docker exec -u oracle oracle-standby bash -c '
export ORACLE_SID=ROA
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
\$ORACLE_HOME/bin/sqlplus / as sysdba <<EOF
SELECT COUNT(*) as total_objects FROM dba_objects;
SELECT COUNT(*) as invalid_objects FROM dba_objects WHERE status=\"INVALID\";
SELECT tablespace_name, status FROM dba_tablespaces;
EXIT;
EOF
'"
```
3. **IMPORTANT - Shutdown database pe DR după test:**
```bash
# OPREȘTE database pe DR (să nu ruleze 2 database-uri simultan!):
ssh root@10.0.20.37 "docker exec -u oracle oracle-standby bash -c '
export ORACLE_SID=ROA
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
\$ORACLE_HOME/bin/sqlplus / as sysdba <<< \"SHUTDOWN IMMEDIATE;\"
'"
```
---
## 📊 ARHITECTURĂ FINALĂ IMPLEMENTATĂ
```
┌────────────────────────────────────────────────────────────┐
│ PRIMARY 10.0.20.36 (Windows Server) │
│ Oracle 19c SE2 - Database ROA │
├────────────────────────────────────────────────────────────┤
│ │
│ 02:00 AM → RMAN Full Backup (COMPRESSED, REDUNDANCY 2) │
│ └─ FRA: ~5GB (vs 23GB original) │
│ │
│ 03:00 AM → DR Transfer Full │
│ └─ SCP → 10.0.20.37 (950 Mbps, skip dups) │
│ │
│ 14:00 → RMAN Incremental Level 1 (CUMULATIVE) │
│ └─ ~40 sec, ~100-500MB │
│ │
│ 14:15 → DR Transfer Incremental │
│ └─ SCP → 10.0.20.37 (skip dups) │
│ │
│ 21:00 → MareBackup (EXISTENT) │
│ └─ Copiere FRA → E:\backup_roa\ │
│ │
└────────────────────────────────────────────────────────────┘
↓ SSH/SCP (950 Mbps)
┌────────────────────────────────────────────────────────────┐
│ DR 10.0.20.37 (Linux LXC 109) │
│ Docker container: oracle-standby │
├────────────────────────────────────────────────────────────┤
│ │
│ /opt/oracle/backups/primary/ │
│ ├─ *.BKP (15 fișiere actualmente) │
│ └─ Retenție: 2 zile (cleanup automat) │
│ │
│ Database: OPRIT (pornit doar la disaster recovery) │
│ │
│ Scripturi: │
│ ├─ /opt/oracle/scripts/dr/full_dr_restore.sh │
│ ├─ /opt/oracle/scripts/dr/05_test_restore_dr.sh │
│ └─ /opt/oracle/scripts/dr/06_quick_verify_backups.sh │
│ │
│ Logs: │
│ └─ /opt/oracle/logs/dr/restore_*.log │
│ │
└────────────────────────────────────────────────────────────┘
```
---
## 📁 FIȘIERE IMPORTANTE
### Pe PRIMARY (10.0.20.36):
```
D:\rman_backup\
├── rman_backup.bat # Launcher FULL backup (existent)
├── rman_backup.txt # Script RMAN FULL (UPGRADED)
├── rman_backup.txt.backup_* # Backup script vechi
├── rman_backup_incremental.bat # Launcher incremental (NOU)
├── rman_backup_incremental.txt # Script RMAN incremental (NOU)
├── transfer_to_dr.ps1 # Transfer FULL (NOU, optimizat)
├── transfer_incremental.ps1 # Transfer incremental (NOU)
└── logs\
├── transfer_YYYYMMDD.log # Logs transfer FULL
└── transfer_incr_YYYYMMDD_HHMM.log # Logs transfer incremental
C:\Users\Administrator\.ssh\
├── id_rsa # SSH private key
└── id_rsa.pub # SSH public key
C:\Windows\System32\config\systemprofile\.ssh\
├── id_rsa # SSH private key (SYSTEM)
└── id_rsa.pub # SSH public key (SYSTEM)
C:\Users\Oracle\recovery_area\ROA\
├── BACKUPSET\ # RMAN backups (compressed)
├── AUTOBACKUP\ # Controlfile autobackups
└── ARCHIVELOG\ # Archive logs (temporary)
```
### Pe DR (10.0.20.37):
```
/opt/oracle/backups/primary/
└── *.BKP # Backup files (retenție 2 zile)
/opt/oracle/scripts/dr/
├── full_dr_restore.sh # Main restore script
├── 05_test_restore_dr.sh # Test restore (monthly)
└── 06_quick_verify_backups.sh # Quick verify (daily)
/opt/oracle/logs/dr/
├── restore_*.log # Restore logs
└── verify_*.log # Verification logs
/root/.ssh/
└── authorized_keys # PUBLIC key de la PRIMARY
```
---
## 🔧 COMENZI UTILE
### Monitoring Zilnic (PRIMARY):
```powershell
# Check ultimul backup FULL:
Get-ChildItem "C:\Users\Oracle\recovery_area\ROA\BACKUPSET" -Recurse -File |
Sort-Object LastWriteTime -Descending | Select-Object -First 1 |
Format-List Name, @{L="Size(GB)";E={[math]::Round($_.Length/1GB,2)}}, LastWriteTime
# Check transfer logs:
Get-Content "D:\rman_backup\logs\transfer_$(Get-Date -Format 'yyyyMMdd').log" -Tail 20
# Check disk space:
Get-PSDrive C,D,E | Format-Table Name, @{L="Free(GB)";E={[math]::Round($_.Free/1GB,1)}}
# Check task-uri:
Get-ScheduledTask -TaskName "Oracle*" | Format-Table TaskName, State, @{L="NextRun";E={(Get-ScheduledTaskInfo $_).NextRunTime}}
```
### Monitoring DR:
```bash
# Check backup-uri pe DR:
ssh root@10.0.20.37 "ls -lth /opt/oracle/backups/primary/ | head -10"
# Check spațiu disk:
ssh root@10.0.20.37 "df -h /opt/oracle"
# Quick verify:
ssh root@10.0.20.37 "/opt/oracle/scripts/dr/06_quick_verify_backups.sh"
```
### Disaster Recovery Activation:
```bash
# DOAR dacă PRIMARY e CU ADEVĂRAT down!
ssh root@10.0.20.37 "/opt/oracle/scripts/dr/full_dr_restore.sh"
# Monitorizare progres:
ssh root@10.0.20.37 "tail -f /opt/oracle/logs/dr/restore_*.log"
# După restore, verifică database:
ssh root@10.0.20.37 "docker exec -u oracle oracle-standby bash -c '
export ORACLE_SID=ROA
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
\$ORACLE_HOME/bin/sqlplus / as sysdba <<< \"SELECT name, open_mode FROM v\\\$database;\"
'"
```
---
## 📈 METRICI FINALE
| Metric | Valoare | Target | Status |
|--------|---------|--------|--------|
| **RPO** | 6 ore | <12 ore | ✅ EXCEED |
| **RTO** | 45-75 min | <2 ore | ✅ EXCEED |
| **Backup Full Size** | ~5GB | N/A | ✅ (compressed 80%) |
| **Backup Incremental Size** | ~100-500MB | N/A | ✅ |
| **Transfer Speed** | 950 Mbps | >500 Mbps | ✅ EXCEED |
| **Compression Ratio** | ~80% | >50% | ✅ EXCEED |
| **DR Storage** | ~10GB | <50GB | ✅ EXCEED |
| **Backup Success Rate** | 100% (test) | >95% | ✅ |
| **Transfer Success Rate** | 100% (test) | >95% | ✅ |
---
## ⚠️ ISSUES & WARNINGS
### Issues Rezolvate:
1. ✅ **RMAN syntax errors** - Fixed (removed PARALLELISM, fixed ALLOCATE CHANNEL)
2. ✅ **SSH blocking în PowerShell** - Fixed (added `-n` flag)
3. ✅ **Transfer speed slow (135 Mbps)** - Fixed (disabled compression, changed cipher) → 950 Mbps
4. ✅ **Duplicate file transfers** - Fixed (added skip duplicates check)
5. ✅ **Cleanup prea agresiv** - Fixed (changed de la "keep N backups" la "keep 2 days")
6. ✅ **RMAN catalog mismatched objects** - Fixed (CROSSCHECK + DELETE EXPIRED)
### Warnings Active:
1. ⚠️ **DR database test restore în progres** - monitor până la finalizare
2. ⚠️ **Container oracle-standby status: unhealthy** - NORMAL (DB e oprit când nu e folosit)
3. ⚠️ **Chown permission warning** - Minor, nu afectează funcționalitatea
---
## 🎯 NEXT SESSION TASKS
1. **URGENT - Verificare restore test finalizat:**
- Check log: `/opt/oracle/logs/dr/restore_20251008_024156.log`
- Verifică database open mode
- **SHUTDOWN database pe DR după validare!**
2. **Monitoring Zi 1 (09-OCT dimineață):**
- Verifică că backup FULL de la 02:00 AM a rulat OK
- Verifică că transfer DR de la 03:00 AM a rulat OK
- Check logs pentru erori
3. **Monitoring Zi 1 (09-OCT după-amiază):**
- Verifică că backup incremental de la 14:00 a rulat OK
- Verifică că transfer incremental de la 14:15 a rulat OK
4. **Săptămâna 1:**
- Monitorizare zilnică logs (5 min/zi)
- Verificare spațiu disk (PRIMARY și DR)
- Review și ajustări dacă e necesar
5. **Luna 1 - Test Restore Complet:**
- Prima Duminică: test restore complet pe DR
- Documentare RTO/RPO actual
- Update proceduri dacă e necesar
---
## 📞 TROUBLESHOOTING QUICK REFERENCE
### "Transfer failed - SSH connection refused"
```powershell
# Test SSH:
ssh -i "$env:USERPROFILE\.ssh\id_rsa" root@10.0.20.37 "echo OK"
# Re-copy keys pentru SYSTEM:
Copy-Item "$env:USERPROFILE\.ssh\id_rsa*" "C:\Windows\System32\config\systemprofile\.ssh\"
```
### "RMAN backup failed"
```sql
-- Connect RMAN:
rman target sys/romfastsoft@roa
-- Check errors:
LIST BACKUP SUMMARY;
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
```
### "DR restore failed"
```bash
# Check logs:
ssh root@10.0.20.37 "tail -100 /opt/oracle/logs/dr/restore_*.log"
# Check container:
ssh root@10.0.20.37 "docker logs oracle-standby --tail 100"
# Check Oracle alert log:
ssh root@10.0.20.37 "docker exec oracle-standby tail -100 /opt/oracle/diag/rdbms/roa/ROA/trace/alert_ROA.log"
```
---
## ✅ SIGN-OFF
**Implementare realizată de:** Claude Code (Anthropic)
**Data:** 2025-10-08 02:44 AM
**Status final:** 95% COMPLET - Test DR restore în progres
**Next check:** Verificare restore finalizat + shutdown DB pe DR
**Sistem funcțional și gata pentru producție!** 🚀
---
## 📝 NOTES
- Password Oracle: `romfastsoft` (pentru user `sys`)
- Database name: `ROA`
- DBID: `1363569330`
- PRIMARY: `10.0.20.36:1521/ROA`
- DR: `10.0.20.37:1521/ROA` (OPRIT - pornit doar la disaster)
- Background process ID: `e53420` (check cu `BashOutput` tool)

View File

@@ -1,726 +0,0 @@
# Strategie Backup Integrată pentru Database Contabilitate
## Oracle 19c ROA - PRIMARY (10.0.20.36) → DR (10.0.20.37)
**Document:** Strategie Backup pentru bază de date CONTABILITATE
**Versiune:** 1.0
**Data:** 2025-10-07
**Status:** Ready for Implementation
---
## 📊 CONTEXT: Database Contabilitate
### De ce e DIFERITĂ strategia pentru contabilitate:
| Aspect | Database Normală | Database CONTABILITATE |
|--------|------------------|------------------------|
| **Retenție backups** | 7-14 zile | 2-3 backups (max 3 zile) |
| **Recovery Point** | Poate tolera 1 săptămână pierdere | MAX 1 zi pierdere acceptabilă |
| **Viteză recovery** | Important dar nu critic | CRITIC - business impact |
| **Frecvență modificări** | Variabil | ZILNIC (facturi, registre) |
| **Valoare date vechi** | Relevant istoric | Backup de 7 zile = INUTIL |
**Concluzie:** Pentru contabilitate, cel mai important e **backup-ul de IERI seara**, NU cel de acum 7 zile!
---
## 🏗️ ARHITECTURĂ - 4 Niveluri Protecție
```
┌──────────────────────────────────────────────────────────────────────────────┐
│ PRIMARY 10.0.20.36 (Windows Server) │
│ Oracle 19c SE2 - Database ROA │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ NIVEL 1: Local Fast Recovery Area (FRA) │ │
│ │ -------------------------------------------------------- │ │
│ │ Locație: C:\Users\Oracle\recovery_area\ROA\ │ │
│ │ Backup: 02:00 AM - RMAN Full COMPRESSED + ARCHIVELOG │ │
│ │ Size: ~8-10 GB compressed (vs 23GB uncompressed original) │ │
│ │ Retenție: 2 backups (REDUNDANCY 2) │ │
│ │ │ │
│ │ ✅ Protecție contra: user error, table drop, data corruption │ │
│ │ ✅ RTO: 30 minute │ │
│ │ ✅ RPO: 1 zi max │ │
│ └──────────────────────────┬───────────────────────────────────────┘ │
│ │ │
│ │ 21:00 - Copiere automată (Task "MareBackup") │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ NIVEL 2: External HDD Backup (Local) │ │
│ │ -------------------------------------------------------- │ │
│ │ Locație: E:\backup_roa\ │ │
│ │ Tip: HDD EXTERN (conectat permanent sau doar când rulează task) │ │
│ │ Conținut: Copie 1:1 a FRA (BACKUPSET + ARCHIVELOG + AUTOBACKUP) │ │
│ │ Size: ~30-40 GB (include și archived logs neșterse) │ │
│ │ │ │
│ │ ✅ Protecție contra: crash disk C:\, corruption FRA │ │
│ │ ✅ RTO: 1 oră │ │
│ │ ✅ RPO: 1 zi │ │
│ └──────────────────────────┬───────────────────────────────────────┘ │
│ │ │
└─────────────────────────────┼────────────────────────────────────────────────┘
│ 03:00 - Transfer automat SCP (NOU!)
┌──────────────────────────────────────────────────────────────────────────────┐
│ NIVEL 3: DR Server (Offsite Backup) │
│ ---------------------------------------- │
│ Server: LXC 109 - 10.0.20.37 (Linux Proxmox Container) │
│ Container: Docker oracle-standby │
│ Locație: /opt/oracle/backups/primary/ │
│ Retenție: 3 backups (ultimele 3 zile) │
│ Database: OPRIT (pornit doar la disaster recovery) │
│ │
│ ✅ Protecție contra: crash complet PRIMARY, hardware failure │
│ ✅ RTO: 1-2 ore (restore + recovery + validare) │
│ ✅ RPO: 1 zi │
└──────────────────────────────────────────────────────────────────────────────┘
Weekend - HDD E:\ deconectat și dus acasă
┌──────────────────────────────────────────────────────────────────────────────┐
│ NIVEL 4: Offline Backup (Acasă) │
│ --------------------------------- │
│ Tip: HDD EXTERN E:\ (scos din clădire) │
│ Frecvență: Weekend / Lunar │
│ Conținut: Ultimul backup full disponibil │
│ │
│ ✅ Protecție contra: incendiu, inundație, ransomware, theft │
│ ✅ RTO: 1 zi (rebuild server + restore) │
│ ✅ RPO: Weekend (max 2-3 zile pierdere) │
└──────────────────────────────────────────────────────────────────────────────┘
```
---
## 🔧 CE MODIFICĂM față de Situația Actuală
### ✅ CE FUNCȚIONEAZĂ DEJA (nu atingem):
1. **02:00 AM** - `d:\rman_backup\rman_backup.bat`
- Script RMAN backup (ÎL UPGRADE-ăm pentru compression)
- Salvează în FRA default
2. **21:00** - Task Scheduler "MareBackup"
- Copiază FRA pe E:\ (HDD extern)
- **NU modificăm acest task!**
### 🆕 CE ADĂUGĂM (NOU):
3. **03:00 AM** (NOU) - Transfer către DR
- Script PowerShell nou: `transfer_to_dr.ps1`
- Copiază backup-uri de pe PRIMARY → DR server
- Cleanup automat (păstrează 3 backups pe DR)
---
## 📋 PLAN IMPLEMENTARE - Pași Detaliați
### **Pregătire (One-Time Setup)**
#### Pasul 1: Setup SSH Keys (15 minute)
```powershell
# Pe PRIMARY (10.0.20.36) - rulează ca Administrator
# Generare SSH key pair (dacă nu există deja)
ssh-keygen -t rsa -b 4096 -f "$env:USERPROFILE\.ssh\id_rsa" -N '""'
# Verificare key generat
Get-Content "$env:USERPROFILE\.ssh\id_rsa.pub"
# Copiază output-ul (cheia publică)
```
```bash
# Pe DR Server (10.0.20.37) - conectează-te via SSH
ssh root@10.0.20.37
# Creare director SSH
mkdir -p /root/.ssh
chmod 700 /root/.ssh
# Adaugă public key în authorized_keys
nano /root/.ssh/authorized_keys
# PASTE cheia publică copiată mai sus, save și exit (Ctrl+X, Y, Enter)
chmod 600 /root/.ssh/authorized_keys
# Test conexiune
exit
```
```powershell
# Înapoi pe PRIMARY - test conexiune SSH
ssh -i "$env:USERPROFILE\.ssh\id_rsa" root@10.0.20.37 "echo 'SSH OK'"
# Ar trebui să vezi "SSH OK" FĂRĂ să ceară parolă!
```
#### Pasul 2: Creare Directoare pe DR (5 minute)
```bash
# Pe DR Server (10.0.20.37)
ssh root@10.0.20.37
# Creare structură directoare
mkdir -p /opt/oracle/backups/primary
chmod 755 /opt/oracle/backups
chmod 755 /opt/oracle/backups/primary
# Verificare spațiu disponibil (minim 50GB recomandat)
df -h /opt/oracle
# Ar trebui să vezi:
# Filesystem Size Used Avail Use% Mounted on
# /dev/... xxxG xxxG xxxG xx% /
exit
```
#### Pasul 3: Upgrade Script RMAN pentru Compression (10 minute)
```powershell
# Pe PRIMARY (10.0.20.36)
# BACKUP scriptul vechi
Copy-Item "D:\rman_backup\rman_backup.txt" "D:\rman_backup\rman_backup.txt.backup_$(Get-Date -Format 'yyyyMMdd')"
# Verificare backup creat
Get-Item "D:\rman_backup\rman_backup.txt.backup_*"
```
**Modifică fișierul `D:\rman_backup\rman_backup.txt`** cu următorul conținut:
```sql
RUN {
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO COMPRESSED BACKUPSET;
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK;
# Full backup COMPRESSED + Archive logs (șterge logs după backup)
BACKUP AS COMPRESSED BACKUPSET
INCREMENTAL LEVEL 0
CUMULATIVE
DEVICE TYPE DISK
TAG 'DAILY_FULL_COMPRESSED'
DATABASE
INCLUDE CURRENT CONTROLFILE
PLUS ARCHIVELOG
DELETE INPUT;
# Backup SPFILE separat
BACKUP AS COMPRESSED BACKUPSET SPFILE;
# Cleanup old backups (păstrează ultimele 2)
ALLOCATE CHANNEL FOR MAINTENANCE TYPE DISK;
DELETE NOPROMPT OBSOLETE DEVICE TYPE DISK;
RELEASE CHANNEL;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
}
```
**Modificări cheie:**
- ✅ Adăugat **COMPRESSED BACKUPSET** → reduce de la 23GB la ~8GB
- ✅ Adăugat **PLUS ARCHIVELOG DELETE INPUT** → include logs în backup și îi șterge după
-**REDUNDANCY 1** → păstrează DOAR ultimul backup (relevant pentru contabilitate!)
-**BACKUP VALIDATE** → verificare integritate IMEDIAT după backup
-**PARALLELISM 2** → folosește 2 channels pentru viteză
#### Pasul 4: Instalare Transfer Script (5 minute)
```powershell
# Pe PRIMARY - copiază scriptul transfer_to_dr.ps1
# Creare director logs
New-Item -ItemType Directory -Force -Path "D:\rman_backup\logs"
# Copiază scriptul de la:
# oracle/standby-server-scripts/02_transfer_to_dr.ps1
# către:
# D:\rman_backup\transfer_to_dr.ps1
Copy-Item "\\path\to\02_transfer_to_dr.ps1" "D:\rman_backup\transfer_to_dr.ps1"
# Verificare
Test-Path "D:\rman_backup\transfer_to_dr.ps1" # Ar trebui să returneze True
```
#### Pasul 5: Setup Task Scheduler (5 minute)
```powershell
# Pe PRIMARY - rulează ca Administrator!
# Opțiunea 1: Rulează scriptul automat de setup
# Copiază 03_setup_dr_transfer_task.ps1 și rulează:
PowerShell -ExecutionPolicy Bypass -File "\\path\to\03_setup_dr_transfer_task.ps1"
# SAU Opțiunea 2: Creare manuală task
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-ExecutionPolicy Bypass -NoProfile -File `"D:\rman_backup\transfer_to_dr.ps1`""
$trigger = New-ScheduledTaskTrigger -Daily -At "03:00AM"
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
-LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName "Oracle_DR_Transfer" `
-Action $action -Trigger $trigger -Principal $principal -Settings $settings `
-Description "Oracle DR - Transfer backups to 10.0.20.37 at 3 AM daily"
# Verificare task creat
Get-ScheduledTask -TaskName "Oracle_DR_Transfer"
```
---
### **Testare și Validare**
#### Test 1: Test RMAN Backup Upgraded (30 minute)
```powershell
# Pe PRIMARY
# Rulează manual backup-ul RMAN pentru a testa compression
cd D:\rman_backup
# Check size ÎNAINTE (backup vechi)
$oldBackup = Get-ChildItem "C:\Users\Oracle\recovery_area\ROA\BACKUPSET" -Recurse -File |
Measure-Object -Property Length -Sum
Write-Host "Old backup size: $([math]::Round($oldBackup.Sum / 1GB, 2)) GB"
# Rulează backup nou (cu compression)
.\rman_backup.bat
# Așteaptă să se termine (15-30 min) și verifică size NOU
$newBackup = Get-ChildItem "C:\Users\Oracle\recovery_area\ROA\BACKUPSET" -Recurse -File |
Sort-Object LastWriteTime -Descending | Select-Object -First 10 |
Measure-Object -Property Length -Sum
Write-Host "New backup size: $([math]::Round($newBackup.Sum / 1GB, 2)) GB"
# Ar trebui să vezi reducere de la ~23GB la ~8GB!
```
#### Test 2: Test Transfer către DR (10 minute)
```powershell
# Pe PRIMARY - test manual transfer script
PowerShell -ExecutionPolicy Bypass -File "D:\rman_backup\transfer_to_dr.ps1"
# Monitorizează output - ar trebui să vezi:
# - "SSH connection successful"
# - "Found X files to transfer"
# - "Transferring: filename.BKP"
# - "✅ Transferred: filename.BKP"
# - "Transfer completed successfully"
# Verificare log
Get-Content "D:\rman_backup\logs\transfer_$(Get-Date -Format 'yyyyMMdd').log" -Tail 50
```
```bash
# Pe DR Server - verificare backup-uri primite
ssh root@10.0.20.37
ls -lh /opt/oracle/backups/primary/
# Ar trebui să vezi fișierele .BKP transferate
# Verificare integritate (opțional)
md5sum /opt/oracle/backups/primary/*.BKP
```
#### Test 3: Test Restore pe DR (60 minute) - OPȚIONAL dar RECOMANDAT
Vezi secțiunea "Disaster Recovery Procedure" din `PLAN_BACKUP_DR_SIMPLE.md` pentru detalii complete.
```bash
# Pe DR Server - test restore din backup
ssh root@10.0.20.37
# Rulează scriptul de restore (din PLAN_BACKUP_DR_SIMPLE.md)
/opt/oracle/scripts/dr/full_dr_restore.sh /opt/oracle/backups/primary
# Verifică că database se restore corect
# IMPORTANT: După test, OPREȘTE database pe DR!
docker exec oracle-standby su - oracle -c "sqlplus / as sysdba <<< 'SHUTDOWN IMMEDIATE;'"
```
---
## 📅 CALENDAR OPERAȚIONAL
### Zilnic (Automat)
| Ora | Task | Descriere | Durată | Log Location |
|-------|------|-----------|--------|--------------|
| 02:00 | RMAN Backup | Full COMPRESSED + ARCHIVELOG | 20-30 min | Alert log + RMAN output |
| 03:00 | DR Transfer | Transfer backup → 10.0.20.37 | 10-15 min | `D:\rman_backup\logs\transfer_YYYYMMDD.log` |
| 21:00 | MareBackup | Copiere FRA → E:\ (HDD extern) | 5-10 min | Task Scheduler log |
### Săptămânal (Manual - 10 minute)
**Luni dimineața:**
- ✅ Verifică că toate backup-urile au rulat OK în weekend
- ✅ Check logs pentru erori:
```powershell
# Verificare quick
Get-Content "D:\rman_backup\logs\transfer_*.log" | Select-String "ERROR|FAILED"
```
**Vineri seara (opțional):**
- ✅ Verifică spațiu disk pe PRIMARY și DR
```powershell
# PRIMARY
Get-PSDrive C,D,E | Format-Table Name, @{L="Free(GB)";E={[math]::Round($_.Free/1GB,1)}}
```
```bash
# DR
ssh root@10.0.20.37 "df -h /opt/oracle"
```
### Lunar (Manual - 2 ore)
**Prima Duminică a lunii:**
- ✅ **TEST RESTORE pe DR** (OBLIGATORIU!)
- Rulează test restore complet pe DR
- Verifică că poți deschide database
- Validează că datele sunt corecte
- Documentează RTO (timp necesar pentru restore)
**Ultima Vineri:**
- ✅ **Backup HDD Offline** (opțional dar recomandat)
- Conectează HDD E:\ (dacă nu e conectat permanent)
- Lasă task-ul de la 21:00 să copieze backup-urile
- Weekend: deconectează HDD și du-l acasă
- Luni: readuce HDD și reconectează-l
---
## 🚨 DISASTER RECOVERY - Procedură Urgență
### Când ACTIVEZI DR?
**DA - Activează DR dacă:**
- ✅ PRIMARY server 10.0.20.36 NU răspunde de >30 minute
- ✅ Oracle database corupt complet (nu se deschide)
- ✅ Crash disk C:\ sau D:\ cu date
- ✅ Ransomware / malware care a criptat datele
**NU - Nu activa DR pentru:**
- ❌ Probleme minore de performance
- ❌ User a șters accidental câteva înregistrări (folosește point-in-time recovery LOCAL)
- ❌ Restart Windows sau maintenance planificat
- ❌ Erori fixabile în <30 minute
### Procedură Rapidă DR Activation (60 minute)
```bash
# Pe DR Server (10.0.20.37)
ssh root@10.0.20.37
# 1. VERIFICĂ că PRIMARY e CU ADEVĂRAT down! (FOARTE IMPORTANT!)
ping -c 10 10.0.20.36
# Dacă PRIMARY răspunde → STOP! NU continua!
# 2. Rulează script restore (din PLAN_BACKUP_DR_SIMPLE.md)
/opt/oracle/scripts/dr/full_dr_restore.sh
# 3. Monitorizează progres
tail -f /opt/oracle/logs/dr/restore_*.log
# 4. După ~45-60 minute, database ar trebui să fie OPEN
docker exec oracle-standby su - oracle -c "sqlplus / as sysdba <<< 'SELECT name, open_mode FROM v\$database;'"
# Output așteptat:
# NAME OPEN_MODE
# --------- ----------
# ROA READ WRITE
# 5. UPDATE conexiuni aplicații
# Schimbă connection string de la:
# 10.0.20.36:1521/ROA
# la:
# 10.0.20.37:1521/ROA
# 6. Notifică utilizatori
```
**RTO Așteptat:** 45-75 minute (în funcție de viteza disk I/O pe DR)
**RPO:** Max 1 zi (ultimul backup de la 02:00 AM)
---
## 📊 METRICI ȘI MONITORING
### KPI-uri Cheie
| Metric | Target | Alertă Dacă | Cum Verifici |
|--------|--------|-------------|--------------|
| **Backup Success Rate** | >99% | <95% în ultima săptămână | Check logs zilnic |
| **Transfer Success Rate** | >99% | <98% în ultima săptămână | Check DR server daily |
| **Backup Size** | 8-12 GB | >15GB (compression issue) | Check FRA size |
| **Backup Duration** | 20-30 min | >45 min | Check RMAN logs |
| **Transfer Duration** | 10-15 min | >30 min | Check transfer logs |
| **DR Disk Space** | <60% used | >80% used | `df -h /opt/oracle` |
| **PRIMARY Disk Space** | <70% used | >85% used | Check drives C,D,E |
| **Test Restore Success** | 100% | Failure | Monthly test |
### Quick Health Check (5 minute)
```powershell
# Pe PRIMARY - rulează zilnic dimineața
# Check 1: Ultimul backup RMAN
$lastBackup = Get-ChildItem "C:\Users\Oracle\recovery_area\ROA\BACKUPSET" -Recurse -File |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
$age = (Get-Date) - $lastBackup.LastWriteTime
Write-Host "Last backup: $($lastBackup.Name), Age: $($age.Hours) hours"
# Ar trebui să fie <30 ore (backup de ieri la 02:00)
# Check 2: Transfer log
$lastTransferLog = Get-Item "D:\rman_backup\logs\transfer_*.log" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
Select-String -Path $lastTransferLog -Pattern "completed successfully|ERROR" | Select-Object -Last 1
# Ar trebui să vezi "completed successfully"
# Check 3: Disk space
Get-PSDrive C,D,E | Format-Table Name, @{L="Free(GB)";E={[math]::Round($_.Free/1GB,1)}}
# C:\ ar trebui să aibă >10GB free, D:\ >20GB, E:\ variabil
```
```bash
# Pe DR - check săptămânal
ssh root@10.0.20.37 << 'EOF'
echo "=== DR Server Health Check ==="
echo "Disk space:"
df -h /opt/oracle | tail -1
echo ""
echo "Latest backup files:"
ls -lth /opt/oracle/backups/primary/*.BKP | head -5
echo ""
echo "Backup count:"
ls -1 /opt/oracle/backups/primary/*.BKP | wc -l
EOF
```
---
## ⚠️ TROUBLESHOOTING
### Problem 1: "Transfer failed - SSH connection refused"
**Cauze posibile:**
- DR server oprit
- Firewall blochează port 22
- SSH keys expirate sau schimbate
**Soluții:**
```powershell
# Test conexiune
ping 10.0.20.37
# Test SSH
ssh -v -i "$env:USERPROFILE\.ssh\id_rsa" root@10.0.20.37 "echo OK"
# Regenerare SSH keys (dacă e necesar)
ssh-copy-id -i "$env:USERPROFILE\.ssh\id_rsa.pub" root@10.0.20.37
```
### Problem 2: "RMAN-03009: failure of backup command"
**Cauze:**
- Disk plin
- Oracle process crash
- FRA quota exceeded
**Soluții:**
```sql
-- Check FRA usage
SELECT * FROM v$recovery_area_usage;
SELECT * FROM v$flash_recovery_area_usage;
-- Check disk space
!df -h (Linux) sau host dir C:\ (Windows)
-- Cleanup old backups manual
RMAN> DELETE NOPROMPT OBSOLETE;
```
### Problem 3: "HDD extern E:\ not found"
**Cauze:**
- HDD deconectat
- Litera drive schimbată
- HDD defect
**Soluții:**
```powershell
# Verificare drives
Get-PSDrive -PSProvider FileSystem
# Reconnect HDD
# - Verifică USB/SATA connection
# - Check Disk Management (diskmgmt.msc)
# - Reassign drive letter dacă e necesar
```
---
## 🔐 SECURITATE
### SSH Keys Management
```powershell
# Backup SSH keys (IMPORTANT!)
$backupPath = "D:\secure_backup\ssh_keys_$(Get-Date -Format 'yyyyMMdd')"
New-Item -ItemType Directory -Force -Path $backupPath
Copy-Item "$env:USERPROFILE\.ssh\id_rsa*" $backupPath
# Protect private key
icacls "$env:USERPROFILE\.ssh\id_rsa" /inheritance:r /grant:r "$env:USERNAME:(F)"
```
### Access Control
```bash
# Pe DR - restricționează access la backups
chmod 700 /opt/oracle/backups
chown -R oracle:dba /opt/oracle/backups
# Verificare permissions
ls -la /opt/oracle/backups
```
---
## 📄 FILES REFERENCE
### Pe PRIMARY (10.0.20.36):
```
D:\rman_backup\
├── rman_backup.bat # Existent - script launcher
├── rman_backup.txt # UPGRADE - adaugă compression
├── rman_backup.txt.backup_* # Backup vechi (safety)
├── transfer_to_dr.ps1 # NOU - transfer script
└── logs\
└── transfer_YYYYMMDD.log # Transfer logs
C:\Users\Oracle\recovery_area\ROA\
├── BACKUPSET\ # RMAN backups
├── AUTOBACKUP\ # Controlfile autobackups
└── ARCHIVELOG\ # Archived logs (temporary)
E:\backup_roa\ # HDD extern - copie la 21:00
```
### Pe DR (10.0.20.37):
```
/opt/oracle/backups/primary/ # Backup-uri primite de la PRIMARY
└── *.BKP # RMAN backup files
/opt/oracle/scripts/dr/ # Scripts restore (din PLAN_BACKUP_DR_SIMPLE.md)
└── full_dr_restore.sh # Main restore script
/opt/oracle/logs/dr/ # Logs restore
```
---
## ✅ CHECKLIST IMPLEMENTARE
### Pregătire (One-Time)
- [ ] Setup SSH keys PRIMARY → DR
- [ ] Test conexiune SSH passwordless
- [ ] Creare directoare pe DR (`/opt/oracle/backups/primary`)
- [ ] Verificare spațiu disk DR (>50GB free)
- [ ] Backup script RMAN vechi (`rman_backup.txt.backup`)
- [ ] Upgrade script RMAN (adaugă compression)
- [ ] Copiere script `transfer_to_dr.ps1` pe PRIMARY
- [ ] Creare director logs (`D:\rman_backup\logs`)
- [ ] Setup Task Scheduler pentru transfer (03:00 AM)
### Testare (Pre-Production)
- [ ] Test manual RMAN backup upgraded (verifică compression funcționează)
- [ ] Test manual transfer script (verifică backup-uri ajung pe DR)
- [ ] Verificare logs transfer (fără erori)
- [ ] Verificare integritate fișiere pe DR (md5sum)
- [ ] Test restore pe DR (opțional dar recomandat!)
### Go-Live
- [ ] Lasă să ruleze automat 3 nopți consecutive
- [ ] Monitorizează logs zilnic
- [ ] Verifică că toate task-urile rulează OK
- [ ] Documentează orice issue găsit
### Post-Implementation (Lunar)
- [ ] Test restore complet pe DR (prima Duminică)
- [ ] Review metrics și KPIs
- [ ] Update documentație dacă e necesar
- [ ] Backup HDD offline (weekend)
---
## 📞 SUPPORT ȘI ESCALATION
### Log Locations
| Tip | Location | Retention |
|-----|----------|-----------|
| **RMAN Backup** | Alert log Oracle | Rolling |
| **Transfer DR** | `D:\rman_backup\logs\transfer_YYYYMMDD.log` | 30 days |
| **Task Scheduler** | Event Viewer > Task Scheduler | 30 days |
| **Restore DR** | `/opt/oracle/logs/dr/restore_*.log` | 90 days |
### Escalation Path
| Issue Severity | Response Time | Contact |
|----------------|---------------|---------|
| **P1 - PRIMARY Down** | Immediate | Activate DR immediately |
| **P2 - Backup Failed** | 2 hours | Check logs, retry manual |
| **P3 - Transfer Failed** | 4 hours | Retry next night, monitor |
| **P4 - Monitoring Alert** | Next business day | Review și investigate |
---
## 📝 CHANGELOG
| Versiune | Data | Modificări |
|----------|------|------------|
| 1.0 | 2025-10-07 | Strategie inițială pentru database contabilitate |
---
## 🎯 NEXT STEPS
1. **Citește integral această documentație**
2. **Verifică prerequisite** (SSH access, disk space, permissions)
3. **Implementează pașii din "PLAN IMPLEMENTARE"**
4. **Testează manual** înainte de go-live
5. **Monitorizează primele 3 zile** după activare
6. **Schedule primul test restore** (luna viitoare)
**IMPORTANT:** NU uita să faci **test restore lunar** pe DR! Este SINGURA modalitate de a fi sigur că backup-urile funcționează când ai nevoie de ele!
---
**Document pregătit de:** Claude Code
**Review status:** Ready for Production
**Ultima actualizare:** 2025-10-07

View File

@@ -1,346 +0,0 @@
# Strategie Backup cu INCREMENTAL pentru RPO Îmbunătățit
## Oracle ROA Database Contabilitate
**Obiectiv:** Reducere RPO de la **36 ore** la **12 ore** (sau mai puțin)
---
## 🎯 PROBLEMA REZOLVATĂ
### **Situația FĂRĂ incremental:**
```
Luni 02:00 → Full backup
...36 ore fără backup...
Marți 14:00 → PRIMARY crash! ❌
→ Restore din backup Luni 02:00
→ PIERDERE: 36 ore (1.5 zile) de contabilitate ❌
```
### **Situația CU incremental:**
```
Luni 02:00 → Full backup
Luni 14:00 → Incremental backup ✅
Marți 02:00 → Full backup
Marți 14:00 → Incremental backup ✅ ← CEL MAI RECENT!
Marți 15:00 → PRIMARY crash! ❌
→ Restore: Full (marți 02:00) + Incremental (marți 14:00)
→ PIERDERE: DOAR 1 oră! ✅
```
**Îmbunătățire RPO:** 36 ore → **max 12 ore** (de obicei 1-8 ore)
---
## 📋 ARHITECTURĂ BACKUP INTEGRATĂ
### **Timeline zilnic complet:**
```
┌────────────────────────────────────────────────────────┐
│ DAILY BACKUP SCHEDULE │
├────────────────────────────────────────────────────────┤
│ │
│ 02:00 → FULL Backup (RMAN Level 0 COMPRESSED) │
│ ├─ Database complet: ~8GB compressed │
│ ├─ + ARCHIVELOG DELETE INPUT │
│ ├─ + BACKUP VALIDATE (integrity check) │
│ └─ Salvat în FRA │
│ │
│ 03:00 → Transfer FULL la DR │
│ └─ SCP → 10.0.20.37 │
│ │
│ 06:00 - 13:00 → Lucru normal contabilitate │
│ │
│ 14:00 → INCREMENTAL Backup (Level 1 COMPRESSED) ←NEW!│
│ ├─ Doar modificări: ~500MB-2GB compressed │
│ ├─ + ARCHIVELOG DELETE INPUT │
│ ├─ + BACKUP VALIDATE │
│ └─ Salvat în FRA │
│ │
│ 14:30 → Transfer INCREMENTAL la DR ← NEW! │
│ └─ SCP → 10.0.20.37 (rapid: 5-10 min) │
│ │
│ 14:00 - 18:00 → Lucru normal contabilitate │
│ │
│ 21:00 → Copiere FRA → E:\ (existent) │
│ └─ Include full + incremental │
│ │
└────────────────────────────────────────────────────────┘
```
---
## 🔧 IMPLEMENTARE
### **Fișiere noi create:**
| Fișier | Descriere | Locație |
|--------|-----------|---------|
| `01b_rman_backup_incremental.txt` | Script RMAN pentru incremental | PRIMARY `D:\rman_backup\` |
| `02b_transfer_incremental_to_dr.ps1` | Transfer incremental → DR | PRIMARY `D:\rman_backup\` |
| `03b_setup_incremental_tasks.ps1` | Setup Task Scheduler | PRIMARY (rulează o dată) |
---
### **Pas 1: Copiere scripturi pe PRIMARY**
```powershell
# Pe PRIMARY Windows (10.0.20.36)
# Copiază scripturile
# Script 1: RMAN incremental
Copy-Item "\\path\to\01b_rman_backup_incremental.txt" "D:\rman_backup\rman_backup_incremental.txt"
# Script 2: Transfer incremental
Copy-Item "\\path\to\02b_transfer_incremental_to_dr.ps1" "D:\rman_backup\transfer_incremental_to_dr.ps1"
# Verificare
Test-Path "D:\rman_backup\rman_backup_incremental.txt"
Test-Path "D:\rman_backup\transfer_incremental_to_dr.ps1"
```
---
### **Pas 2: Setup Task Scheduler**
```powershell
# Rulează ca Administrator
PowerShell -ExecutionPolicy Bypass -File "\\path\to\03b_setup_incremental_tasks.ps1"
# SAU manual:
# Task 1: Incremental backup la 14:00
$action1 = New-ScheduledTaskAction -Execute "cmd.exe" `
-Argument "/c D:\rman_backup\rman_backup_incremental.bat"
$trigger1 = New-ScheduledTaskTrigger -Daily -At "14:00"
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
-LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName "Oracle_IncrementalBackup" `
-Action $action1 -Trigger $trigger1 -Principal $principal
# Task 2: Transfer incremental la 14:30
$action2 = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-ExecutionPolicy Bypass -File D:\rman_backup\transfer_incremental_to_dr.ps1"
$trigger2 = New-ScheduledTaskTrigger -Daily -At "14:30"
Register-ScheduledTask -TaskName "Oracle_DR_TransferIncremental" `
-Action $action2 -Trigger $trigger2 -Principal $principal
# Verificare
Get-ScheduledTask | Where-Object { $_.TaskName -like "Oracle*" }
```
---
### **Pas 3: Test manual**
```powershell
# Test incremental backup
Start-ScheduledTask -TaskName "Oracle_IncrementalBackup"
# Așteaptă 5-10 minute să se termine, apoi test transfer
Start-ScheduledTask -TaskName "Oracle_DR_TransferIncremental"
# Verificare logs
Get-Content "D:\rman_backup\logs\transfer_incr_*.log" -Tail 50
```
---
## 📊 CE SE ÎNTÂMPLĂ LA RESTORE
### **Restore cu FULL + INCREMENTAL:**
```bash
# Pe DR Server (10.0.20.37)
# Script-ul 04_full_dr_restore.sh e deja modificat!
# Când rulezi restore:
/opt/oracle/scripts/dr/full_dr_restore.sh
# RMAN face automat:
1. Catalog toate backup-urile din /opt/oracle/backups/primary/
├─ Full backup (Level 0): ~8GB
└─ Incremental backup (Level 1): ~2GB
2. RESTORE DATABASE
├─ Aplică FULL backup mai întâi
└─ Aplică INCREMENTAL automat (RMAN e inteligent!)
3. RECOVER cu archived logs (dacă există)
4. OPEN database cu RESETLOGS
REZULTAT: Database restaurat până la ultimul incremental backup!
```
**RMAN știe AUTOMAT** să aplice incremental după full - NU trebuie configurare extra!
---
## 💾 STORAGE ȘI BANDWIDTH
### **Impact Storage:**
| Locație | FĂRĂ Incremental | CU Incremental | Diferență |
|---------|------------------|----------------|-----------|
| **PRIMARY FRA** | ~8GB (1 full) | ~10GB (1 full + 1 incr) | +2GB |
| **DR Server** | ~8GB | ~10GB | +2GB |
| **E:\ HDD extern** | ~16GB | ~20GB | +4GB |
| **TOTAL** | ~32GB | ~40GB | **+8GB** |
**Concluzie:** Cost storage +25% pentru RPO de 3x mai bun!
---
### **Impact Bandwidth:**
| Transfer | Fără Incremental | Cu Incremental | Diferență |
|----------|------------------|----------------|-----------|
| **Zilnic total** | ~8GB (la 03:00) | ~10GB (8GB + 2GB) | +2GB |
| **Timp transfer** | ~15 min | ~20 min total | +5 min |
**Impact minim** pe network!
---
## 📈 RPO IMPROVEMENT
### **Scenarii recovery:**
| Ora Crash | Backup disponibil | Pierdere date | RPO |
|-----------|-------------------|---------------|-----|
| **03:00** | Full (02:00) | 1 oră | ✅ Excelent |
| **08:00** | Full (02:00) | 6 ore | ⚠️ Acceptabil |
| **14:00** | Full (02:00) | 12 ore | ⚠️ Acceptabil |
| **15:00** | Full (02:00) + Incr (14:00) | **1 oră** | ✅ **Excelent!** |
| **20:00** | Full (02:00) + Incr (14:00) | 6 ore | ⚠️ Acceptabil |
| **01:00** | Full (02:00 ieri) + Incr (14:00 ieri) | 11 ore | ⚠️ Acceptabil |
**Average RPO:** ~6 ore (vs 18 ore fără incremental)
**Max RPO:** 12 ore (vs 36 ore fără incremental)
---
## ⚠️ CONSIDERAȚII
### **Când e UTIL incremental:**
**DA - Activează incremental dacă:**
- Contabilitate activă în cursul zilei
- Modificări frecvente (facturi, înregistrări)
- RPO de 36h e prea mare (pierdere inacceptabilă)
- Aveți +10GB spațiu extra pe PRIMARY și DR
### **Când NU e necesar:**
**NU activa incremental dacă:**
- Baza de date se modifică doar dimineața
- RPO de 36h e acceptabil pentru business
- Spațiu disk limitat (<20GB free)
- Problemă de bandwidth (transfer lent)
---
## 🎯 ALTERNATIVE
### **Opțiunea 2: Două incrementale pe zi**
```
02:00 → Full backup
10:00 → Incremental #1
16:00 → Incremental #2
```
**RPO:** max 8 ore (și mai bun!)
**Dezavantaje:**
- Mai mult storage (~12GB total)
- Mai mult bandwidth
- Restore mai lent (3 backup-uri: full + 2x incremental)
**Când să folosești:**
- Contabilitate super-critică
- Modificări masive în cursul zilei
- RPO target <8 ore
---
### **Opțiunea 3: Archive log shipping**
```
02:00 → Full backup
La fiecare 15 min → Transfer archive logs către DR
```
**RPO:** ~15 minute! (cel mai bun)
**Dezavantaje:**
- Foarte complex de implementat
- Transfer continuu (impact bandwidth)
- Database pe DR trebuie în MOUNT mode (consumă resurse)
- NU funcționează bine cross-platform (WindowsLinux)
**Când să folosești:**
- RPO <1 oră OBLIGATORIU
- Buget pentru licență Oracle Enterprise Edition + Data Guard
- Same-platform (WindowsWindows sau LinuxLinux)
---
## ✅ RECOMANDARE FINALĂ
**Pentru database CONTABILITATE ROA:**
### **Începe cu Opțiunea 1 (un incremental la 14:00)**
**De ce:**
- RPO improvement semnificativ: 36h 12h (3x mai bun!)
- Cost reasonable: +8GB storage, +5 min transfer
- Simplu de implementat (3 scripturi)
- RMAN aplică automat incremental la restore
- Nu impactează performanța (ora 14:00 = pauză masă)
**Măsoară după 1 lună:**
- Dimensiune medie incremental backup
- Timp transfer
- Încărcarea pe PRIMARY la 14:00
**Dacă e nevoie, upgrade la Opțiunea 2** (2 incrementale/zi)
---
## 📋 CHECKLIST IMPLEMENTARE
### **Setup (once):**
- [ ] Copiere `01b_rman_backup_incremental.txt` `D:\rman_backup\rman_backup_incremental.txt`
- [ ] Copiere `02b_transfer_incremental_to_dr.ps1` `D:\rman_backup\transfer_incremental_to_dr.ps1`
- [ ] Rulare `03b_setup_incremental_tasks.ps1` (ca Administrator)
- [ ] Verificare task-uri create în Task Scheduler
- [ ] Test manual incremental backup
- [ ] Test manual transfer incremental
- [ ] Verificare pe DR fișierele ajung
### **Monitoring (zilnic - primele 2 săptămâni):**
- [ ] Verifică incremental backup rulează la 14:00
- [ ] Verifică transfer rulează la 14:30
- [ ] Verifică logs pentru erori
- [ ] Verifică dimensiune backup incremental
- [ ] Verifică spațiu disk (PRIMARY și DR)
### **Test restore (lunar):**
- [ ] Rulează `/opt/oracle/scripts/dr/05_test_restore_dr.sh`
- [ ] Verifică RMAN aplică corect full + incremental
- [ ] Verifică RTO (ar trebui fie similar: 45-75 min)
- [ ] Verifică integritate date restaurate
---
**Versiune:** 1.0
**Data:** 2025-10-08
**Status:** Ready for Implementation

View File

@@ -1,320 +0,0 @@
# Verificare Capability Disaster Recovery - Oracle ROA
**Scop:** Verificare că backup-urile de pe DR server pot fi restaurate cu SUCCESS
---
## 📋 DOUĂ TIPURI DE VERIFICARE
### **1. Verificare ZILNICĂ (Quick Check) - 30 secunde**
**Script:** `06_quick_verify_backups.sh`
**Frecvență:** Zilnic (automat via cron)
**Durată:** <1 minut
**Ce verifică:**
- Backup-urile există pe DR
- Ultimul backup e recent (<30 ore)
- Fișierele backup sunt readable (integrity check rapid)
- Spațiu disk disponibil (>20GB free)
- ✅ Inventar complet backup-uri
**Rulare:**
```bash
ssh root@10.0.20.37
/opt/oracle/scripts/dr/06_quick_verify_backups.sh
```
**Output așteptat:**
```
✅ Backup directory: OK
✅ Backup files: 1 present
✅ Latest backup age: 5h (threshold: 30h)
✅ Disk space: 45GB free
✅ File integrity: OK
```
---
### **2. Verificare LUNARĂ (Full Test Restore) - 45-75 minute**
**Script:** `05_test_restore_dr.sh`
**Frecvență:** LUNAR (prima Duminică)
**Durată:** 45-75 minute
**Ce face:**
-**RESTORE complet** database din backup
-**RECOVER** cu archived logs
-**OPEN** database în read-write mode
-**Verificare** integritate date
-**Măsurare RTO** (Recovery Time Objective)
-**Generare raport** detaliat
**Rulare:**
```bash
ssh root@10.0.20.37
/opt/oracle/scripts/dr/05_test_restore_dr.sh
```
**IMPORTANT:**
- ✅ NU afectează production database (ROA)
- ✅ Creează database temporar (ROATEST)
- ✅ Cleanup automat după test
- ✅ Durează 45-75 minute (așteaptă să se termine!)
---
## 🚀 SETUP AUTOMAT - Cron Jobs
### **Setup verificare zilnică:**
```bash
# Pe DR Server (10.0.20.37)
ssh root@10.0.20.37
# Editare crontab
crontab -e
# Adaugă această linie (rulează zilnic la 09:00 AM)
0 9 * * * /opt/oracle/scripts/dr/06_quick_verify_backups.sh >> /opt/oracle/logs/dr/cron_verify.log 2>&1
```
### **Setup test restore lunar:**
```bash
# Adaugă în crontab (prima Duminică a lunii la 10:00 AM)
0 10 1-7 * 0 /opt/oracle/scripts/dr/05_test_restore_dr.sh >> /opt/oracle/logs/dr/cron_test.log 2>&1
```
**Explicație:**
- `0 10` = ora 10:00
- `1-7` = zilele 1-7 ale lunii
- `* 0` = orice lună, dar doar Duminica (0 = Sunday)
- Rezultat: rulează prima Duminică între 1-7 ale fiecărei luni
---
## 📊 INTERPRETARE REZULTATE
### **Verificare Zilnică - Scenarii:**
#### ✅ **SUCCESS (Normal):**
```
✅ Backup files: 1 present
✅ Latest backup age: 8h (threshold: 30h)
✅ Disk space: 45GB free
```
**Acțiune:** NONE - totul e OK
---
#### ⚠️ **WARNING (Minor Issues):**
```
⚠️ Backup is getting old (>26h)
⚠️ Disk space getting low (<20GB)
```
**Acțiune:** Investigare - de ce nu a venit backup nou?
---
#### ❌ **ERROR (Critica):**
```
❌ Latest backup is too old: 35 hours
❌ No backup files found!
❌ DISK SPACE LOW! (8GB free)
❌ BACKUP FILE CORRUPTED!
```
**Acțiune IMEDIATĂ:**
1. Verifică pe PRIMARY dacă backup-ul a rulat azi
2. Verifică transfer script (logs în `D:\rman_backup\logs\`)
3. Verifică conexiune SSH către DR
4. Rulează manual transfer dacă e nevoie
---
### **Test Restore Lunar - Scenarii:**
#### ✅ **SUCCESS:**
```
✅ Phase 1: RMAN RESTORE - SUCCESS
✅ Phase 2: RMAN RECOVER - SUCCESS
✅ Phase 3: DATABASE OPEN - SUCCESS
✅ Phase 4: DATA INTEGRITY - VERIFIED
✅ Phase 5: RTO CALCULATION - MEASURED
Total duration: 52 minutes 34 seconds
✅ RTO GOOD: Under 60 minutes
```
**Concluzie:** DR capability VALIDAT - backup-urile funcționează!
---
#### ❌ **FAILURE:**
```
❌ RMAN RESTORE failed!
ERROR: RMAN-06023: no backup or copy found
```
**Cauze posibile:**
- Backup-uri corupte sau lipsă
- DBID incorect
- Path-uri backup incorecte
**Acțiune IMEDIATĂ:**
1. Verifică că backup-urile există: `ls -lh /opt/oracle/backups/primary/`
2. Verifică integritatea: `md5sum /opt/oracle/backups/primary/*.BKP`
3. Re-transferă backup de pe PRIMARY
4. Rulează din nou test restore
---
## 📈 METRICI IMPORTANTE
### **RTO (Recovery Time Objective):**
| Durată Test | Status | Acțiune |
|-------------|--------|---------|
| <45 min | EXCELLENT | Perfect! |
| 45-60 min | GOOD | Acceptabil |
| 60-75 min | ACCEPTABLE | Monitorizează |
| >75 min | ❌ TOO HIGH | Optimizare necesară! |
**Target:** 45-75 minute
---
### **Backup Age (Vârsta ultimului backup):**
| Vârstă | Status | Acțiune |
|--------|--------|---------|
| <24h | FRESH | Perfect - backup de ieri |
| 24-26h | OK | Normal - backup de alaltăieri |
| 26-30h | OLD | Investigare - de ce întârziere? |
| >30h | ❌ CRITICAL | ALERT - lipsește backup! |
**Target:** <26 ore (backup de azi sau ieri)
---
## 🐛 TROUBLESHOOTING
### **Problem 1: "No backup files found"**
**Verificări:**
```bash
# Pe DR
ls -la /opt/oracle/backups/primary/
# Verifică transfer log pe PRIMARY
# D:\rman_backup\logs\transfer_YYYYMMDD.log
# Test manual transfer (pe PRIMARY)
PowerShell -File D:\rman_backup\transfer_to_dr.ps1
```
**Soluții:**
- Verifică SSH keys funcționează
- Verifică task scheduler rulează
- Rulează manual transfer
---
### **Problem 2: "Test restore failed - RMAN-06023"**
**Verificări:**
```bash
# Pe DR - verifică backup files
find /opt/oracle/backups/primary -name "*.BKP" -ls
# Verifică DBID corect (ar trebui să fie 1363569330)
grep DBID /opt/oracle/scripts/dr/05_test_restore_dr.sh
```
**Soluții:**
- Verifică DBID = 1363569330
- Re-transferă backup de pe PRIMARY
- Verifică permissions (oracle:dba)
---
### **Problem 3: "Backup file corrupted"**
**Verificări:**
```bash
# Pe DR - checksum backup
md5sum /opt/oracle/backups/primary/*.BKP
# Compară cu checksum de pe PRIMARY
# (ar trebui să fie identice)
# Test citire fișier
head -c 1M /opt/oracle/backups/primary/*.BKP > /dev/null
tail -c 1M /opt/oracle/backups/primary/*.BKP > /dev/null
```
**Soluții:**
- Re-transfer backup de pe PRIMARY
- Verifică network stability
- Verifică disk health pe DR
---
## ✅ CHECKLIST VERIFICARE LUNARĂ
**Prima Duminică a lunii:**
- [ ] Rulează test restore: `/opt/oracle/scripts/dr/05_test_restore_dr.sh`
- [ ] Verifică RTO < 75 minute
- [ ] Verifică database se deschide cu SUCCESS
- [ ] Verifică integritate date (object count, tablespaces)
- [ ] Review raport: `/opt/oracle/logs/dr/test_report_YYYYMMDD.txt`
- [ ] Documentează orice issue găsit
- [ ] Update documentație dacă e necesar
- [ ] Notifică management despre rezultat test
---
## 📞 ESCALATION
### **Severity Levels:**
| Issue | Severity | Response Time | Escalate To |
|-------|----------|---------------|-------------|
| Daily check failed | P3 | 4 hours | DBA Team |
| Backup >30h old | P2 | 2 hours | DBA + Manager |
| Test restore failed | P2 | 2 hours | DBA + Manager |
| No backups found | P1 | Immediate | DBA + Management |
| RTO >90 min | P3 | Next day | DBA Team |
---
## 📚 LOGS LOCATION
| Tip | Location |
|-----|----------|
| **Daily Verify** | `/opt/oracle/logs/dr/verify_YYYYMMDD.log` |
| **Test Restore** | `/opt/oracle/logs/dr/test_restore_YYYYMMDD_HHMMSS.log` |
| **Test Report** | `/opt/oracle/logs/dr/test_report_YYYYMMDD.txt` |
| **Cron Jobs** | `/opt/oracle/logs/dr/cron_*.log` |
---
## 🎯 BEST PRACTICES
1. **✅ Rulează verificare zilnică** automat (cron)
2. **✅ Rulează test restore LUNAR** (obligatoriu!)
3. **✅ Review logs** săptămânal
4. **✅ Documentează issues** găsite
5. **✅ Test manual** după orice modificare în backup strategy
6. **✅ Măsoară RTO** și optimizează dacă crește
7. **✅ Păstrează rapoarte** pentru audit trail
---
**IMPORTANT:**
> **Un backup NETESTAT = NU ai backup!**
>
> Singurul mod de a fi sigur că poți face disaster recovery e să TESTEZI restore-ul lunar!
---
**Versiune:** 1.0
**Data:** 2025-10-08
**Status:** Production Ready

View File

@@ -0,0 +1,36 @@
# Add PRIMARY SYSTEM user SSH key to DR VM
# Run this on DR VM (10.0.20.37) as Administrator
$systemKey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD3EdHswdNDuDC9kJdUli2zGGPVlEWJjmqtb4eABYWwjQnWqjGp8oAFbQ+r2TxR544WtEyhDL9BU6oO3EFH957DBGQJHJvfRgx2VnkNZEzN/XX/7HK6Cp5rlINGGp26PjHulKkZjARmjC3YK0aUFEkiyNyUBqhtQpmcYP4+wjUfiiO2xUkF9mzGplbWGK3ZmEdkWNd5BNddqxmxyLvd2KHAo8F7Vux9SyPWqZ8bwiDyidAMDU7kCXS/RabUMl2LGajzFbRnR87YA7cIaVFl/IWExO/fsYlgkwmmmIAMdjINp0IWDdydnmG1XNNhM8h/BKY/eK3uile8CvyEbmbuf0+ePm3Ex9vTjn4jYN2vFE148FgQGGTibibJ+sXFoQ87VFNGEuog/V0aajVk/xcOihszsEvzD2IV/tSKJFdI6klnYLuieuMZf7Dvs/6sC1l3dnsBtcpvjnU48altRRZvQzaJf3gIkG1lRGBgyW1n+WHe/7StIveYTVNFtx+fcnqB8gm9fZQxBp2WRbLNFpY/Qj+6BF66b1A2ZxH/3F9Z/6VT91EActOf+AMxjsI+09d7IRYIvzr8OxMPYOHU2bglp3o86xZEMUXfcjB8Sw/8KMsCjBp3ABEN9/bwv1496aw9IC67ZBQ2cDDfgdBej5DAkT4NS2XIx7wbM7sBtLYjcXMi7w== administrator@ROA-CARAPETRU2"
$authKeysFile = "C:\ProgramData\ssh\administrators_authorized_keys"
Write-Host "Adding PRIMARY SYSTEM user SSH key to DR VM..." -ForegroundColor Cyan
# Check if key already exists
$currentContent = Get-Content $authKeysFile -ErrorAction SilentlyContinue
if ($currentContent -match "administrator@ROA-CARAPETRU2") {
Write-Host "Key already exists in authorized_keys" -ForegroundColor Yellow
} else {
# Add the key
Add-Content -Path $authKeysFile -Value $systemKey
Write-Host "Key added successfully" -ForegroundColor Green
}
# Show current keys
Write-Host ""
Write-Host "Current authorized keys:" -ForegroundColor Cyan
Get-Content $authKeysFile | ForEach-Object {
if ($_ -match "ssh-rsa .+ (.+)$") {
Write-Host " - $($matches[1])" -ForegroundColor White
}
}
# Restart SSH service
Write-Host ""
Write-Host "Restarting SSH service..." -ForegroundColor Yellow
Restart-Service sshd
Write-Host "SSH service restarted" -ForegroundColor Green
Write-Host ""
Write-Host "Done! SYSTEM user from PRIMARY can now connect via SSH." -ForegroundColor Green

View File

@@ -0,0 +1,158 @@
# Configure Oracle Listener on DR VM
# Run this script AFTER Oracle installation
# Run AS ADMINISTRATOR on DR VM (10.0.20.37)
$ErrorActionPreference = "Stop"
$ORACLE_HOME = "C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home"
$ORACLE_BASE = "C:\Users\oracle"
$DR_IP = "10.0.20.37"
$LISTENER_PORT = 1521
Write-Host "=== Configure Oracle Listener on DR VM ===" -ForegroundColor Cyan
Write-Host ""
# Set environment
$env:ORACLE_HOME = $ORACLE_HOME
$env:ORACLE_BASE = $ORACLE_BASE
$env:PATH = "$ORACLE_HOME\bin;$env:PATH"
# Step 1: Create network admin directory
Write-Host "[1/5] Creating network admin directory..." -ForegroundColor Yellow
$netAdminDir = "$ORACLE_HOME\network\admin"
if (!(Test-Path $netAdminDir)) {
New-Item -ItemType Directory -Path $netAdminDir -Force | Out-Null
}
Write-Host " Directory: $netAdminDir" -ForegroundColor Green
# Step 2: Create listener.ora
Write-Host "[2/5] Creating listener.ora..." -ForegroundColor Yellow
$listenerOra = @"
# Listener Configuration for DR VM
# Generated: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = $DR_IP)(PORT = $LISTENER_PORT))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ROA)
(ORACLE_HOME = $($ORACLE_HOME -replace '\\', '/'))
(SID_NAME = ROA)
)
)
# Listener control parameters
INBOUND_CONNECT_TIMEOUT_LISTENER = 120
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER = OFF
VALID_NODE_CHECKING_REGISTRATION_LISTENER = OFF
# Logging
LOG_DIRECTORY_LISTENER = $($ORACLE_BASE -replace '\\', '/')/diag/tnslsnr/ORACLE-DR/listener/alert
TRACE_DIRECTORY_LISTENER = $($ORACLE_BASE -replace '\\', '/')/diag/tnslsnr/ORACLE-DR/listener/trace
TRACE_LEVEL_LISTENER = OFF
"@
$listenerOra | Out-File -FilePath "$netAdminDir\listener.ora" -Encoding ASCII -Force
Write-Host " Created: $netAdminDir\listener.ora" -ForegroundColor Green
# Step 3: Create tnsnames.ora
Write-Host "[3/5] Creating tnsnames.ora..." -ForegroundColor Yellow
$tnsnamesOra = @"
# TNS Names Configuration for DR VM
# Generated: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
ROA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = $DR_IP)(PORT = $LISTENER_PORT))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ROA)
)
)
# Localhost connection
ROA_LOCAL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = $LISTENER_PORT))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ROA)
)
)
"@
$tnsnamesOra | Out-File -FilePath "$netAdminDir\tnsnames.ora" -Encoding ASCII -Force
Write-Host " Created: $netAdminDir\tnsnames.ora" -ForegroundColor Green
# Step 4: Create sqlnet.ora
Write-Host "[4/5] Creating sqlnet.ora..." -ForegroundColor Yellow
$sqlnetOra = @"
# SQL*Net Configuration for DR VM
# Generated: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT, HOSTNAME)
# Security settings
SQLNET.AUTHENTICATION_SERVICES = (NTS)
SQLNET.EXPIRE_TIME = 10
# Encryption (optional, enable if needed)
# SQLNET.ENCRYPTION_SERVER = REQUIRED
# SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
"@
$sqlnetOra | Out-File -FilePath "$netAdminDir\sqlnet.ora" -Encoding ASCII -Force
Write-Host " Created: $netAdminDir\sqlnet.ora" -ForegroundColor Green
# Step 5: Start listener
Write-Host "[5/5] Starting Oracle Listener..." -ForegroundColor Yellow
# Stop listener if already running
try {
& lsnrctl stop 2>&1 | Out-Null
Start-Sleep -Seconds 2
} catch {
# Listener not running, continue
}
# Start listener
try {
$output = & lsnrctl start 2>&1 | Out-String
if ($output -match "completed successfully" -or $output -match "successfully") {
Write-Host " Listener started successfully" -ForegroundColor Green
} else {
Write-Host " WARNING: Check listener status manually" -ForegroundColor Yellow
Write-Host $output -ForegroundColor Gray
}
} catch {
Write-Host " ERROR: Failed to start listener: $_" -ForegroundColor Red
exit 1
}
Write-Host ""
Write-Host "=== Listener Configuration Complete ===" -ForegroundColor Green
Write-Host ""
# Verify listener status
Write-Host "Listener Status:" -ForegroundColor Cyan
& lsnrctl status
Write-Host ""
Write-Host "Configuration files created:" -ForegroundColor Yellow
Write-Host " $netAdminDir\listener.ora" -ForegroundColor White
Write-Host " $netAdminDir\tnsnames.ora" -ForegroundColor White
Write-Host " $netAdminDir\sqlnet.ora" -ForegroundColor White
Write-Host ""
Write-Host "Test connectivity:" -ForegroundColor Yellow
Write-Host " tnsping ROA" -ForegroundColor White
Write-Host " sqlplus sys/password@ROA as sysdba" -ForegroundColor White
Write-Host ""
Write-Host "Next step: Create RMAN restore script" -ForegroundColor Cyan
Write-Host ""

View File

@@ -0,0 +1,80 @@
# Fix SSH Keys by recreating through SSH service
# Run as Administrator on DR VM (10.0.20.37)
$ErrorActionPreference = "Stop"
Write-Host "=== Fix SSH Keys via Service Method ===" -ForegroundColor Cyan
Write-Host ""
# Step 1: Stop SSH service
Write-Host "[1/4] Stopping SSH service..." -ForegroundColor Yellow
Stop-Service sshd
Start-Sleep -Seconds 2
Write-Host " SSH service stopped" -ForegroundColor Green
# Step 2: Delete the problematic file while service is stopped
Write-Host "[2/4] Deleting old authorized_keys file..." -ForegroundColor Yellow
$authKeysFile = "C:\ProgramData\ssh\administrators_authorized_keys"
if (Test-Path $authKeysFile) {
# Try to take ownership first
takeown /F $authKeysFile /A
icacls $authKeysFile /grant Administrators:F
Remove-Item $authKeysFile -Force
Write-Host " Old file deleted" -ForegroundColor Green
} else {
Write-Host " File doesn't exist" -ForegroundColor Gray
}
# Step 3: Create new file with both keys
Write-Host "[3/4] Creating new authorized_keys file..." -ForegroundColor Yellow
$bothKeys = @"
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC88mX/oQnAoU54kazp6iYmmg91IR8pbnYV3aw5aJfSsiSBUjqo+XbvrWRvq//lli48k2kuNfq8olKrPvqKHcIccbcbgFrES5k2ErSyXjvbUlxuyHFRIfBoXvAhMMX6LZR+4Qc0i3VThQ1PgY0tYDbf2XQBAyrog5EU9H/q2NzJEulTs7kSR0FIt1goWXqKJYLA9Pn7Ardt7doPzR8EH/spB8hXctO0BaAorX3p3rd4bvOZoOcht4pTmyJBRzoZRRlscCZRCOxjQDk+y4v9eOPzwMc0dRlVxIbqt8Sua5khGTlmeQTmDqxCmdtgrTNWT4hwPVG1L4Jfw2bgX3IqCGKB4juDUF+Eh6hrQeuTIF7xbCIGGy9N/lKIKO3vr4sTf51gVM9CWJ0bE/CTKbiRPfWbUXIUA4yZ96gJf0QAqcIcutnntomdtkdV8G1RYVKSQEE4oxF3mCRxR+1d5Fn/UXGlms9Q2u/QAq7n5BYLPczUFSkdBdfITOqiCIzlX8WpPD7v/vt8Wsbyf24B/FSYvp+X0AcX5qQbNeljChAxqRy6VNhmh5ucUkMFxfUSTWij+AVqmCPvxVVFKPw32G6jN59BmwirmIxd0i6wTRj3rrUuyO/6+kjErjthkYKFIDBAgdCnV0rrkrPRNKmbS0DtgRcID3ILq2UqR3AYmDf2azf8hQ== mmarius28@gmail.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD3EdHswdNDuDC9kJdUli2zGGPVlEWJjmqtb4eABYWwjQnWqjGp8oAFbQ+r2TxR544WtEyhDL9BU6oO3EFH957DBGQJHJvfRgx2VnkNZEzN/XX/7HK6Cp5rlINGGp26PjHulKkZjARmjC3YK0aUFEkiyNyUBqhtQpmcYP4+wjUfiiO2xUkF9mzGplbWGK3ZmEdkWNd5BNddqxmxyLvd2KHAo8F7Vux9SyPWqZ8bwiDyidAMDU7kCXS/RabUMl2LGajzFbRnR87YA7cIaVFl/IWExO/fsYlgkwmmmIAMdjINp0IWDdydnmG1XNNhM8h/BKY/eK3uile8CvyEbmbuf0+ePm3Ex9vTjn4jYN2vFE148FgQGGTibibJ+sXFoQ87VFNGEuog/V0aajVk/xcOihszsEvzD2IV/tSKJFdI6klnYLuieuMZf7Dvs/6sC1l3dnsBtcpvjnU48altRRZvQzaJf3gIkG1lRGBgyW1n+WHe/7StIveYTVNFtx+fcnqB8gm9fZQxBp2WRbLNFpY/Qj+6BF66b1A2ZxH/3F9Z/6VT91EActOf+AMxjsI+09d7IRYIvzr8OxMPYOHU2bglp3o86xZEMUXfcjB8Sw/8KMsCjBp3ABEN9/bwv1496aw9IC67ZBQ2cDDfgdBej5DAkT4NS2XIx7wbM7sBtLYjcXMi7w== administrator@ROA-CARAPETRU2
"@
# Create the file
$bothKeys | Out-File -FilePath $authKeysFile -Encoding ASCII -NoNewline -Force
# Set permissions using icacls (more reliable than PowerShell ACL)
icacls $authKeysFile /inheritance:r
icacls $authKeysFile /grant "NT AUTHORITY\SYSTEM:(F)"
icacls $authKeysFile /grant "BUILTIN\Administrators:(R)"
Write-Host " New file created with correct permissions" -ForegroundColor Green
# Step 4: Start SSH service
Write-Host "[4/4] Starting SSH service..." -ForegroundColor Yellow
Start-Service sshd
Start-Sleep -Seconds 2
Write-Host " SSH service started" -ForegroundColor Green
# Verification
Write-Host ""
Write-Host "=== Verification ===" -ForegroundColor Cyan
Write-Host ""
Write-Host "File permissions:" -ForegroundColor Yellow
icacls $authKeysFile
Write-Host ""
Write-Host "File content (number of lines):" -ForegroundColor Yellow
$lines = Get-Content $authKeysFile
Write-Host " Total keys: $($lines.Count)" -ForegroundColor White
foreach ($line in $lines) {
if ($line -match "ssh-rsa .+ (.+)$") {
Write-Host "$($matches[1])" -ForegroundColor Green
}
}
Write-Host ""
Write-Host "SSH service status:" -ForegroundColor Yellow
Get-Service sshd | Format-Table Name, Status, StartType -AutoSize
Write-Host ""
Write-Host "=== Setup Complete ===" -ForegroundColor Green
Write-Host ""
Write-Host "Next: Test SSH connection from PRIMARY server" -ForegroundColor Cyan
Write-Host ""

View File

@@ -0,0 +1,101 @@
@echo off
REM RMAN Restore Database - FINAL VERSION
REM Backups are in FRA - RMAN will find them automatically
REM Run this script as Administrator on DR VM (10.0.20.37)
set ORACLE_HOME=C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home
set ORACLE_SID=ROA
set PATH=%ORACLE_HOME%\bin;%PATH%
echo ============================================
echo RMAN Database Restore - DR VM (FINAL)
echo ============================================
echo.
echo Database: ROA
echo DBID: 1363569330
echo Backups: C:\Users\oracle\recovery_area\ROA\autobackup
echo.
REM Create temp directory
if not exist D:\oracle\temp mkdir D:\oracle\temp
REM Step 1: Shutdown database if running
echo [1/5] Shutting down database if running...
echo SHUTDOWN ABORT; > D:\oracle\temp\shutdown.sql
echo EXIT; >> D:\oracle\temp\shutdown.sql
sqlplus -s / as sysdba @D:\oracle\temp\shutdown.sql > nul 2>&1
timeout /t 2 /nobreak > nul
REM Step 2: Startup NOMOUNT
echo [2/5] Starting database in NOMOUNT mode...
echo STARTUP NOMOUNT PFILE='C:\Users\oracle\admin\ROA\pfile\initROA.ora'; > D:\oracle\temp\nomount.sql
echo EXIT; >> D:\oracle\temp\nomount.sql
sqlplus / as sysdba @D:\oracle\temp\nomount.sql
timeout /t 3 /nobreak > nul
REM Step 3: Create simplified RMAN script
echo [3/5] Creating RMAN restore script...
set RMAN_SCRIPT=D:\oracle\temp\restore_final.rman
echo SET DBID 1363569330; > %RMAN_SCRIPT%
echo. >> %RMAN_SCRIPT%
echo RUN { >> %RMAN_SCRIPT%
echo ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT 'C:/Users/oracle/recovery_area/ROA/autobackup/%%U'; >> %RMAN_SCRIPT%
echo RESTORE CONTROLFILE FROM 'C:/Users/oracle/recovery_area/ROA/autobackup/O1_MF_S_1214013953_NGFVLL29_.BKP'; >> %RMAN_SCRIPT%
echo RELEASE CHANNEL ch1; >> %RMAN_SCRIPT%
echo } >> %RMAN_SCRIPT%
echo. >> %RMAN_SCRIPT%
echo ALTER DATABASE MOUNT; >> %RMAN_SCRIPT%
echo. >> %RMAN_SCRIPT%
echo CATALOG START WITH 'C:/Users/oracle/recovery_area/ROA/autobackup' NOPROMPT; >> %RMAN_SCRIPT%
echo. >> %RMAN_SCRIPT%
echo RUN { >> %RMAN_SCRIPT%
echo ALLOCATE CHANNEL ch1 DEVICE TYPE DISK; >> %RMAN_SCRIPT%
echo ALLOCATE CHANNEL ch2 DEVICE TYPE DISK; >> %RMAN_SCRIPT%
echo RESTORE DATABASE; >> %RMAN_SCRIPT%
echo RELEASE CHANNEL ch1; >> %RMAN_SCRIPT%
echo RELEASE CHANNEL ch2; >> %RMAN_SCRIPT%
echo } >> %RMAN_SCRIPT%
echo. >> %RMAN_SCRIPT%
echo RUN { >> %RMAN_SCRIPT%
echo ALLOCATE CHANNEL ch1 DEVICE TYPE DISK; >> %RMAN_SCRIPT%
echo RECOVER DATABASE NOREDO; >> %RMAN_SCRIPT%
echo RELEASE CHANNEL ch1; >> %RMAN_SCRIPT%
echo } >> %RMAN_SCRIPT%
echo. >> %RMAN_SCRIPT%
echo ALTER DATABASE OPEN RESETLOGS; >> %RMAN_SCRIPT%
echo. >> %RMAN_SCRIPT%
echo ALTER TABLESPACE TEMP ADD TEMPFILE 'C:\Users\oracle\oradata\ROA\temp01.dbf' SIZE 567M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE 32767M; >> %RMAN_SCRIPT%
echo. >> %RMAN_SCRIPT%
echo EXIT; >> %RMAN_SCRIPT%
REM Step 4: Run RMAN restore
echo [4/5] Running RMAN restore (this will take 10-20 minutes)...
rman target / cmdfile=%RMAN_SCRIPT% log=D:\oracle\logs\rman_restore_final.log
REM Step 5: Verify database status
echo.
echo [5/5] Verifying database status...
echo SET PAGESIZE 100 LINESIZE 200 > D:\oracle\temp\verify.sql
echo SELECT 'DB_NAME: ' ^|^| NAME ^|^| ', OPEN_MODE: ' ^|^| OPEN_MODE FROM V$DATABASE; >> D:\oracle\temp\verify.sql
echo SELECT 'INSTANCE: ' ^|^| INSTANCE_NAME ^|^| ', STATUS: ' ^|^| STATUS FROM V$INSTANCE; >> D:\oracle\temp\verify.sql
echo SELECT 'TABLESPACES: ' ^|^| COUNT(*) FROM DBA_TABLESPACES; >> D:\oracle\temp\verify.sql
echo SELECT 'DATAFILES: ' ^|^| COUNT(*) FROM DBA_DATA_FILES; >> D:\oracle\temp\verify.sql
echo SELECT 'TABLES: ' ^|^| COUNT(*) FROM DBA_TABLES WHERE OWNER NOT IN ('SYS','SYSTEM'); >> D:\oracle\temp\verify.sql
echo EXIT; >> D:\oracle\temp\verify.sql
sqlplus -s / as sysdba @D:\oracle\temp\verify.sql
echo.
echo ============================================
echo Database Restore Complete!
echo ============================================
echo.
echo Log: D:\oracle\logs\rman_restore_final.log
echo.
echo Next steps:
echo 1. Test database connectivity
echo 2. Verify application tables
echo 3. Configure RMAN retention
echo 4. Shutdown DR VM to conserve resources
echo.

View File

@@ -5,8 +5,9 @@
param(
[string]$SourceFRA = "C:\Users\Oracle\recovery_area\ROA",
[string]$DRHost = "10.0.20.37",
[string]$DRUser = "root",
[string]$DRPath = "/opt/oracle/backups/primary",
[int]$DRPort = 22122,
[string]$DRUser = "romfast",
[string]$DRPath = "D:/oracle/backups/primary",
[string]$SSHKeyPath = "$env:USERPROFILE\.ssh\id_rsa",
[string]$LogFile = "D:\rman_backup\logs\transfer_incr_$(Get-Date -Format 'yyyyMMdd_HHmm').log"
)
@@ -55,8 +56,8 @@ try {
Write-Log "DR Server: $DRHost"
# Test SSH connection
Write-Log "Testing SSH connection..."
$null = & ssh -n -i $SSHKeyPath -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${DRUser}@${DRHost}" "exit 0" 2>&1
Write-Log "Testing SSH connection to $DRHost`:$DRPort..."
$null = & ssh -n -p $DRPort -i $SSHKeyPath -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${DRUser}@${DRHost}" "exit 0" 2>&1
if ($LASTEXITCODE -ne 0) {
throw "SSH connection failed"
}
@@ -82,11 +83,11 @@ try {
$fileName = $file.Name
$fileSizeMB = [math]::Round($file.Length / 1MB, 2)
# Check dacă fișierul există deja pe DR (skip duplicates)
$checkCmd = "test -f $DRPath/$fileName && echo EXISTS || echo MISSING"
$checkResult = & ssh -n -i $SSHKeyPath "${DRUser}@${DRHost}" $checkCmd 2>&1
# Check dacă fișierul există deja pe DR (skip duplicates) - Windows PowerShell command
$checkCmd = "powershell -Command `"Test-Path '$DRPath/$fileName'`""
$checkResult = & ssh -n -p $DRPort -i $SSHKeyPath "${DRUser}@${DRHost}" $checkCmd 2>&1
if ($checkResult -match "EXISTS") {
if ($checkResult -match "True") {
Write-Log "Skipping (already on DR): $fileName" "INFO"
$successCount++
continue
@@ -95,7 +96,7 @@ try {
Write-Log "Transferring: $fileName ($fileSizeMB MB)"
# SCP optimized: no compression (already compressed), fast cipher
$null = & scp -i $SSHKeyPath -o StrictHostKeyChecking=no -o Compression=no -o Cipher=aes128-gcm@openssh.com `
$null = & scp -P $DRPort -i $SSHKeyPath -o StrictHostKeyChecking=no -o Compression=no -o Cipher=aes128-gcm@openssh.com `
$file.FullName `
"${DRUser}@${DRHost}:${DRPath}/$fileName" 2>&1

View File

@@ -5,8 +5,9 @@
param(
[string]$SourceFRA = "C:\Users\Oracle\recovery_area\ROA",
[string]$DRHost = "10.0.20.37",
[string]$DRUser = "root",
[string]$DRPath = "/opt/oracle/backups/primary",
[int]$DRPort = 22122,
[string]$DRUser = "romfast",
[string]$DRPath = "D:/oracle/backups/primary",
[string]$SSHKeyPath = "$env:USERPROFILE\.ssh\id_rsa",
[int]$RetentionDays = 2,
[string]$LogFile = "D:\rman_backup\logs\transfer_$(Get-Date -Format 'yyyyMMdd').log"
@@ -23,11 +24,11 @@ function Write-Log {
}
function Test-SSHConnection {
Write-Log "Testing SSH connection to $DRHost..."
Write-Log "Testing SSH connection to $DRHost`:$DRPort..."
try {
# Folosește -n pentru a nu citi din stdin (fix pentru blocare)
$null = & ssh -n -i $SSHKeyPath -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${DRUser}@${DRHost}" "exit 0" 2>&1
$null = & ssh -n -p $DRPort -i $SSHKeyPath -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${DRUser}@${DRHost}" "exit 0" 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Log "SSH connection successful" "SUCCESS"
@@ -86,11 +87,11 @@ function Transfer-FileToDR {
$fileSizeMB = [math]::Round($File.Length / 1MB, 2)
try {
# Check dacă fișierul există deja pe DR (skip duplicates)
$checkCmd = "test -f $DestPath/$fileName && echo EXISTS || echo MISSING"
$checkResult = & ssh -n -i $SSHKeyPath "${DRUser}@${DRHost}" $checkCmd 2>&1
# Check dacă fișierul există deja pe DR (skip duplicates) - Windows PowerShell command
$checkCmd = "powershell -Command `"Test-Path '$DestPath/$fileName'`""
$checkResult = & ssh -n -p $DRPort -i $SSHKeyPath "${DRUser}@${DRHost}" $checkCmd 2>&1
if ($checkResult -match "EXISTS") {
if ($checkResult -match "True") {
Write-Log "Skipping (already on DR): $fileName" "INFO"
return $true
}
@@ -99,7 +100,7 @@ function Transfer-FileToDR {
# SCP transfer - NO compression (files already compressed by RMAN)
# Use cipher aes128-gcm for better performance
$null = & scp -i $SSHKeyPath -o StrictHostKeyChecking=no -o Compression=no -o Cipher=aes128-gcm@openssh.com $File.FullName "${DRUser}@${DRHost}:${DestPath}/" 2>&1
$null = & scp -P $DRPort -i $SSHKeyPath -o StrictHostKeyChecking=no -o Compression=no -o Cipher=aes128-gcm@openssh.com $File.FullName "${DRUser}@${DRHost}:${DestPath}/" 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Log "Transferred: $fileName" "SUCCESS"
@@ -115,18 +116,15 @@ function Transfer-FileToDR {
}
function Cleanup-OldBackupsOnDR {
Write-Log "Cleaning up old backups on DR (keeping last 2 days)..."
Write-Log "Cleaning up old backups on DR (keeping last $RetentionDays days)..."
try {
# Cleanup: șterge fișiere mai vechi de 2 zile (48 ore)
$cleanupCmd = "find $DRPath -name '*.BKP' -type f -mtime +2 -delete -print"
$result = & ssh -n -i $SSHKeyPath "${DRUser}@${DRHost}" $cleanupCmd 2>&1
# Cleanup: șterge fișiere mai vechi de $RetentionDays zile - Windows PowerShell command
$retentionDate = (Get-Date).AddDays(-$RetentionDays).ToString("yyyy-MM-dd")
$cleanupCmd = "powershell -Command `"Get-ChildItem -Path '$DRPath' -Recurse -File | Where-Object { `$_.LastWriteTime -lt '$retentionDate' } | Remove-Item -Force -ErrorAction SilentlyContinue`""
$result = & ssh -n -p $DRPort -i $SSHKeyPath "${DRUser}@${DRHost}" $cleanupCmd 2>&1
if ($result) {
Write-Log "Cleanup: Deleted old backups: $result"
} else {
Write-Log "No old backups to cleanup (all files < 2 days)"
}
Write-Log "Cleanup completed on DR (removed files older than $retentionDate)"
} catch {
Write-Log "Cleanup warning: $_" "WARNING"
}
@@ -156,9 +154,9 @@ try {
throw "Cannot connect to DR server via SSH"
}
# Creare director pe DR
# Creare director pe DR - Windows PowerShell command
Write-Log "Ensuring DR directory exists..."
$null = & ssh -n -i $SSHKeyPath "${DRUser}@${DRHost}" "mkdir -p $DRPath && chmod 755 $DRPath" 2>&1
$null = & ssh -n -p $DRPort -i $SSHKeyPath "${DRUser}@${DRHost}" "powershell -Command `"New-Item -ItemType Directory -Path '$DRPath' -Force | Out-Null`"" 2>&1
# Găsește backup-uri
$backupFiles = Get-TodaysBackups