- 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>
727 lines
26 KiB
Markdown
727 lines
26 KiB
Markdown
# 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
|