# 🌐Verificaciones Oracle Data Guard en RAC 19c: Real-Time Apply sin sorpresas.

Esta guía paso a paso está diseñada para que puedas validar de manera segura y efectiva el estado de tu entorno Data Guard, especialmente tras reinicios, parcheos o eventos de failover. Incluye comandos clave, interpretación de resultados, y acción correctiva para asegurar que tu standby esté siempre listo para proteger tu entorno crítico.

## 🔍 1. Verificación de sincronización primaria - standby

```sql
-- En base primaria:
SELECT thread#, MAX(sequence#) "Last Sequence"
FROM v$archived_log
WHERE applied = 'NO'
GROUP BY thread#;

-- Alternativa:
SELECT thread#, sequence#, applied FROM v$archived_log ORDER BY sequence# DESC;
```

```sql
-- Usando script (Dataguard synchronization), te dejo todo lo necesario en los bonus.
Thread Last Sequence Received Last Sequence Applied Difference
      1                  24239                 24239          0
      2                  25528                 25528          0
```

✅ **Sincronización perfecta** si el "Difference" es 0 para todos los threads.

---

## 📊 2. Verificar estado del destino Data Guard en la base primaria

```sql
SET LINES 200
COL DESTINATION FORMAT A40
COL STATUS FORMAT A10
COL RECOVERY_MODE FORMAT A25

SELECT dest_id, destination, status, recovery_mode
FROM v$archive_dest_status
WHERE dest_id = 2;
```

**Resultado esperado:**

| DEST\_ID | DESTINATION | STATUS | RECOVERY\_MODE |
| --- | --- | --- | --- |
| 2 | botica19c\_oci | VALID | MANAGED REAL TIME APPLY |

✅ Esto confirma que **la base primaria está enviando logs en tiempo real** a la standby.

---

## 📃 3. Estado general de todos los destinos

```sql
SELECT destination, status, type, recovery_mode
FROM v$archive_dest_status
WHERE recovery_mode IS NOT NULL;
```

✅ Confirmar que solo `botica19c_oci` está activo como destino `PHYSICAL` y en modo `REAL TIME APPLY`. Los demás pueden estar `INACTIVE`.

---

## 🌐 4. Verificación de la base standby (botica19c\_oci)

```sql
-- En standby:
SELECT database_role, open_mode, protection_mode FROM v$database;
```

**Resultado esperado:**

```sql
PHYSICAL STANDBY | MOUNTED | MAXIMUM PERFORMANCE
```

✅ La base está en modo standby montado (no abierta), lista para recibir y aplicar logs.

```sql
-- Ver proceso MRP:
SELECT process, status FROM v$managed_standby WHERE process = 'MRP0';
```

**Resultado esperado:**

```sql
PROCESS | STATUS
--------|--------
MRP0    | APPLYING_LOG
```

✅ `MRP0` activo = aplicación en tiempo real funcionando.

---

## ⚡ Checklist Rápida

| ✅ Verificación | Estado Esperado |
| --- | --- |
| `MRP0` corriendo en standby | `APPLYING_LOG` |
| Base standby en `MOUNTED` | `PHYSICAL STANDBY` y `MOUNTED` |
| Destino `LOG_ARCHIVE_DEST_2` en primaria | `VALID`, `REAL TIME APPLY` |
| Dataguard synchronization/ secuencia aplicada = recibida | `Difference = 0` |

---

## 🛠️ 5. Verificación del estado de recursos en Oracle Grid Infrastructure (CRS) con `srvctl` y `crsctl`

Desde el usuario `grid`, puedes validar que los recursos de base de datos estén correctamente registrados, online y con el home correcto:

```sql
crsctl stat res -w "TYPE = ora.database.type" -t
```

**Ejemplo de salida esperada:**

