En un entorno de bases de datos Oracle, una "standby activa en real time query" es una copia de tu base de datos principal que está constantemente actualizada y lista para ser usada casi al instante.
Imagina que tienes tu base de datos principal, donde se realizan todas las operaciones diarias, como agregar, actualizar o eliminar datos. La "standby" es una copia de esta base de datos, que está ahí como respaldo por si algo le pasa a la principal.
Actualización en Tiempo Real: Una "standby activa" significa que esta copia de respaldo se está actualizando continuamente con cada cambio que ocurre en la base de datos principal. Es decir, cualquier modificación en la base de datos principal se refleja casi al instante en la standby.
¿Qué es Real Time Query? Consultas en Tiempo Real: Normalmente, una base de datos de respaldo está ahí solo para ser utilizada en caso de emergencia, pero con "real time query" (consulta en tiempo real), puedes hacer consultas a esta base de datos de respaldo mientras sigue recibiendo actualizaciones de la base de datos principal.
Lectura en Vivo: Puedes hacer preguntas (consultas) a esta base de datos de respaldo para obtener datos actualizados sin tener que molestar a la base de datos principal. Esto es útil para distribuir la carga de trabajo y mejorar el rendimiento.
Mejor Rendimiento: Puedes usar la standby activa para realizar consultas, lo que reduce la carga en la base de datos principal y mejora el rendimiento general.
Distribución de Carga: Las consultas de lectura (por ejemplo, reportes, análisis de datos) pueden dirigirse a la standby activa, permitiendo que la base de datos principal maneje las operaciones de escritura y actualización.
En resumen, una standby activa en real time query es como tener una copia exacta de tu base de datos principal en tiempo real que también está disponible para ejecutar consultas en modo lectura sin interrumpir el trabajo principal.
Ahora, "redirección de DML" (Data Manipulation Language) significa que puedes hacer que las operaciones de actualización, inserción, o eliminación de datos (los famosos comandos DML como INSERT, UPDATE, DELETE) que normalmente se hacen en la base de datos principal, se redirijan temporalmente a la base de datos de respaldo.
En mi caso las consultas que entran por servicio de lectura de la Standby registran previamente en una tabla los datos de la consulta que van a hacer. Son pocas ejecuciones al día por lo que se plantea habilitar redirección de DML.
Haremos una prueba previa donde vemos que, como es de esperar, no podemos insertar información en la Standby en Real Time Query:
sqlplus prueba/prueba@/lab-002:1521/api.domain.local
PRUEBA@//lab-002:1521/api.domain.local> insert into LAB_CALLS (id,DATE_,TIMESTAMP,FINISHED,url) values ('9999999',to_date('25/10/23','DD/MM/RR'),to_date('25/10/23','DD/MM/RR'),to_date('25/10/23','DD/MM/RR'),'prueba');
insert into LAB_CALLS (id,DATE_,TIMESTAMP,FINISHED,url) values ('9999999',to_date('25/10/23','DD/MM/RR'),to_date('25/10/23','DD/MM/RR'),to_date('25/10/23','DD/MM/RR'),'prueba')
*
ERROR at line 1:
ORA-16000: database or pluggable database open for read-only access <<-- Lo esperado
aa
PRUEBA@//lab-002:1521/api.domain.local> alter session enable adg_redirect_dml;
PRUEBA@//lab-002:1521/api.domain.local> insert into LAB_CALLS (id,DATE_,TIMESTAMP,FINISHED,url) values ('9999999',to_date('25/10/23','DD/MM/RR'),to_date('25/10/23','DD/MM/RR'),to_date('25/10/23','DD/MM/RR'),'prueba');
1 row created.
PRUEBA@//lab-002:1521/api.domain.local> commit;
-- Compruebo en la primaria
SQL> select * from PRUEBA.LAB_CALLS where id='9999999';
ID DATE_ TIMESTAMP FINISHED CLIENT URL BODY SESSIONID RESPONSESIZE FAILED SOURCEIP STATEMENTID FROMDATE TODATE QUERYMILLISECONDS PORT ANSWERPARTIAL TOTALMILLISECONDS SERVER
__________ ____________ ____________ ____________ _________ _________ _______ ____________ _______________ _________ ___________ ______________ ___________ _________ ____________________ _______ ________________ ____________________ _________
9999999 25-OCT-23 25-OCT-23 25-OCT-23 prueba
-- Compruebo en la Standby
PRUEBA@//lab-002:1521/api.domain.local> delete from LAB_CALLS where id='9999999';
1 row deleted.
Elapsed: 00:00:00.01
PRUEBA@//lab-002:1521/api.domain.local> commit;
Commit complete.
-- Compruebo en la Primaria
SQL> select * from PRUEBA.LAB_CALLS where id='9999999';
no se ha seleccionado ninguna fila
Perfecto! Hemos comprobado el funcionamiento a nivel de sesión. Y si queremos hacerlo persistente a nivel de BBDD?
-- Habilito en primaria y en Standby
alter system set adg_redirect_dml=true scope=both sid='*';
A tener en cuenta: Redirecting PL/SQL execution having bind variable was not supported.