Я ищу решение, похожее на метод inotify для просмотра файлов на наличие изменений. Я знаю, что мог бы просмотреть файл binlog базы данных mysql и выполнить запросы, чтобы выбрать новые результаты, но это кажется очень неэффективным и неэлегантным; как и простое выполнение массы запросов в цикле в ожидании новых результатов.
Есть ли способ наблюдать за изменениями в базе данных mysql с помощью perl?
Ответы (3)
Если вы добавите TRIGGER в интересующие вас таблицы, вы может использовать это, чтобы предупредить наблюдающее приложение. Вы можете сделать это несколькими способами:
- Создайте таблицу аудита в базе данных и попросите триггер записать туда соответствующую информацию; и пусть ваше наблюдающее приложение опрашивает таблицу аудита на наличие новых записей. Вы все еще проводите опрос, но контролируемым образом, который не слишком сильно ударит по серверу.
- Пусть триггер вызывает внешнее приложение через УДФ.
Что касается таблиц MyISAM, вы можете посмотреть information_schema.TABLES.UPDATE_TIME
. Это убережет вас от опроса всех интересующих вас таблиц. Для InnoDB просмотр binlog - лучшее, что я могу придумать.
Другой подход состоит в том, чтобы сделать толчок/сигнал вместо опроса БД. Пусть любой процесс обновит базу данных, уведомите свой Perl-код о том, что обновление было выполнено через любой выбранный вами IPC (черт возьми, файл журнала, к которому добавляется имя изменяемой таблицы, может достаточно хорошо сработать).
Это особенно эффективно, если обновления довольно редкие/небольшие, но время реакции на них должно быть быстрым.
Дополнительным преимуществом является переносимость — работает для любого бэкэнда MySQL или для любого другого механизма БД.