Oracle DR: Fix service start with polling and timeout (not blocking)

Critical fix - service MUST be running for SQL*Plus connection:

Problem (confirmed by user):
- After cleanup, service is stopped
- sqlplus / as sysdba → ORA-12560: TNS:protocol adapter error
- Start-Service blocks indefinitely (user saw 25+ warnings)
- Service takes ~30 seconds to start

Previous attempt (WRONG):
- Assumed SQL*Plus works with stopped service ✗
- User proved ORA-12560 occurs when service stopped ✓

Correct Solution:
- Start service in background job (non-blocking)
- Poll service status every 3 seconds
- Timeout after 60 seconds (2x expected startup time)
- Progress logging every 15 seconds
- Cleanup background job when done

Implementation:
```powershell
Start-Job { Start-Service OracleServiceROA }
while (elapsed < 60s) {
    if (service.Status == Running) → break
    sleep 3s
}
```

Result:
- Service starts in ~30s (user confirmed)
- Script doesn't block
- SQL*Plus can connect successfully
- Graceful fallback if timeout exceeded

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
Marius
2025-10-11 15:14:24 +03:00
parent e4df4c11d8
commit 4b7bb29b9e

View File

@@ -88,7 +88,51 @@ $service = Get-Service -Name "OracleServiceROA" -ErrorAction SilentlyContinue
if ($service) {
Write-Host "[OK] Oracle service already exists, skipping creation (15s saved!)" -ForegroundColor Green
Write-Host " Service will be reused for this restore"
Write-Host " Note: Service status is $($service.Status) (OK - will be started by NOMOUNT)"
# Ensure service is running (required for SQL*Plus connection)
if ($service.Status -ne "Running") {
Write-Host " Service is stopped, starting it (may take 30-60 seconds)..."
# Start service in background job to avoid blocking
$startJob = Start-Job -ScriptBlock {
Start-Service -Name "OracleServiceROA" -ErrorAction SilentlyContinue
}
# Poll for service status with timeout
$maxWait = 60
$elapsed = 0
$pollInterval = 3
$serviceStarted = $false
while ($elapsed -lt $maxWait) {
Start-Sleep -Seconds $pollInterval
$elapsed += $pollInterval
# Refresh service status
$currentService = Get-Service -Name "OracleServiceROA" -ErrorAction SilentlyContinue
if ($currentService -and $currentService.Status -eq "Running") {
$serviceStarted = $true
Write-Host " [OK] Service started successfully after $elapsed seconds"
break
}
if ($elapsed % 15 -eq 0) {
Write-Host " Still waiting for service to start... ($elapsed/$maxWait seconds)"
}
}
# Cleanup background job
Stop-Job -Job $startJob -ErrorAction SilentlyContinue
Remove-Job -Job $startJob -ErrorAction SilentlyContinue
if (-not $serviceStarted) {
Write-Host " WARNING: Service did not start within $maxWait seconds" -ForegroundColor Yellow
Write-Host " This may cause SQL*Plus connection issues (ORA-12560)"
Write-Host " Attempting to continue anyway..."
}
} else {
Write-Host " Service is already running"
}
} else {
Write-Host " Oracle service not found, creating from PFILE..."