[Mysql] [Docker] : Sauvegarde mysql pour conteneurs Docker

Print Friendly, PDF & Email

Je publie ce code car je le trouve bien pratique. Le raisonnement me semble logique et j’ai apprécié le rédiger alors cela peut surement vous inspirer. Si vous êtes curieux, vous pouvez retrouver mes commandes docker sur cette page.

Alors je vous dresse les points essentiels du code car le mien fait intègre aussi postgres et mariadb (identique à mysql exactement).

Premièrement on liste les ID, les noms et les images des conteneurs. Comme on log tout cela cela permet de recréer aussi très rapidement un conteneur Docker identique. Et puis cela permet aussi de tester le dump facilement.

docker ps --format "{{ .ID }}|\
{{ .Names }}|\
{{.Image}}" |\
while IFS="|" read var1 var2 var3;\
do

Ensuite on nettoie le nom du conteneur car Docker ajoute un sha pour le rendre unique et c’est pas très causant. et on peut se créer un répertoire local de backup (mais cela peut aussi être un point de montage.

var2=$(echo $var2 | sed -e 's/\(.*\)\..*$//g')
BACKUP_DIR="/dir_export/"
DUMP_DIR=${BACKUP_DIR}${var2}/
DUMP=BACKUP_DIR="/export/sgbd-dumps/"
DATEDUMP=$(date +%Y-%m-%d)
DUMP=${DATEDUMP}.${var2}

et on commence par logger quelques infos :

echo "---- ${DATEDUMP} /  Dump du container ${var2}    -----" > ${DUMP_DIR}${DUMP}.log
 echo ${DATEDUMP}"-name >>"$var2 >> ${DUMP_DIR}${DUMP}.log
 echo ${DATEDUMP}"-image >>"$var3 >> ${DUMP_DIR}${DUMP}.log
 echo ${DATEDUMP}"-dump >>"${DUMP_DIR} >> ${DUMP_DIR}${DUMP}.log

Et c’est parti on lance la sauvegarde mysqldump en lancant un docker exec sur l’ID du conteneur recueilli.

echo ""
echo "---- ${DATEDUMP} /  Dump du container ${var2}    -----"
docker exec ${var1} mysqldump -u  --password= --all-databases  > ${DUMP_DIR}${DUMP}.sql

Alors on aurait pu ajouter un gzip directement dessus et ne sauvegarder qu’une seule base. Personnellement on ne sait on part sur un truc complet. Et pui savant de gzippé on vérifie le boulot 😉

Découvrez  [Php] : mysql passage à mysqli avec php7

Alors comment on fait pour tester notre dump ???

C’est simple. On créé un conteneur identique et ensuite on importe notre dump dedans. N’ayez pas peur c’est hyper facile.

docker run --name testsgbd -e MYSQL_ROOT_PASSWORD= -tid $var3 | grep -vi warning
sleep 40

On voit que $var3 nous permet de lancer la même image que dans le conteneur sauvegardé. Et on met tout cela en pause durant 40 secondes. C’est beaucoup mais on s’assure que le conteneur est bien lancé (ou au moins à eu le temps).

Et la on importe mais pas n’importe comment. On fait un test (un if) sur la commande d’import mysql lancée à travers docker. Si aucun message d’erreur on à ainsi un dump conforme sinon KO. Et si OK on gzip

if [ -n "$(docker exec -i testsgbd mysql -uroot -ppassRoot <${DUMP_DIR}${DUMP}.sql 2>&1 | grep -vi Warning )" ];then
                       echo " >>> ${DATEDUMP} : [Error]" >> ${DUMP_DIR}${DUMP}.log
                      echo "[Pb import]"
                        rm -f ${DUMP_DIR}${DUMP}
                else
                        echo " >>> ${DATEDUMP} : [OK]" >> ${DUMP_DIR}${DUMP}.log
                        echo "[Import OK]"
                        echo "Gzip..."
                        gzip ${DUMP_DIR}${DUMP}*.sql
                        echo "fin"
                fi

et surtout on oublie pas de nettoyer en supprimant l’image créée.

docker rm -f testsgbd

Alors c’est pas simple tout cela ?

Je trouve que si et que ça mérite d’être partagé, c’est pour cela que cela valait bien un article.