当发生数据库更改(插入,更新,删除)时,如何获取实时通知?


13

我正在创建一个仪表板,该仪表板应监视数据库表。我只有数据库访问权限(没有应用程序层)。该表相当大(1000万行),但是变化不快(每分钟100次插入/更新)

我如何找出表格是否改变了?我会尝试每秒访问数据库,但这似乎是一种蛮力的方法...

数据库:MySQL / Postgres


这可能会有所帮助。我们正在使用它来监视我们的服务器场。我很确定这将具有跟踪数据库中表更改的功能。不幸的是,我们还没有配置表级别。因此,我不知道要配置到表级别。
裘德·尼罗山

感谢您的评论。但是,nagios有什么帮助?我只有数据库访问权限。我无法在远程计算机上安装任何东西。
基里尔

3
您是否真的想在每次插入或更新行时实时收到通知?再想想。
图兰斯·科尔多瓦

有没有任何没有应用层的正当理由?在我看来,做事的最佳方法就是拥有处理监视的应用程序层。例如,从数据库服务器发送电子邮件看起来并不干净。
juhist

我有一个小型的mysql插件可以做到这一点:github.com/Cyclonecode/mysql-notification
Cyclonecode

Answers:


9

您可以使用触发器。

CREATE TRIGGER notifyMe
ON table1
AFTER INSERT, UPDATE, DELETE 
AS
   EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'DB AutoMailer',
        @recipients = 'user@example.com',
        @body = 'The DB has changed',
        @subject = 'DB Change';
GO

我不确定这是否比每秒访问数据库更好,还是您将整个更改发送给邮件,让仪表板软件解析电子邮件?
基里尔

1
您可以通过从“插入”,“更新”和“已删除”表中进行选择来获取特定的更改值,并且可以将ID添加到正文中。
stechray,2015年

2
除了发送电子邮件,您还可以调用存储过程,该存储过程连接到仪表板支持的Web api。看到这里的细节:forums.asp.net/t/...
stechray

3
或者让触发器将数据放入另一个表中,然后按所需的时间间隔查询(并清空)。从技术上讲不是实时的,但是可以使它看起来像它。
Jan Doggen

1
让触发器将更新信息推送到消息传递代理的队列(或主题)上。这一直是我最喜欢的方法。这样,您在触发器中就没有任何复杂的逻辑,并且在收到消息时可以灵活地处理消息。而且,如果您推送到发布/订阅主题,您甚至可以让多个消费者接受该主题并对其进行不同的处理。
mindcrime

3

对于PostgreSQL,我知道一种在行更改时从数据库获取通知的方法。

  1. 发生插入/更新/删除时使用触发器。
  2. 事件发生时,向客户端套接字发送通知。
  3. 确保您的应用具有服务器的客户端。
  4. 那么您的应用将收到通知。

您可以查看我的代码PostgreSQL的文档

似乎该通知不是可靠的通知,但至少对我有用。


好的方法。这基本上是自定义触发器?
基里尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.