Skip to content

MySQL replica — алерт когда SQL_Thread зависла

MySQL replica перестала применять binlog (Slave_SQL_Running=No после ошибки query) — но мониторишь только heartbeat, lag не растёт линейно потому что просто стоп.

Рецепт

bash
#!/usr/bin/env bash
# /etc/cron.d/mysql-repl
# */1 * * * * root /opt/mysql-repl-check.sh

USER=${MYSQL_USER:-monitor}
PWD=${MYSQL_PWD:-changeme}
HOST=${MYSQL_HOST:-127.0.0.1}

# 8.0.22+ uses REPLICA, older uses SLAVE — try both
OUT=$(mysql -u"$USER" -p"$PWD" -h"$HOST" -e 'SHOW REPLICA STATUS\G' 2>&1)
[ -z "$OUT" ] && OUT=$(mysql -u"$USER" -p"$PWD" -h"$HOST" -e 'SHOW SLAVE STATUS\G' 2>&1)

IO_OK=$(echo "$OUT"  | awk -F: '/Slave_IO_Running:|Replica_IO_Running:/  {gsub(/ /,"",$2); print $2}')
SQL_OK=$(echo "$OUT" | awk -F: '/Slave_SQL_Running:|Replica_SQL_Running:/{gsub(/ /,"",$2); print $2}')
LAG=$(echo "$OUT"    | awk -F: '/Seconds_Behind_Master:|Seconds_Behind_Source:/{gsub(/ /,"",$2); print $2}')
ERR=$(echo "$OUT"    | awk -F: '/Last_SQL_Error:|Last_Error:/{sub(/^[^:]*:/, ""); print; exit}')

if [ "$IO_OK" != "Yes" ] || [ "$SQL_OK" != "Yes" ]; then
  curl -fsS "$HEARTBEAT_URL" --data-urlencode "err=IO=$IO_OK,SQL=$SQL_OK,lag=$LAG,reason=$ERR"
  exit 2
fi
echo "OK (lag=${LAG}s)"

То же самое в Enterno.io

Замените cron + curl на Enterno heartbeat — получите retention-историю репликации (когда зависало последний раз) и алерт сразу в Telegram + email + Slack без поднятия Alertmanager.

Настроить HTTP monitor → ← Все рецепты

Похожие рецепты

Нужно ловить момент, когда реплика начала отставать от мастера больше чем на 10 секунд.