```sql
ora.botiquin_oci.db
    1 ONLINE  ONLINE exabotica-area51 Open,HOME=/u02/app/oracle/product/12.2.0/dbhome_5,STABLE
    2 ONLINE  ONLINE exabotica-area52 Open,HOME=/u02/app/oracle/product/12.2.0/dbhome_5,STABLE

ora.botica19c_oci.db
    1 ONLINE  ONLINE exabotica-area51 Open,HOME=/u02/app/oracle/product/19.0.0.0/dbhome_1,STABLE
    2 ONLINE  ONLINE exabotica-area52 Open,HOME=/u02/app/oracle/product/19.0.0.0/dbhome_1,STABLE
```

✅ Verificá que el estado esté `ONLINE`, el home correcto (`dbhome_X`) y que cada nodo esté reportando el estado como `STABLE`.

También puedes validar la base con `srvctl`:

```sql
srvctl status database -d botica19c_oci
srvctl config database -d botica19c_oci
```

---

## ⚡ Checklist Rápida

| ✅ Verificación | Estado Esperado |
| --- | --- |
| `MRP0` corriendo en standby | `APPLYING_LOG` |
| Base standby en `MOUNTED` | `PHYSICAL STANDBY` y `MOUNTED` |
| Destino `LOG_ARCHIVE_DEST_2` en primaria | `VALID`, `REAL TIME APPLY` |
| `DG`synchronization / secuencia aplicada = recibida | `Difference = 0` |
| `crsctl stat res -t` en estado `ONLINE` | Recursos online, sin errores |

## 🔧 Comando para reiniciar `MRP` (si se detiene)

```sql
-- En standby:
START MRP;
-- o:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT
```

# BONUS:

## 💻 Script `.sh` para automatizar validaciones básicas:

Dado que parte de las verificaciones pertenecen al contexto del usuario `grid` (infraestructura) y otras al usuario `oracle` (base de datos), se recomienda separar los scripts o coordinar su ejecución desde un entorno con privilegios compartidos.

### ✅ Script para usuario `oracle` (validaciones Data Guard)

```sql
#!/bin/bash
# check_dataguard_oracle.sh

ORACLE_SID=BOTICA19C1
. /home/oracle/.bash_profile

echo "Verificando MRP0 en standby..."
sqlplus -s / as sysdba <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT 'MRP0 status: ' || status FROM v\$managed_standby WHERE process = 'MRP0';
EOF

echo -e "\nVerificando destino de standby (dest_id=2)..."
sqlplus -s / as sysdba <<EOF
SET LINES 200
COL destination FOR A30
COL recovery_mode FOR A30
SELECT destination, status, recovery_mode FROM v\$archive_dest_status WHERE dest_id = 2;
EOF
```

### ✅ Script para usuario `grid` (estado CRS)

```sql
#!/bin/bash
# check_grid_crsctl.sh

. /home/grid/.bash_profile

echo "Estado de bases de datos en Clusterware:"
crsctl stat res -w "TYPE = ora.database.type" -t | grep -Ei 'botica|gis'
```

✅ Estos scripts pueden integrarse en procesos automatizados por separado, o llamarse desde un orquestador común si hay acceso entre cuentas (ej: `sudo`, `cron` centralizado, herramientas de observabilidad).

> 📥 **Descargá los scripts completos de verificación desde GitHub**
> 
> [🧪 Ir al repositorio »](https://github.com/laboticadeldba/REPOSITORIO/tree/main/dg_checker_scripts)

## 💊 Si esta guía te sirvió para dejar tu Data Guard en modo zen y tus instancias bien sincronizadas, ¡misión cumplida!

🚀 Si te gustó el contenido, compartelo con tu equipo, guardalo en tu caja de primeros auxilios y no te olvides de suscribirte al boletín de **La Botica del DBA** desde:

🔗 [www.laboticadeldba.com](https://www.laboticadeldba.com)

Ahí seguimos publicando tips, guías, scripts y anécdotas del día a día del DBA — sin vueltas, directo al grano.

📮 ¿Tienes una duda, una historia técnica o quieres colaborar con el blog?  
Escribime a **admin@laboticadeldba.com**

Nos vemos en la próxima dosis técnica 😉  
— *El Boticario del DBA*
