Estamos usando MariaDb en producción y hemos agregado un esclavo de MariaDb para que nuestro equipo de datos pueda realizar algunas tareas de ETL desde este esclavo a nuestro almacén de datos. Sin embargo, carecen de una función adecuada de Captura de datos modificados (es decir, quieren saber qué filas de la tabla de producción cambiaron desde ayer para consultar las filas que realmente cambiaron).
Vi que MariaDb 10.3 tenía una función interesante que permitía realizar una SELECCIÓN en una versión anterior de una tabla. Sin embargo, no he encontrado recursos que respalden la idea de que podría usarse para CDC, ¿algún comentario sobre esta función?
Si no es así, probablemente recurriremos a transmitir los binlogs del esclavo a nuestro almacén de datos, pero eso parece un desafío.
¡Gracias por tu ayuda!
(Como complemento a la respuesta de Stefans)
Sí, el control de versiones del sistema se puede usar para CDC porque el período de validez en ROW_START (el objeto comienza a ser válido) y ROW_END (el objeto ahora no es válido) se puede interpretar cuando se produce una consulta de INSERCIÓN, ACTUALIZACIÓN o ELIMINACIÓN. Pero es más engorroso que con las variantes CDC alternativas.
INSERTAR:
ACTUALIZAR:
ELIMINAR:
Voy a añadir una imagen para aclarar esto.
Puede ver que este control de versiones ahorra espacio porque puede combinar la información sobre INSERTAR y ELIMINAR de un objeto en una línea, pero verificar las ELIMINACIONES es costoso.
En el ejemplo anterior, utilicé una tabla con una clave principal clara. Entonces, verificar el mismo objeto es fácil: solo mire la identificación. Si desea capturar cambios en talbes con una combinación de teclas, esto también puede hacer que todo el proceso sea más molesto.
Editar: otro punto es que los datos del protocolo se mantienen en la misma tabla que los datos "reales". Tal vez esto sea más rápido para un INSERT que una solución alternativa conocida como el seguimiento por TRIGGER ( como aquí ), pero si los cambios se realizan con bastante frecuencia en la tabla y desea procesar/analizar los datos de CDC, esto puede causar problemas de rendimiento.
MariaDB admite tablas con versiones del sistema desde la versión 10.3.4 . Las tablas de versiones del sistema se especifican en el estándar SQL:2011. Se pueden utilizar para capturar automáticamente versiones anteriores de filas. A continuación, se pueden consultar esas versiones para recuperar sus valores, ya que se han establecido en un momento específico.
El siguiente ejemplo de texto y código es de la documentación oficial de MariaDB
Con tablas versionadas por el sistema, MariaDB Server realiza un seguimiento de los puntos en el tiempo cuando cambian las filas. Cuando actualiza una fila en estas tablas, crea una nueva fila para mostrar como actual sin eliminar los datos anteriores. Este seguimiento permanece transparente para la aplicación. Al consultar una tabla versionada por el sistema, puede recuperar los valores más actuales de cada fila o los valores históricos disponibles en un momento determinado.
Esta función puede resultarle útil para realizar un seguimiento eficiente del tiempo de los cambios en los valores supervisados continuamente que no cambian con frecuencia, como los cambios de temperatura en el transcurso de un año. El control de versiones del sistema suele ser útil para la auditoría.
Al agregar SYSTEM VERSIONING a una tabla recién creada o ya existente (usando ALTER ), la tabla se expandirá con las columnas de marca de tiempo row_start y row_end que permiten recuperar el registro válido dentro del tiempo entre las marcas de tiempo de inicio y fin.
CREATE TABLE accounts ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), amount INT ) WITH SYSTEM VERSIONING; Entonces es posible recuperar datos tal como estaban en un momento específico (con SELECT * FROM accounts FOR SYSTEM_TIME AS OF '2019-06-18 11:00'; ), todas las versiones dentro de un rango de tiempo específico
SELECT * FROM accounts FOR SYSTEM_TIME BETWEEN (NOW() - INTERVAL 1 YEAR) AND NOW();o todas las versiones a la vez:
SELECT * FROM accounts FOR SYSTEM_TIME ALL;