Есть ли способ наблюдать за изменениями в базе данных mysql с помощью perl?

Я ищу решение, похожее на метод inotify для просмотра файлов на наличие изменений. Я знаю, что мог бы просмотреть файл binlog базы данных mysql и выполнить запросы, чтобы выбрать новые результаты, но это кажется очень неэффективным и неэлегантным; как и простое выполнение массы запросов в цикле в ожидании новых результатов.


person Drake    schedule 11.12.2010    source источник
comment
stackoverflow.com/questions/3501346/   -  person daxim    schedule 11.12.2010


Ответы (3)


Если вы добавите TRIGGER в интересующие вас таблицы, вы может использовать это, чтобы предупредить наблюдающее приложение. Вы можете сделать это несколькими способами:

  1. Создайте таблицу аудита в базе данных и попросите триггер записать туда соответствующую информацию; и пусть ваше наблюдающее приложение опрашивает таблицу аудита на наличие новых записей. Вы все еще проводите опрос, но контролируемым образом, который не слишком сильно ударит по серверу.
  2. Пусть триггер вызывает внешнее приложение через УДФ.
person Vince Bowdren    schedule 17.12.2010
comment
Это то, что я прокомментировал уже 6 дней назад как уже существующий ответ. Наслаждайтесь своей щедростью. - person daxim; 17.12.2010
comment
FWIW, я добавил этот ответ до того, как заметил ваш комментарий (который я проголосовал); и первое из предложенных мною решений отличается от вашего. Я действительно не занимался плагиатом. - person Vince Bowdren; 17.12.2010
comment
@daxim: Если вы хотели награду - вы должны были опубликовать свой комментарий в качестве ответа! ;-) - person Brad; 20.12.2010

Что касается таблиц MyISAM, вы можете посмотреть information_schema.TABLES.UPDATE_TIME. Это убережет вас от опроса всех интересующих вас таблиц. Для InnoDB просмотр binlog - лучшее, что я могу придумать.

person Mchl    schedule 11.12.2010

Другой подход состоит в том, чтобы сделать толчок/сигнал вместо опроса БД. Пусть любой процесс обновит базу данных, уведомите свой Perl-код о том, что обновление было выполнено через любой выбранный вами IPC (черт возьми, файл журнала, к которому добавляется имя изменяемой таблицы, может достаточно хорошо сработать).

Это особенно эффективно, если обновления довольно редкие/небольшие, но время реакции на них должно быть быстрым.

Дополнительным преимуществом является переносимость — работает для любого бэкэнда MySQL или для любого другого механизма БД.

person DVK    schedule 11.12.2010
comment
К сожалению, это не вариант, так как база данных обновляется какой-то другой сторонней программой, которую я использую, а сценарий perl, который я пишу, не обновляет базу данных. - person Drake; 11.12.2010