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.
Komentarze