# Fundamentos de Sincronización en Oracle Data Guard

Oracle Data Guard garantiza alta disponibilidad mediante una base standby que replica los cambios desde la primaria. En entornos como Oracle RAC, Exadata o nubes (OCI), esta replicación puede verse afectada por red, transporte de redo logs o errores de configuración.

Verifica siempre:

* Que los `db_unique_name` estén bien configurados
    
* Que los archivos `tnsnames.ora` y `listener.ora` estén definidos
    
* Que los destinos `LOG_ARCHIVE_DEST_n` estén activos y sin errores
    

---

## 🧪 Comandos Clave por Versión

### 🔹 Oracle 11g (NO multitenant, sin CDB/PDB)

SQL&gt; recover managed standby database cancel;  
Media recovery complete.  
SQL&gt; alter database open read only;  
  
Database altered.  
  
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;  
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

```sql
-- Abrir en modo solo lectura (para validaciones)
ALTER DATABASE OPEN READ ONLY;

-- Cancelar recuperación gestionada (mantenimiento)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- Reanudar recuperación
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
```

### 🔹 Oracle 12c (Soporta CDB/PDB, Broker funcional)

```sql
-- Arrancar instancia en modo MOUNT (standby)
STARTUP MOUNT;

-- Activar recuperación gestionada
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
```

### 🔹 Oracle 19c, 21c, 23ai (Real-Time Apply y Broker completo)

```sql
-- Real-Time Apply recomendado
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

-- Modo normal también válido
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
```

---

## 🔍 Validaciones con SQL

### 📌 Script estado\_dataguard.sql

```sql
SET LINES 200
COL dest_name FOR A20
COL destination FOR A50
COL error FOR A15
COL db_unique_name FOR A15
COL name FOR A100

SELECT dest_id, dest_name, target, name_space, destination, status, error, db_unique_name
FROM v$archive_dest
WHERE destination IS NOT NULL;

SELECT dest_id, dest_name, status, type, srl, recovery_mode
FROM v$archive_dest_status
WHERE dest_id = 2;

EXIT;
```

### 📌 Script dg\_sync.sql

```sql
SET LINE 180
SET PAGES 30

COLUMN LOGON_TIME FORMAT A20
COLUMN USERNAME FORMAT A15
COLUMN OSUSER FORMAT A20

SELECT
    ARCH.THREAD# "Thread",
    ARCH.SEQUENCE# "Last Sequence Received",
    APPL.SEQUENCE# "Last Sequence Applied",
    (ARCH.SEQUENCE# - APPL.SEQUENCE#) "Difference"
FROM
    (SELECT THREAD#, SEQUENCE#
     FROM V$ARCHIVED_LOG
     WHERE (THREAD#, FIRST_TIME) IN
           (SELECT THREAD#, MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH,
    (SELECT THREAD#, SEQUENCE#
     FROM V$LOG_HISTORY
     WHERE (THREAD#, FIRST_TIME) IN
           (SELECT THREAD#, MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL
WHERE
    ARCH.THREAD# = APPL.THREAD#
ORDER BY 1;

EXIT;
```

---

## 🛠️ Script Bash desde Primaria: `sync_dg_botica.sh`

```sql
#!/bin/bash
. /home/oracle/BOTICADB.env

sqlplus -s / as sysdba <<EOF
SET PAGESIZE 50
SET LINESIZE 180
PROMPT === Estado de sincronización Data Guard ===
@/home/oracle/scripts/dg_sync.sql
EOF
```

Puedes programarlo en `cron` o integrarlo con Zabbix/Nagios.

---

## Data Guard Broker (DGMGRL) — desde Oracle 12c+

### ⚙️ Paso 1: Habilitar Broker

```sql
ALTER SYSTEM SET DG_BROKER_START=true SCOPE=BOTH;
```

### 🔗 Paso 2: Crear Configuración

```sql
dgmgrl sys/password@primaria

CREATE CONFIGURATION 'DGCFG_BOTICA' AS
  PRIMARY DATABASE IS PRIMARIA_DB
  CONNECT IDENTIFIER IS primaria;

ADD DATABASE STANDBY_DB AS
  CONNECT IDENTIFIER IS standby
  MAINTAINED AS PHYSICAL;

ENABLE CONFIGURATION;
```

### 🔍 Validaciones

```sql
SHOW CONFIGURATION;
SHOW DATABASE VERBOSE PRIMARIA_DB;
SHOW DATABASE VERBOSE STANDBY_DB;
```

### ⟲ Switchover

```sql
dgmgrl
CONNECT /
SWITCHOVER TO 'STANDBY_DB';
```

### Failover (desastre)

```sql
FAILOVER TO 'STANDBY_DB' IMMEDIATE;
```

---

## 🔄 Reinicio Automático con `systemd`

Archivo: `/etc/systemd/system/syncdg-botica.service`

```sql
[Unit]
Description=Revisión automática de sincronización Oracle Data Guard

[Service]
User=oracle
ExecStart=/home/oracle/scripts/sync_dg_botica.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
```

Activar:

```sql
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable syncdg-botica.service
sudo systemctl start syncdg-botica.service
```

---

## 🧠 Tips de la Botica

* Usa `VALIDATE DATABASE VERBOSE` solo en versiones 12c+.
    
* Documenta cada `switchover` y `failover` cuidadosamente.
    
* Nunca dejes el `observer` sin monitorear (FSFO).
    
* En OCI, aprovecha FastConnect o Private Endpoints para baja latencia.
    

---

📧 admin@laboticadeldba.com — ¡Consulta casos específicos de HA, rendimiento o DR!

---

¿Tienes un caso específico o un entorno complejo que quieres revisar? Escríbeme en los comentarios o comunicate directo la casilla de correos **Admin@LaBoticaDelDBA.com** ¡En la botica siempre hay un elixir de soluciones para cada casuística, problema de rendimiento o alta disponibilidad!
