¿Cómo obtener notificaciones en tiempo real, cuando se produce un cambio en la base de datos (insertar, actualizar, eliminar)?

13

Estoy creando un tablero que debe monitorear una tabla de base de datos. Solo tengo acceso a la base de datos (sin capa de aplicación). La tabla es bastante grande (10 millones de filas), sin embargo, no cambia rápidamente (100 inserciones / actualizaciones por minuto)

¿Cómo puedo saber si la tabla cambió? Intentaría golpear la base de datos cada segundo, pero esto parece un enfoque de fuerza bruta ...

Bases de datos: MySQL / Postgres

Kiril
fuente
Esto puede ser útil . Estamos usando esto para monitorear nuestra granja de servidores. Estoy bastante seguro de que esto tendrá la función de rastrear un cambio de tabla en DB. Lamentablemente no hemos configurado hasta el nivel de la tabla. Por lo tanto, no estoy al tanto de configurar hasta el nivel de la tabla.
Jude Niroshan
Gracias por el comentario. ¿Pero cómo pueden ayudar los nagios? Solo tengo acceso a la base de datos. No puedo instalar nada en máquinas remotas.
Kiril
3
¿Realmente desea ser notificado, en tiempo real, cada vez que se inserta o actualiza una fila? Piensa otra vez.
Tulains Córdova
¿Hay alguna razón válida por la que no tienes una capa de aplicación? Me parece la mejor manera de hacer las cosas, es decir, tener una capa de aplicación que maneje el monitoreo. Por ejemplo, enviar correo electrónico desde el servidor de la base de datos no parece una arquitectura limpia.
juhist
Tengo un pequeño complemento mysql que hace esto: github.com/Cyclonecode/mysql-notification
Cyclonecode

Respuestas:

9

Puedes usar disparadores.

CREATE TRIGGER notifyMe
ON table1
AFTER INSERT, UPDATE, DELETE 
AS
   EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'DB AutoMailer',
        @recipients = '[email protected]',
        @body = 'The DB has changed',
        @subject = 'DB Change';
GO
Stechray
fuente
No estoy seguro de que esto sea mejor, que llegar a la base de datos cada segundo, o ¿enviarías todo el cambio por correo y dejarías que el software del tablero analice el correo electrónico?
Kiril
1
Puede obtener los valores modificados específicos seleccionando las tablas 'insertado', 'actualizado' y 'eliminado', y puede agregar los identificadores al cuerpo.
stechray
2
En lugar de enviar un correo electrónico, también puede llamar a un procedimiento almacenado que se conecta a una API web que admite el tablero. Vea aquí para más detalles: forums.asp.net/t/…
stechray
3
O haga que los desencadenantes pongan datos en una tabla adicional que luego consulta (y vacía) en los intervalos que desee. Técnicamente no es en "tiempo real", pero se puede hacer que se parezca.
Jan Doggen
1
Haga que el activador inserte la información de actualización en una cola (o tema) en un agente de mensajería. Este siempre ha sido mi enfoque favorito. De esta manera, no tiene ninguna lógica compleja en el disparador, y tiene mucha flexibilidad con lo que hace con el mensaje cuando lo recibe. Y si empuja a un tema de pub / sub, incluso puede hacer que varios consumidores lo reciban y hagan cosas diferentes con él.
mindcrime
3

Para PostgreSQL, sé una forma de recibir notificaciones de la base de datos cuando cambia una fila.

  1. use el disparador cuando ocurra insertar / actualizar / eliminar.
  2. Cuando ocurra el evento, envíe una notificación a un socket de cliente.
  3. asegúrese de que la aplicación tenga un cliente para el servidor.
  4. entonces su aplicación recibirá una notificación.

Puedes ver mi código o la documentación de PostgreSQL .

Parece que la notificación no es una notificación confiable, pero al menos funciona para mí.

usuario275831
fuente
Buen enfoque. ¿Esto es básicamente un disparador personalizado?
Kiril