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 '6p'</var/lib/mysql/master.info) # marche pas si le $user n'a que les droits de réplication slave, il faut client remote_master=$(/usr/bin/mysql -u$user -p$pass -h$remote_host -e 'show master status'|awk 'END {print $1 " " $2}') # sinon on passe par ssh, mais root doit avoir une clé #remote_master=$(/usr/bin/ssh $remote_host '/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -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}') # idem remote_slave=$(/usr/bin/mysql -u$user -p$pass -h$remote_host -e 'show slave status'|awk -F '\t' 'END {print $6 " " $7}') #remote_slave=$(/usr/bin/ssh $remote_host '/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e "show slave status"'|awk -F '\t' 'END {print $6 " " $7}') if [ $DEBUG -gt 0 ]; then echo "remote_master $remote_master" echo "local_master $local_master" echo "local_slave $local_slave" echo "remote_slave $remote_slave" echo "Fin debug, on sort" exit fi 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 [ -z "$remote_master_log_index" -o -z "$remote_master_log_pos" ]; then echo "Problème pour se connecter au master mysql distant de $remote_host ($remote_master)" >> $TMP elif [ -z "$local_slave_log_index" -o -z "$local_slave_log_pos" ]; then echo "Problème pour se connecter au slave mysql local de $local_host ($local_slave)" >> $TMP elif [ $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 echo "On restart le slave de $local_slave" >> $TMP /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'stop slave; start 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 echo "On restart le slave de $local_slave" >> $TMP /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e 'stop slave; start slave;' >> $TMP fi if [ -z "$local_master_log_index" -o -z "$local_master_log_pos" ]; then echo "Problème pour se connecter au master mysql local de $local_host ($local_master)" >> $TMP elif [ -z "$remote_slave_log_index" -o -z "$remote_slave_log_pos" ]; then echo "Problème pour se connecter au slave mysql distant de $remote_host ($remote_slave)" >> $TMP elif [ $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 echo "On restart le slave de $remote_slave" >> $TMP /usr/bin/mysql -u$user -p$pass -h$remote_host -e 'stop slave; start 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 echo "On restart le slave de $remote_slave" >> $TMP /usr/bin/mysql -u$user -p$pass -h$remote_host -e 'stop slave; start slave;' >> $TMP fi if [ $(wc -l <$TMP) -gt 0 ]; then # on ajoute le check des Slave_running ($user doit avoir les droits PROCESS) 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 # et on pose un lock cat $TMP >> $LOCK else [ -f $LOCK ] && \ echo -e "\nDATE : 1re constatation de la résolution du problème, synchro mysql OK" >> $LOCK && \ date|mail -a "Content-Type: text/plain; charset=UTF-8" -s "$DATE Replication mysql OK" $DEST && \ rm -f $LOCK fi
linux/adminsys/check_replication_mysql.1260424054.txt.gz · Dernière modification : 10/12/2009 06:47 de daniel