Serveur MYSQL CLUSTER cluster restore semiauto

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script de restauration semi-automatique
Rôle Récupère et décompresse une sauvegarde NDB depuis le NFS, puis affiche les commandes ndb_restore à lancer
Prérequis /etc/my.cnf, config.ini, sauvegarde déjà exportée sur le NFS
Voir aussi Sauvegarde · Script cluster

Ce script est qualifié de semi-automatique : il automatise la partie mécanique de la restauration (repérage de l'archive sur le NFS, montage, copie, décompression, identification des bases à restaurer), mais laisse volontairement le déclenchement final de ndb_restore à l'opérateur — la restauration NDB implique des choix (quel nœud restaurer en premier avec les métadonnées -m, quelles bases/tables inclure) qu'un script ne peut pas décider seul en toute sécurité.

Fonctionnement

  1. Monte le partage NFS distant contenant les archives (archives/cluster*.tar).
  2. Propose un choix interactif (select) parmi les archives disponibles.
  3. Copie l'archive choisie en local, démonte le NFS.
  4. Décompresse l'archive .tar puis les fichiers de backup NDB (.tgz) qu'elle contient.
  5. Détermine automatiquement les bases utilisateur présentes dans le backup (exclut sys, mysql, test) via ndb_print_backup_file.
  6. Affiche les commandes à exécuter manuellement pour créer les bases puis lancer ndb_restore sur chacun des deux nœuds.

Script

Le nom du serveur NFS (variable server) est un exemple générique à adapter à l'environnement cible.

#!/bin/bash
[ ! -f /etc/my.cnf ] && echo "Fichier my.cnf manquant!" && exit 1
[ ! -f /usr/local/mysql-cluster/config.ini ] && echo "Fichier config.ini manquant!" && exit 1
datadir=$(grep -m1 FileSystemPath /usr/local/mysql-cluster/config.ini)
datadir=${datadir#*=}
[ ! -d "$datadir" ] && echo "Mauvaise valeur pour FileSystemPath=$datadir" && exit 1

tmprestore=$datadir/tmprestore
mountdir=/mnt
tomount=/home/cluster
server=backup.example.local

nodeid=$(grep -m1 nodeid /etc/my.cnf)
nodeid=${nodeid##*=}
nodeid=${nodeid%%,*}

# Nœud "jumeau" (l'autre nœud de données du couple) : sur un cluster à 2 nœuds
# symétriques (id 11/12), c'est simplement l'id complémentaire.
if [ $nodeid = "11" ];then
	nodeid2=12
else
	nodeid2=11
fi

clear
# Montage du partage NFS distant
mount -t nfs $server:$tomount $mountdir
[ $? -ne 0 ] && echo "Impossible de monter le repertoire de sauvegarde" && exit 1
echo -e "Montage du repertoire de sauvegarde OK.\n"

cd $mountdir

if [ ! -d archives ]; then
	echo "Repertoire d'archives absent!"
	umount -l $mountdir
	exit 1
fi

cd archives

lsa=$(ls cluster*.tar)
if [ -z "$lsa" ]; then
	echo "Aucunes sauvegardes présentes!"
	umount -l $mountdir
	exit 1
fi

echo "Selectionnez la sauvegarde que vous voulez restaurer :"
select tar in $lsa
do
  echo "Vous avez choisi de restaurez : ${tar%.*}"
  break
done

echo -e "\nCopie de l'archive..."
[ -d $tmprestore ] && rm -rf $tmprestore
mkdir $tmprestore
cp $tar $tmprestore
cd $tmprestore
umount -l $mountdir

echo "Décompression de l'archive..."
tar -xf $tar

tar=${tar%.tar}
cd ${tomount#/}/$tar

numero=$(ls | sed s/BACKUP-// | sort -n| tail -n1)
backdir=BACKUP-$numero

cd $backdir
for i in $(ls);do
	tar -xzf $i
done
rm *.tgz

# Bases utilisateur présentes dans le backup (exclut sys/mysql/test)
bases=$(ndb_print_backup_file $backdir.$nodeid.ctl \
|sed -ne "s/Key: 1 .*: \"\([a-z]*\)\/.*\"/\1/gp" |sort -u|egrep -v "(sys|mysql|test)")

clear
echo -e "\n1)Déplacez-vous dans le répertoire de restauration :"
echo -e "# cd $tmprestore/${tomount#/}/$tar/$backdir\n"
echo -e "Vous vous trouvez dans le répertoire contenant les fichiers de backup "
echo -e "des 2 noeuds.\n"
echo "2)Commencez par créer manuellement les databases dont vous aurez besoin :"
echo "Exemples:"
for i in $bases; do echo "mysql < <(echo \"create database $i;\")"; done
echo -e "\n3)Ensuite, par exemple, si vous voulez restaurer les bases db1 et db2, "
echo -e "et juste les tables t1 et t4 de la base db3 ; tapez ces 2 commandes :\n"

echo -e "Le premier appel avec l'option '-m' :\n"
echo -e "# ndb_restore -n $nodeid -b $numero -m -r --backup_path=. \\ "
echo -e "--include-databases=db1,db2 --include-tables=db3.t1,db3.t4\n"

echo -e "Puis sans l'option '-m' et avec l'id de l'autre noeud :\n"
echo -e "# ndb_restore -n $nodeid2 -b $numero -r --backup_path=. \\ "
echo -e "--include-databases=db1,db2 --include-tables=db3.t1,db3.t4\n"

echo -e "\n(Supprimez le répertoire 'tmprestore' une fois fini!)"

Points d'attention

  • L'option -m de ndb_restore restaure les métadonnées (structure des tables) : elle ne doit être utilisée qu'une seule fois, sur un seul nœud — l'appel sur le second nœud (nodeid2) l'omet volontairement.
  • Le script crée les bases cibles automatiquement dans sa liste de suggestions mais laisse le CREATE DATABASE réel à l'opérateur.
  • Pensez à supprimer le répertoire temporaire tmprestore une fois la restauration terminée (rappelé en fin de script).

Voir aussi