Outils pour utilisateurs

Outils du site


linux:adminsys:check_replication_mysql

Ceci est une ancienne révision du document !


Check réplication mysql

Ce script vérifie les positions master et slave de deux noeuds mysql en réplication maitre-maitre.

#!/bin/bash
 
# Ce script loggue les positions sur le master local, le master distant et le slave
# Avec en colonnes
# 1 timestamp 
# 2 master_log_on_remote_master
# 3 master_log-pos_on_remote_master
# 4 master_log_on_local_slave 
# 5 master_log-pos_on_local_slave 
# 6 master_log_on_local_master       
# 7 master_log-pos_on_local_master
# 8 master_log_on_remote_slave 
# 9 master_log-pos_on_remote_slave 
# 10 date en plus clair
 
LOG=/var/log/mysql/replication.log
ERRLOG=/var/log/mysql/replication.err
TMP=/tmp/$(basename $0).tmp
DEST='mail@domaine.tld'
 
# On regarde si on est sql1 ou sql2, à adapter suivant vos hostnames
# ici on regarde le 3e caractère du hostname
here=${HOSTNAME:2:1}
[ $here -gt 1 ] && there=1 || there=2
local_host=<prefix>${here}.domaine.tld
remote_host=<prefix>${there}.domaine.tld
 
TS=$(date '+%s') # timestamp
DATE=$(date -d "1970-01-01 UTC +$TS seconds" "+%Y-%m-%d_%H:%M:%S")
 
user=$(sed -ne '5p'</var/lib/mysql/master.info)
pass=$(sed -ne '5p'</var/lib/mysql/master.info)
 
remote_master=$(/usr/bin/mysql -u$user -p$pass -h$remote_host -e 'show master status'|awk 'END {print $1 " " $2}')
local_master=$(/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'show master status'|awk 'END {print $1 " " $2}')
local_slave=$(/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'show slave status' |awk -F '\t' 'END {print $6 " " $7}')
remote_slave=$(/usr/bin/mysql -u$user -p$pass -h$remote_host -e 'show slave status'|awk -F '\t' 'END {print $6 " " $7}')
 
echo "$TS $remote_master $local_slave $local_master $remote_slave $DATE" >> $LOG
 
# check index du fichier de log
remote_master_log_index=$(expr "$remote_master" : '[^\.]\+\.0*\([1-9]\+\)')
local_slave_log_index=$(expr "$local_slave" : '[^\.]\+\.0*\([1-9]\+\)')
local_master_log_index=$(expr "$local_master" : '[^\.]\+\.0*\([1-9]\+\)')
remote_slave_log_index=$(expr "$remote_slave" : '[^\.]\+\.0*\([1-9]\+\)')
# check positions
remote_master_log_pos=$(expr "$remote_master" : '[^ ]* \(.*\)')
local_slave_log_pos=$(expr "$local_slave" : '[^ ]* \(.*\)')
local_master_log_pos=$(expr "$local_master" : '[^ ]* \(.*\)')
remote_slave_log_pos=$(expr "$remote_slave" : '[^ ]* \(.*\)')
 
>$TMP
 
if [ $remote_master_log_index -gt $local_slave_log_index ]
then
  echo "Le fichier de log est plus recent sur le master $remote_host ($remote_master) que sur le slave $local_host ($local_slave)" >> $TMP
elif [ $remote_master_log_pos -gt $local_slave_log_pos ]
then
  echo "Le slave de $local_host est en retard :
    master $remote_host : $remote_master
    slave  $local_host : $local_slave" >> $TMP
fi
 
if [ $local_master_log_index -gt $remote_slave_log_index ]
then
  echo "Le fichier de log est plus recent sur le master $local_host ($local_master) que sur le slave de $remote_host ($remote_slave)" >> $TMP
elif [ $local_master_log_pos -gt $remote_slave_log_pos ]
then
  echo "Le slave de $remote_host est en retard :
    master $local_host : $local_master
    slave  $remote_host : $remote_slave" >> $TMP
fi
 
if [ $(wc -l <$TMP) -gt 0 ]
then
  # on ajoute le check des Slave_running
  echo "Sur $local_host on a $(/usr/bin/mysqladmin -u$user -p$pass extended-status|grep Slave_running)" >> $TMP
  echo "Sur $remote_host on a $(/usr/bin/mysqladmin -u$user -p$pass -h$remote_host extended-status|grep Slave_running)" >> $TMP
  echo "Fin du script de check ($DATE)" >> $TMP
  # log
  cat $TMP >> $ERRLOG
  # on envoie un mail
  mail -a "Content-Type: text/plain; charset=UTF-8" -s "$DATE Replication mysql cassee" $DEST < $TMP
fi
linux/adminsys/check_replication_mysql.1239623486.txt.gz · Dernière modification : 13/04/2009 13:51 de daniel