Oracle Data Guard es una de las tecnologías más importantes dentro del ecosistema Oracle para implementar alta disponibilidad, protección de datos y recuperación ante desastres.
Si trabajas como DBA, Production Support, SRE o administrador de infraestructura Oracle, conocer los comandos básicos de Data Guard puede ayudarte a determinar rápidamente si existe un problema de redo transport, apply lag, archive logs, Managed Recovery Process o conectividad entre Primary y Standby.
En esta guía veremos algunos de los comandos SQL, Data Guard Broker y comandos de sistema operativo que considero más útiles para operaciones y troubleshooting.
Nota: Los comandos pueden variar dependiendo de la versión de Oracle, arquitectura RAC/Single Instance, configuración de Data Guard y uso o no de Data Guard Broker. Antes de ejecutar operaciones de switchover, failover, reinicio o modificación en producción, valida siempre el procedimiento específico de tu organización.
1. Identificar el rol de la base de datos
Una de las primeras consultas que deberíamos ejecutar es:
SELECT
name,
database_role,
open_mode,
protection_mode,
protection_level
FROM v$database;
Podríamos obtener:
NAME DATABASE_ROLE OPEN_MODE
--------- ------------------ --------------------
PROD PRIMARY READ WRITE
En el Standby podríamos encontrar:
DATABASE_ROLE
----------------
PHYSICAL STANDBY
OPEN_MODE
--------------------
MOUNTED
o, dependiendo de la configuración:
READ ONLY WITH APPLY
Este debería ser uno de los primeros pasos durante troubleshooting:
¿Estoy conectado al Primary o al Standby?
2. Consultar la configuración básica
SELECT
db_unique_name,
database_role,
open_mode,
switchover_status
FROM v$database;
DB_UNIQUE_NAME es especialmente importante en Data Guard porque permite diferenciar las bases que participan en la configuración.
Por ejemplo:
PROD
PROD_DR
3. Revisar destinos de Archive Log
Una consulta fundamental:
SELECT
dest_id,
status,
destination,
error
FROM v$archive_dest
WHERE status <> 'INACTIVE';
Esto nos permite detectar errores en los destinos configurados para transportar redo.
También podemos revisar:
SELECT
dest_id,
status,
target,
destination,
error
FROM v$archive_dest_status
WHERE status <> 'INACTIVE';
Si existe un problema de transporte, la columna:
ERROR
puede proporcionar una pista muy importante.
4. Revisar parámetros LOG_ARCHIVE_DEST
SHOW PARAMETER log_archive_dest
También:
SHOW PARAMETER log_archive_config
y:
SHOW PARAMETER fal
Esto ayuda a revisar parámetros como:
LOG_ARCHIVE_CONFIG
LOG_ARCHIVE_DEST_1
LOG_ARCHIVE_DEST_2
FAL_SERVER
FAL_CLIENT
La configuración exacta dependerá de la versión y arquitectura utilizada.
5. Forzar un log switch
En el Primary:
ALTER SYSTEM SWITCH LOGFILE;
Otra operación que podemos utilizar durante determinadas verificaciones es:
ALTER SYSTEM ARCHIVE LOG CURRENT;
Esto puede ayudarnos durante pruebas de transporte y aplicación de redo.
No debe utilizarse repetidamente sin motivo en producción.
6. Revisar Archive Logs
SELECT
thread#,
sequence#,
archived,
status
FROM v$log
ORDER BY thread#, sequence#;
Para revisar archive logs:
SELECT
thread#,
sequence#,
first_time,
next_time,
applied
FROM v$archived_log
ORDER BY sequence# DESC
FETCH FIRST 20 ROWS ONLY;
En ambientes RAC debemos prestar atención a:
THREAD#
porque cada instancia puede generar su propio redo thread.
7. Revisar procesos de Data Guard
En el Standby:
SELECT
process,
status,
thread#,
sequence#
FROM v$managed_standby;
Dependiendo de la versión/configuración podemos encontrar procesos relacionados con:
MRP0
RFS
ARCH
Conceptualmente:
Primary
↓
Redo
↓
Network
↓
RFS
↓
Standby Redo Logs
↓
MRP
↓
Standby Database
En versiones recientes también es importante conocer vistas como V$DATAGUARD_PROCESS.
8. Revisar Data Guard Statistics
Una de las consultas más importantes:
SELECT
name,
value,
unit
FROM v$dataguard_stats;
En un Physical Standby, presta especial atención a:
transport lag
apply lag
apply finish time
estimated startup time
Dos conceptos fundamentales son:
Transport Lag
Indica el retraso relacionado con el transporte de redo desde el Primary hacia el Standby.
Apply Lag
Indica cuánto retraso existe entre el Primary y el redo aplicado en el Standby.
No son exactamente el mismo problema.
9. Revisar Apply Lag
Podemos enfocarnos específicamente en:
SELECT
name,
value,
unit
FROM v$dataguard_stats
WHERE name IN ('transport lag','apply lag');
Ejemplo:
transport lag +00 00:00:02
apply lag +00 00:15:30
Esto podría indicar que el redo está llegando al Standby, pero existe retraso en su aplicación.
Esa diferencia es extremadamente importante durante troubleshooting.
10. Revisar Archive Gap
Una consulta muy conocida:
SELECT *
FROM v$archive_gap;
Si no devuelve filas, no significa automáticamente que toda la configuración esté perfecta, pero puede ayudarnos a identificar gaps que Data Guard necesita resolver.
Si existe un gap podríamos encontrar algo similar a:
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
------- ------------- --------------
1 10520 10525
11. Comparar último archive recibido y aplicado
En el Standby:
SELECT
thread#,
MAX(sequence#) AS last_received
FROM v$archived_log
GROUP BY thread#;
Para revisar el último aplicado:
SELECT
thread#,
MAX(sequence#) AS last_applied
FROM v$archived_log
WHERE applied = 'YES'
GROUP BY thread#;
También podemos combinarlos conceptualmente para determinar:
Last Received
↓
Last Applied
↓
Difference
Si el Standby recibe redo pero no lo aplica, debemos investigar el proceso de recuperación.
12. Iniciar Managed Recovery
En un Physical Standby, dependiendo de versión y configuración:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
DISCONNECT FROM SESSION;
En versiones/configuraciones donde se utiliza Real-Time Apply:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE
DISCONNECT FROM SESSION;
La sintaxis y necesidad de USING CURRENT LOGFILE dependen de la versión de Oracle.
13. Detener Managed Recovery
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Esta operación afecta directamente la aplicación de redo.
En producción no debería ejecutarse simplemente para “probar” si el problema desaparece.
14. Revisar Standby Redo Logs
SELECT
group#,
thread#,
sequence#,
bytes/1024/1024 AS size_mb,
status
FROM v$standby_log
ORDER BY thread#, group#;
Los Standby Redo Logs son fundamentales especialmente cuando utilizamos Real-Time Apply.
También debemos verificar que su número y tamaño sean apropiados para la configuración.
15. Revisar Online Redo Logs
SELECT
group#,
thread#,
sequence#,
bytes/1024/1024 AS size_mb,
status
FROM v$log
ORDER BY thread#, group#;
Esto es útil para comparar los Online Redo Logs del Primary con los Standby Redo Logs.
16. Revisar errores relacionados con Data Guard
Podemos consultar:
SELECT
severity,
error_code,
message,
timestamp
FROM v$dataguard_status
ORDER BY timestamp DESC;
Esta vista puede proporcionar información importante sobre eventos y errores relacionados con Data Guard.
17. Revisar el Alert Log
Además de las vistas de Oracle, siempre debemos correlacionar con el Alert Log.
Con ADRCI:
adrci
Después:
show homes
Seleccionar el home correspondiente:
set homepath diag/rdbms/prod/PROD
Consultar alertas:
show alert -tail 100
Seguir el alert log:
show alert -tail -f
Durante problemas de Data Guard podemos encontrar errores relacionados con:
ORA-16xxx
ORA-12xxx
TNS errors
Archive destination errors
Recovery errors
Redo transport errors
18. Verificar conectividad Oracle Net
Desde el servidor correspondiente:
tnsping PROD_DR
También:
tnsping PROD
Pero recuerda:
tnsping no demuestra que la base de datos esté completamente funcional.
Principalmente ayuda a verificar resolución y conectividad Oracle Net hacia el listener.
19. Revisar Listener
lsnrctl status
Servicios registrados:
lsnrctl services
Durante un problema de Data Guard, la conectividad puede involucrar:
Primary
↓
Oracle Net
↓
DNS
↓
Network / Firewall
↓
Listener
↓
Standby
20. Data Guard Broker
Si la configuración utiliza Data Guard Broker, una de las herramientas principales es:
dgmgrl
Conectar:
DGMGRL> CONNECT /
o según el método de autenticación utilizado.
Mostrar configuración:
DGMGRL> SHOW CONFIGURATION;
Este es uno de los comandos que deberías memorizar.
21. Revisar una base con Broker
DGMGRL> SHOW DATABASE PROD;
Para obtener información más detallada:
DGMGRL> SHOW DATABASE VERBOSE PROD;
Standby:
DGMGRL> SHOW DATABASE VERBOSE PROD_DR;
22. Validar una base
En versiones que soportan esta funcionalidad:
DGMGRL> VALIDATE DATABASE PROD;
Para Standby:
DGMGRL> VALIDATE DATABASE PROD_DR;
Puede proporcionar información muy útil antes de determinadas operaciones de Data Guard.
23. Revisar configuración completa con Broker
DGMGRL> SHOW CONFIGURATION VERBOSE;
Podemos encontrar información relacionada con:
Protection Mode
Members
Primary Database
Physical Standby Database
Configuration Status
Idealmente queremos ver:
SUCCESS
Si encontramos:
WARNING
ERROR
debemos investigar el miembro afectado.
24. Switchover
Con Data Guard Broker:
DGMGRL> SWITCHOVER TO PROD_DR;
Un switchover es un cambio planificado de roles.
Conceptualmente:
ANTES
PROD
PRIMARY
↓
PROD_DR
STANDBY
DESPUÉS
PROD
STANDBY
↑
PROD_DR
PRIMARY
No debe ejecutarse sin verificar previamente salud, lag, conectividad, readiness y procedimientos de cambio.
25. Failover
Con Broker:
DGMGRL> FAILOVER TO PROD_DR;
Pero aquí debemos hacer una distinción fundamental:
Switchover ≠ Failover
Switchover
Operación planificada donde Primary y Standby intercambian roles.
Failover
Operación utilizada normalmente cuando el Primary no puede continuar prestando servicio.
Un failover puede tener consecuencias importantes para recuperación, reintegración del antiguo Primary y potencial pérdida de datos dependiendo del modo de protección y estado de sincronización.
Nunca debería utilizarse como una simple prueba en producción.
26. Verificar Switchover Status
Desde SQL:
SELECT
database_role,
switchover_status
FROM v$database;
Podemos encontrar estados como:
TO STANDBY
TO PRIMARY
SESSIONS ACTIVE
NOT ALLOWED
La interpretación exacta depende del rol y estado de la base.
27. Verificar Force Logging
Para Data Guard es importante revisar:
SELECT
force_logging
FROM v$database;
Por ejemplo:
FORCE_LOGGING
-------------
YES
28. Flashback Database
Puede ser importante para determinadas estrategias de reintegración:
SELECT
flashback_on
FROM v$database;
Resultado:
FLASHBACK_ON
------------------
YES
Especialmente cuando se utiliza Broker, Flashback Database puede facilitar ciertos escenarios de reinstatement después de un failover.
29. Revisar procesos desde Linux
Podemos comprobar procesos Oracle:
ps -ef | grep ora_
Por ejemplo:
ps -ef | grep mrp
o:
ps -ef | grep rfs
Sin embargo, las vistas dinámicas de Oracle normalmente proporcionan una visión más confiable del estado lógico de Data Guard.
30. Los comandos que deberías memorizar
Si estás comenzando con Oracle Data Guard, empezaría por estos.
SQL
SELECT database_role, open_mode
FROM v$database;
SELECT *
FROM v$archive_gap;
SELECT name, value, unit
FROM v$dataguard_stats;
SELECT process, status, thread#, sequence#
FROM v$managed_standby;
SELECT dest_id, status, destination, error
FROM v$archive_dest_status
WHERE status <> 'INACTIVE';
SELECT *
FROM v$standby_log;
ALTER SYSTEM SWITCH LOGFILE;
Data Guard Broker
dgmgrl
SHOW CONFIGURATION;
SHOW CONFIGURATION VERBOSE;
SHOW DATABASE PROD;
SHOW DATABASE VERBOSE PROD_DR;
VALIDATE DATABASE PROD_DR;
Sistema operativo
tnsping PROD_DR
lsnrctl status
lsnrctl services
adrci
Metodología de troubleshooting
Supongamos que recibimos una alerta:
“Oracle Standby database is 30 minutes behind Primary.”
No deberíamos comenzar reiniciando Data Guard.
Primero necesitamos determinar:
¿Primary está saludable?
↓
DATABASE_ROLE / OPEN_MODE
↓
¿Se está generando redo?
↓
Redo / Archive Logs
↓
¿Redo está siendo transportado?
↓
LOG_ARCHIVE_DEST
↓
¿Existe Transport Lag?
↓
V$DATAGUARD_STATS
↓
¿Existe Archive Gap?
↓
V$ARCHIVE_GAP
↓
¿Redo está llegando al Standby?
↓
RFS
↓
¿MRP está ejecutándose?
↓
Managed Recovery
↓
¿Existe Apply Lag?
↓
V$DATAGUARD_STATS
↓
¿Hay errores?
↓
V$DATAGUARD_STATUS / Alert Log
↓
Network / Listener
↓
Root Cause Analysis
Transport Lag vs Apply Lag
Esta diferencia es fundamental.
Si encontramos:
transport lag = 30 minutes
apply lag = 30 minutes
podríamos sospechar primero de:
redo transport / network / archive destination / connectivity.
Pero si encontramos:
transport lag = 2 seconds
apply lag = 30 minutes
el escenario cambia.
El redo está llegando prácticamente a tiempo, pero el Standby no consigue aplicarlo suficientemente rápido.
Ahora investigaríamos aspectos como:
MRP
CPU
I/O
Standby performance
Recovery errors
Redo generation rate
Standby Redo Logs
Esta distinción puede reducir muchísimo el tiempo de diagnóstico.
Una metodología sencilla para recordar
Piensa en Data Guard como una tubería:
PRIMARY
↓
Redo Generation
↓
Redo Transport
↓
Network
↓
RFS
↓
Standby Redo Logs
↓
MRP
↓
Redo Apply
↓
STANDBY
Cuando Data Guard tiene problemas, la pregunta más importante no es:
“¿Está funcionando Data Guard?”
Una mejor pregunta es:
“¿En qué parte del flujo dejó de avanzar el redo?”
Si identificamos correctamente ese punto, podemos decidir si debemos investigar Primary, transporte, red, listener, RFS, Standby Redo Logs, MRP, I/O o capacidad del Standby.
El objetivo de administrar Data Guard no es solamente mantener un Standby encendido. Es asegurarnos de que, cuando realmente necesitemos utilizarlo, tengamos una copia suficientemente actualizada y operacional para proteger la continuidad del negocio.
¿Qué comando utilizas primero cuando detectas Data Guard lag?
