Como obter notificações em tempo real, quando ocorre uma alteração no banco de dados (inserir, atualizar, excluir)?

12

Estou criando um painel que deve monitorar uma tabela de banco de dados. Eu tenho apenas acesso ao banco de dados (sem camada de aplicativo). A tabela é bastante grande (10 milhões de linhas), mas não muda rapidamente (100 inserções / atualizações por minuto)

Como posso descobrir se a tabela mudou? Eu tentaria acessar o banco de dados a cada segundo, mas isso parece uma abordagem de força bruta ...

Bancos de dados: MySQL / Postgres

Kiril
fonte
Isso pode ser útil . Estamos usando isso para monitorar nosso farm de servidores. Tenho certeza de que esse recurso poderá rastrear uma alteração de tabela no banco de dados. Infelizmente, não configuramos até o nível da tabela. Portanto, não estou ciente de configurar até o nível da tabela.
Jude Niroshan
Obrigado pelo comentário. Mas como os nagios podem ajudar? Eu tenho apenas acesso ao banco de dados. Não consigo instalar nada em máquinas remotas.
Kiril
3
Deseja realmente ser notificado - em tempo real - sempre que uma linha for inserida ou atualizada? Pense de novo.
Tulains Córdova
Existe algum motivo válido para você não ter uma camada de aplicativo? Parece-me a melhor maneira de fazer as coisas, ou seja, ter uma camada de aplicação que lide com o monitoramento. Por exemplo, enviar e-mail do servidor de banco de dados não parece uma arquitetura limpa.
juhist
Eu tenho um pequeno plug-in mysql que faz isso: github.com/Cyclonecode/mysql-notification
Cyclonecode

Respostas:

9

Você pode usar gatilhos.

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
fonte
Não sei se isso seria melhor do que acessar o banco de dados a cada segundo, ou você enviaria toda a alteração no correio e deixaria o software do painel analisar o email?
Kiril
1
Você pode obter os valores alterados específicos selecionando as tabelas 'inseridas', 'atualizadas' e 'excluídas' e pode adicionar os IDs ao corpo.
Stechray
2
Em vez de enviar email, você também pode chamar um procedimento armazenado que se conecta a uma API da Web suportada pelo painel. Veja aqui para detalhes: forums.asp.net/t/…
stechray
3
Ou faça com que os gatilhos coloquem dados em uma tabela adicional que você consulta (e esvazia) nos intervalos desejados. Não é tecnicamente 'tempo real', mas pode ser feito para parecer com isso.
Jan Doggen
1
Faça com que o gatilho envie as informações de atualização para uma fila (ou tópico) em um broker de sistema de mensagens. Essa sempre foi minha abordagem favorita. Dessa forma, você não tem nenhuma lógica complexa no gatilho e tem muita flexibilidade com o que faz com a mensagem quando a recebe. E se você passar para um tópico de pub / sub, pode até ter vários consumidores recebendo e fazendo coisas diferentes com ele.
mindcrime
3

Para o PostgreSQL, conheço uma maneira de receber notificações do banco de dados quando uma linha é alterada.

  1. use o gatilho quando ocorrer inserção / atualização / exclusão.
  2. Quando ocorrer um evento, envie uma notificação para um soquete do cliente.
  3. verifique se você tem um cliente no servidor.
  4. seu aplicativo receberá uma notificação.

Você pode ver meu código ou a documentação do PostgreSQL .

Parece que a notificação não é confiável, mas pelo menos funciona para mim.

user275831
fonte
Boa abordagem. Este é basicamente um gatilho personalizado?
Kiril