Назад | Перейти на главную страницу

Как я могу создать сценарий bash для статуса / репликации MySQL, который уведомляет об ошибке только один раз в час?

Я использую CentOS 6.2.

Я следил за руководством Алекса Вильямса по настройке MySQL через HAProxy. Вот.

Вместо того, чтобы HAProxy проверял состояние MySQL и репликации, у меня скрипты запускаются раз в минуту в crontab. Если один из них терпит неудачу, я прошу их передать ошибку в текстовый файл; /opt/repl.txt или /opt/mysql.txt.

У меня есть сценарий, который проверяет, существуют ли эти файлы, и если да, то отправляет электронное письмо, уведомляющее персонал о том, что произошел сбой. Это также настроено в crontab для запуска раз в минуту.

По сути, я пытаюсь достичь этого; Я хотел бы, чтобы сценарий отправлял электронные письма только при первоначальном сбое и один раз в час после этого, пока проблема не будет решена. Я не совсем уверен, как это сделать с помощью сценариев bash. В последний раз, когда что-то не удалось, он отправил по электронной почте минутное письмо об этом, и это определенно не то, что я хотел бы. Любая помощь приветствуется.

я использую pt-table-контрольная сумма от Percona.com для этого.

  1. Выполнить контрольную сумму pt-table на первичном
  2. Проверьте таблицы на реплике с помощью сценария, приведенного в документации для pt-table-контрольная сумма. Этот запрос вернет результат только в том случае, если есть ошибки, и я направляю этот результат в файл.
  3. Если есть вывод, то отправьте письмо. В противном случае молчи.

Вот сокращенный код:

mysql-checksum () {
OUTFILE=/tmp/outfile
mysql --execute "SELECT db, tbl, chunk, this_cnt-master_cnt AS cnt_diff, \
        this_crc <> master_crc OR ISNULL(master_crc) <> ISNULL(this_crc) AS crc_diff \
        FROM test.checksum \
        WHERE master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc);" > $OUTFILE
# Print a status message.
# Any output from above command is bad.
if [ -s $OUTFILE ]; then
        # List out the bad tables.
        BADTABLES=`tail +2 $OUTFILE | cut -f1,2 | tr '\t' '.' | tr '\n' ','`

        echo "ERROR: Bad checksum on these tables [$BADTABLES]. For details see $HOST:$OUTFILE." | mail -s "mysql checksum error" admin@example.org
        return 1
fi
}

Измените свой сценарий, чтобы он касался файла при отправке электронного письма и не отправлял электронное письмо, если файл старше 1 часа.