- Add comprehensive Oracle backup and DR strategy documentation - Add RMAN backup scripts (full and incremental) - Add PowerShell transfer scripts for DR site - Add bash restore and verification scripts - Reorganize Oracle documentation structure - Add Proxmox troubleshooting guide for VM 201 HA errors and NFS storage issues 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
749 lines
22 KiB
Markdown
749 lines
22 KiB
Markdown
# 🚀 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.**
|