Как получать уведомления в режиме реального времени, когда происходит изменение базы данных (вставка, обновление, удаление)?

13

Я создаю панель мониторинга, которая должна отслеживать таблицу базы данных. У меня есть только доступ к базе данных (без уровня приложения). Таблица довольно большая (10 миллионов строк), но не меняется быстро (100 вставок / обновлений в минуту)

Как я могу узнать, изменилась ли таблица? Я бы пытался попасть в базу данных каждую секунду, но это похоже на грубый подход ...

Базы данных: MySQL / Postgres

Кирил
источник
Это может быть полезно . Мы используем это для мониторинга нашей фермы серверов. Я почти уверен, что у него будет возможность отслеживать изменение таблицы в БД. К сожалению, мы не настроили до уровня таблицы. Итак, я не знаю о настройке до уровня таблицы.
Джуд Нирошан
Спасибо за комментарий. Но как нагиос может помочь? У меня есть только доступ к базе данных. Я не могу ничего установить на удаленные машины.
Кирилл
3
Вы действительно хотите получать уведомления - в режиме реального времени - каждый раз, когда строка вставляется или обновляется? Подумай еще раз.
Тулаинс Кордова
Есть ли веская причина, по которой у вас нет прикладного уровня? Казалось бы, лучший способ сделать это, то есть иметь прикладной уровень, который обрабатывает мониторинг. Например, отправка электронной почты с сервера базы данных не выглядит чистой архитектурой.
Юрист
У меня есть небольшой плагин MySQL, который делает это: github.com/Cyclonecode/mysql-notification
Cyclonecode

Ответы:

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
stechray
источник
Я не уверен, что это будет лучше, чем попадание в базу данных каждую секунду, или вы бы отправили все изменения по почте, и позволили программному обеспечению приборной панели анализировать электронную почту?
Кирилл
1
Вы можете получить конкретные измененные значения, выбрав их из таблиц «вставлено», «обновлено» и «удалено», и вы можете добавить идентификаторы в тело.
Stechray
2
Вместо отправки электронной почты вы также можете вызвать хранимую процедуру, которая подключается к веб-API, который поддерживает панель мониторинга. Подробности смотрите здесь: forums.asp.net/t/…
stechray
3
Или же триггеры помещают данные в дополнительную таблицу, которую вы затем запрашиваете (и очищаете) с желаемыми интервалами. Технически не «в режиме реального времени», но может выглядеть так.
Ян Догген
1
Пусть триггер отправит информацию об обновлении в очередь (или тему) в брокере обмена сообщениями. Это всегда был мой любимый подход. Таким образом, у вас не будет сложной логики в триггере, и вы будете иметь большую гибкость с тем, что вы делаете с сообщением при его получении. И если вы переходите к теме паба / подтемы, у вас может быть даже несколько потребителей, которые получают ее и делают с ней разные вещи.
mindcrime
3

Для PostgreSQL я знаю способ получения уведомлений из базы данных при изменении строки.

  1. использовать триггер, когда происходит вставка / обновление / удаление.
  2. когда происходит событие, отправьте уведомление клиентскому сокету.
  3. убедитесь, что у вашего приложения есть клиент на сервере.
  4. тогда ваше приложение получит уведомление.

Вы можете увидеть мой код или документацию PostgreSQL .

Кажется, уведомление не является надежным уведомлением, но, по крайней мере, оно работает для меня.

user275831
источник
Хороший подход. Это в основном пользовательский триггер?
Кирил