Zautomatyzowany, rotowany backup serwera MySQL

W dzisiejszym poście, przedstawię Ci metodę tworzenia backupu serwera MySQL postawionego na Dockerze. Dodatkowo po przez wykorzystanie logrotate, wdrożymy pełne rotowanie kopii zapasowych.


Tworzenie Backupu

Na samym początku stworzymy skrypt, który pobierze pełną listę baz danych. Po czym wykona ich backup, zrzucając je do odzielnych plików. Na sam koniec spakuje je, celem zaoszczędzenia miejsca na dysku.

Nasz skrypt przyjmuje jako argumenty:

  • nazwę naszego kontenera
  • nazwę użytkownika do bazy danych
  • hasło użytkownika do bazy danych
  • docelowy katalog, do którego będziemy przenosić nasze kopie zapasowe.

/home/dev/dockerBackup.sh

#!/bin/bash

if [ "$#" -eq 0 ]; then
echo "Arguments"
echo " \$1 container name"
echo " \$2 db name"
echo " \$3 db password in \'\'"
echo " \$4 dest dir"
echo "Example usage:"
echo "/home/dev/dockerBackup.sh mysql-dev-1 user 'password' /home/dev/mysql_backup"
exit
fi

container_name=$1
db_name=$2
db_password=$3
dest_dir=$4

echo "Create directory structure..."
mkdir -p $dest_dir/$container_name

echo "Starting backup... $(date)..."
docker exec $container_name \
	mysql \
	-u $db_name \
	--password=$db_password \
	-N \
	-e 'show databases' \
| while read dbname; \
	do \
	docker exec $container_name \
		/usr/bin/mysqldump \
		-u $db_name \
		--password=$db_password \
		--opt \
		--default-character-set=utf8 \
		--routines \
		--events \
		--triggers \
		--set-gtid-purged=OFF \
		--force \
		--port=3306 \
		--add-drop-database \
		-B "$dbname" > $dest_dir/$container_name/"$dbname".sql; \
	tar -czvf $dest_dir/$container_name/"$dbname".sql.tar.gz  $dest_dir/$container_name/"$dbname".sql; rm $dest_dir/$container_name/"$dbname".sql ; \
done
echo "Stopping backup... $(date)..."

Po utworzeniu pliku i sprawdzeniu uprawnień, tak by nasz user miał pełne uprawnienia by go uruchomić, możemy przetestować nasz skrypt, wykonując:

/home/dev/dockerBackup.sh mysql-dev-1 user 'password' /home/dev/mysql_backup

Jeśli wszystko przebiegnie poprawnie, w naszym katalogu /home/dev/mysql_backup otrzymamy nasze backupy. W celu wprowadzenia cykliczności, dodamy wpis do naszego crontab-a, celem cyklicznego powtarzania polecenia każdego dnia o 1 w nocy.

0 1 * * *  /home/dev/dockerBackup.sh mysql-dev-1 user 'password' /home/dev/mysql_backup

Rotacja Backupu

W tej części, zajmiemy się wdrożeniem trzymania backupów z ostatnich 5 dni. Do tego wykorzystamy wbudowaną funkcję w system - logrotate. Całość sprowadza się do utworzenia pliku:

/etc/logrotate.d/mysql_docker_backup

/home/dev/mysql_backup/*/*.sql.tar.gz {
    rotate 5
    nocompress
    dateext
    missingok
}

Po czym wykonamy test naszego configu:

logrotate -d /etc/logrotate.d/mysql_docker_backup

W przypadku braku błędów z powyższego polecenia, możemy wymusić wykonanie rotacji:

logrotate -f /etc/logrotate.d/mysql_docker_backup

Po tym, sprawdzamy nasz log w którym powinniśmy otrzymać informację o powodzeniu akcji:

cat /var/lib/logrotate/logrotate.status

Podsumowanie

Samo tworzenie backupów jest procesem który można stale udoskonalać. Możemy do tego wykorzystać np. https://hub.docker.com/r/databack/mysql-backup z tym że, powyższy przykład pozwala na szybkie i najmniej problemowe ich wdrożenie.

Kamil Mirończuk

I kiedy czegoś gorąco pragniesz, to cały wszechświat sprzyja potajemnie twojemu pragnieniu
~Paulo Coelho

Komentarze

Zostaw komentarz

Twój adres mailowy NIE zostanie opublikowany. W razie otrzymania zapytania, otrzymasz na niego odpowiedź.
Wymagane pola są oznaczone jako *