From 5bed910b1c2b1e19fe4b6408ac58366a68b35338 Mon Sep 17 00:00:00 2001 From: Marius Date: Sat, 11 Oct 2025 10:59:43 +0300 Subject: [PATCH] Oracle DR: Optimize test speed by preserving service between tests Performance improvements: - cleanup_database.ps1: Skip service deletion (saves ~25s per test) - Remove oradim -delete, sc.exe delete, registry cleanup - Add SPFILE deletion to ensure PFILE-based startup - Service now persists between tests for reuse - rman_restore_from_zero.ps1: Smart service check (saves ~15s per test) - Check if service exists before creating - Skip oradim -new if service already present - Only create service on first run or if missing Total time savings: ~40 seconds per weekly DR test Service lifecycle: Created once, reused indefinitely until manual cleanup Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- .../cleanup_database.ps1 | 39 +++++-------------- .../rman_restore_from_zero.ps1 | 35 ++++++++++------- 2 files changed, 31 insertions(+), 43 deletions(-) diff --git a/oracle/standby-server-scripts/cleanup_database.ps1 b/oracle/standby-server-scripts/cleanup_database.ps1 index d29592f..b798c82 100644 --- a/oracle/standby-server-scripts/cleanup_database.ps1 +++ b/oracle/standby-server-scripts/cleanup_database.ps1 @@ -59,40 +59,18 @@ if ($service) { } Start-Sleep -Seconds 2 -Write-Host "[2/6] Stopping and deleting Oracle service + registry + instance..." +Write-Host "[2/6] Oracle service cleanup skipped (service preserved for next test)" +Write-Host " Service will be reused for faster subsequent restores (~15s saved)" -# Method 1: Use oradim to delete Oracle instance -$env:ORACLE_HOME = "C:\Users\Administrator\Downloads\WINDOWS.X64_193000_db_home" -$env:PATH = "$env:ORACLE_HOME\bin;$env:PATH" -& oradim -delete -sid ROA 2>&1 | Out-Null -Write-Host " Oracle instance deleted with oradim" - -# Method 2: Delete service directly (backup method) -$service = Get-Service -Name "OracleServiceROA" -ErrorAction SilentlyContinue -if ($service) { - Stop-Service -Name "OracleServiceROA" -Force -ErrorAction SilentlyContinue - Start-Sleep -Seconds 2 - & sc.exe delete OracleServiceROA 2>&1 | Out-Null - Write-Host " Oracle service deleted with sc" -} - -# Method 3: Delete Oracle registry keys -$regPath = "HKLM:\SOFTWARE\ORACLE\KEY_OraDB19Home1" -Remove-ItemProperty -Path $regPath -Name "ORA_ROA_PFILE" -ErrorAction SilentlyContinue -Remove-ItemProperty -Path $regPath -Name "ORA_ROA_AUTOSTART" -ErrorAction SilentlyContinue -Remove-ItemProperty -Path $regPath -Name "ORA_ROA_SHUTDOWN" -ErrorAction SilentlyContinue -Remove-ItemProperty -Path $regPath -Name "ORA_ROA_SHUTDOWNTYPE" -ErrorAction SilentlyContinue -Remove-ItemProperty -Path $regPath -Name "ORA_ROA_SHUTDOWN_TIMEOUT" -ErrorAction SilentlyContinue -Write-Host " Registry keys cleaned" -Start-Sleep -Seconds 2 - -Write-Host "[3/6] Deleting database files..." +Write-Host "[3/6] Deleting database files + SPFILE..." Write-Host " Deleting datafiles..." Remove-Item "C:\Users\oracle\oradata\ROA\*.dbf" -Force -ErrorAction SilentlyContinue Write-Host " Deleting control files..." Remove-Item "C:\Users\oracle\oradata\ROA\*.ctl" -Force -ErrorAction SilentlyContinue Write-Host " Deleting redo logs..." Remove-Item "C:\Users\oracle\oradata\ROA\*.log" -Force -ErrorAction SilentlyContinue +Write-Host " Deleting SPFILE (ensures PFILE-based startup)..." +Remove-Item "$env:ORACLE_HOME\database\SPFILE*.ORA" -Force -ErrorAction SilentlyContinue Write-Host "[4/6] Deleting local FRA (backups are on F:\)..." if (Test-Path "C:\Users\oracle\recovery_area\ROA") { @@ -117,15 +95,16 @@ Write-Host "" Write-Host "Current state:" Write-Host " [YES] Oracle software installed" Write-Host " [YES] PFILE exists (C:\Users\oracle\admin\ROA\pfile\initROA.ora)" -Write-Host " [NO] Oracle service (will be created during restore)" +Write-Host " [YES] Oracle service (preserved, will be reused)" +Write-Host " [NO] SPFILE (deleted to ensure PFILE startup)" Write-Host " [NO] Database files (will be restored from backups)" Write-Host " [NO] Control files (will be restored from backups)" Write-Host " [NO] Datafiles (will be restored from backups)" Write-Host "" -Write-Host "VM is now in COMPLETELY CLEAN STATE!" +Write-Host "VM is now in CLEAN STATE (service preserved)!" Write-Host "" Write-Host "Next step: Run D:\oracle\scripts\rman_restore_from_zero.ps1" -Write-Host " (It will create the Oracle service and restore the database)" +Write-Host " (It will reuse the existing Oracle service and restore the database)" Write-Host "" exit 0 diff --git a/oracle/standby-server-scripts/rman_restore_from_zero.ps1 b/oracle/standby-server-scripts/rman_restore_from_zero.ps1 index b2489c6..6d68b19 100644 --- a/oracle/standby-server-scripts/rman_restore_from_zero.ps1 +++ b/oracle/standby-server-scripts/rman_restore_from_zero.ps1 @@ -81,21 +81,30 @@ Write-Host "STEP 2: RESTORE - Restore from F:\ backups" Write-Host "============================================" Write-Host "" -# Step 2.1: Create Oracle service -Write-Host "[2.1] Creating Oracle service from PFILE..." -if (-not (Test-Path "C:\Users\oracle\admin\ROA\pfile\initROA.ora")) { - Write-Host "ERROR: PFILE not found at C:\Users\oracle\admin\ROA\pfile\initROA.ora" -ForegroundColor Red - Write-Host "Cannot create Oracle service without PFILE!" - exit 1 -} +# Step 2.1: Check Oracle service (create only if missing) +Write-Host "[2.1] Checking Oracle service..." +$service = Get-Service -Name "OracleServiceROA" -ErrorAction SilentlyContinue -& oradim -new -sid ROA -startmode auto -pfile "C:\Users\oracle\admin\ROA\pfile\initROA.ora" 2>&1 | Out-Null -if ($LASTEXITCODE -ne 0) { - Write-Host "ERROR: Failed to create Oracle service" -ForegroundColor Red - exit 1 +if ($service) { + Write-Host "[OK] Oracle service already exists, skipping creation (15s saved!)" -ForegroundColor Green + Write-Host " Service will be reused for this restore" +} else { + Write-Host " Oracle service not found, creating from PFILE..." + + if (-not (Test-Path "C:\Users\oracle\admin\ROA\pfile\initROA.ora")) { + Write-Host "ERROR: PFILE not found at C:\Users\oracle\admin\ROA\pfile\initROA.ora" -ForegroundColor Red + Write-Host "Cannot create Oracle service without PFILE!" + exit 1 + } + + & oradim -new -sid ROA -startmode auto -pfile "C:\Users\oracle\admin\ROA\pfile\initROA.ora" 2>&1 | Out-Null + if ($LASTEXITCODE -ne 0) { + Write-Host "ERROR: Failed to create Oracle service" -ForegroundColor Red + exit 1 + } + Write-Host "[OK] Oracle service created successfully (AUTOMATIC startup)" + Start-Sleep -Seconds 2 } -Write-Host "[OK] Oracle service created successfully (AUTOMATIC startup)" -Start-Sleep -Seconds 2 # Step 2.2: Startup NOMOUNT Write-Host "[2.2] Starting database in NOMOUNT mode..."