Для моего домашнего проекта мне нужно контролировать веб-сервер и веб-сайт wordpress на нем с сервером Nagios. Оба сервера LAMP Debian 9, все настроено и работает.
Я использую Nagios XI и MariaDB с базой данных wordpress по умолчанию, объясняющей здесь.
В последней части мне нужно проверить все комментарии, опубликованные за последние 4 часа, чтобы избежать спам-кампании. Мне нужно установить порог предупреждения на 4 комментария за последние 4 часа и критический порог на 10 комментариев за последние 4 часа.
Я нашел плагин check_mysql_query.pl для Nagios. Но я немного растерялся, чтобы сделать это с помощью SQL-запроса. Согласно документу wordpress, я пытаюсь что-то вроде:
SELECT comment-date FROM wp-comments WHERE comment-data > ($current_time - 4h00)
Я хочу извлечь количество новых комментариев, добавленных в базу данных за последние 4 часа.
Я не знаю синтаксиса для ($current_time - 4h00)
И для моей команды плагина у меня есть что-то вроде:
./check_mysql_query.pl -H 192.168.0.1 -u user -p password -d wordpress -q mysqlquery -w 4 -c 10
Вот где я, но этот метод бесплатный, поэтому, если вы знаете, как выполнить эту команду (с некоторыми пояснениями, пожалуйста), это здорово. Но если вы знаете другие способы сделать это, я тоже был бы рад их увидеть. Спасибо.
Структура базы данных является структурой по умолчанию для веб-сайта wordpress, а имя базы данных — wordpress связь, поэтому комментарии хранятся в таблице wp_comments. Я не знаю, какой вывод мне нужен, чтобы сделать то, что описано выше, это моя точка зрения (извините, я новичок в SQL).
У меня нет времени проверять всю схему базы данных Wordpress. Но из вашего SQL-запроса, я думаю, вам нужно следующее
select comment-date
from wp-comments
where hour( localtime() - comment-date ) < 4
;
Обновить
Должен был добавить, что я не знаю синтаксиса MySQL. Правильная вещь должна быть
select comment-date
from wp-comments
where hour(timediff( localtime(), comment-date ) ) < 4
;
Спасибо за это, это может быть так, но вывод действительно случайный: MariaDB [wordpress]> SELECT comment_date FROM wp_comments WHERE hour( localtime() - comment_date ) < 4;
если я ввожу пять раз, я получаю 3 rows in set
-- 2 rows in set 1 warning
-- 2 rows in set 1 warning
-- 1 rows in set 3 warning
-- Empty set, 4 warnings
Причина странного времени в том, что вы не можете надежно вычитать значения даты и времени с помощью простой арифметики.
Это будет подсчитывать, как комментарии относятся к пользователю 123 за последние 4 часа:
SELECT COUNT(*)
FROM wp_comments
WHERE comment_date > NOW() - INTERVAL 4 HOUR
AND user_id = 123;
(Предупреждение: не видя SHOW CREATE TABLE
, я не могу быть уверен в том, какие столбцы существуют. Если вы действительно используете тире (-
) в именах таблиц и столбцов, обязательно поместите кавычки вокруг такого имени.)
0h400
не известен MySQL.
MySQL имеет NOW()
, что, вероятно, вы имели в виду под $current_time
.
Арифметику даты и времени лучше всего выполнять с помощью шаблона, который я показал в приведенном выше SQL.
Большое спасибо за ваш ответ, но я заканчивал улучшать ответ Ярослава Машко, когда читал ваш.
Хорошо, с помощью Ярослава Машко я нашел идеальную команду. То, что было одобрено, выдает список комментариев, опубликованных за последние 4 часа. В этом не было необходимости, потому что плагины Nagios не могли использовать пороговое предупреждение. Итак, чтобы получить количество комментариев за последние четыре часа, я добавил count() в SQL-запрос. Это хороший способ для меня:
SELECT COUNT(c.comment_date) FROM wp_comments as c where hour(timediff( localtime(), c.comment_date ) ) < 4;
Я поместил это в плагин check_mysql_query (встроенный в Nagios XI), и он работает нормально. Спасибо за вашу поддержку.
мы не знаем вашей схемы. Пожалуйста, предоставьте структуру, образцы данных, желаемый результат.