Skip to main content

BASH: skrypt wykonujący kopię baz danych mariaDB

Oto skrypt w Bash, który automatycznie wykonuje kopię zapasową wszystkich baz danych MariaDB na komputerze z Debianem 12. Kopia zapasowa jest zapisywana w katalogu /backup/mysql, z nazwą zawierającą datę i godzinę. Dodatkowo, skrypt usuwa stare kopie (np. starsze niż 7 dni).

Skrypt wykona kopię zapasową wszystkich baz danych, skompresuje je i usunie stare pliki starsze niż 7 dni.

Dodałem tekstowy pasek postępu, który wyświetla aktualną bazę i jej numer w kolejce. Teraz skrypt będzie dynamicznie informował użytkownika o postępie backupu. 

#!/bin/bash

# Konfiguracja
BACKUP_DIR="/backup/mysql"   # Katalog, w którym będą przechowywane kopie
USER="root"                  # Użytkownik bazy danych
PASSWORD="twoje_haslo"       # Hasło użytkownika (zalecane jest użycie pliku ~/.my.cnf zamiast wpisywania hasła w skrypcie)
DATE=$(date +"%Y-%m-%d_%H-%M-%S")  # Aktualna data i czas
DAYS_TO_KEEP=7               # Liczba dni, po których stare kopie są usuwane

# Tworzenie katalogu, jeśli nie istnieje
mkdir -p "$BACKUP_DIR"

# Pobranie listy baz danych
DBS=$(mysql -u "$USER" -p"$PASSWORD" -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema|performance_schema|mysql)')

# Liczba baz danych do backupu
TOTAL_DBS=$(echo "$DBS" | wc -l)
COUNT=0

# Wykonanie kopii zapasowej każdej bazy
for DB in $DBS; do
    COUNT=$((COUNT + 1))
    FILENAME="$BACKUP_DIR/${DB}_$DATE.sql.gz"
    echo -ne "Tworzenie kopii bazy: $DB ($COUNT/$TOTAL_DBS)\r"
    mysqldump -u "$USER" -p"$PASSWORD" "$DB" | gzip > "$FILENAME"
    if [ $? -eq 0 ]; then
        echo "Kopia zapasowa bazy $DB zakończona sukcesem."
    else
        echo "Błąd podczas tworzenia kopii bazy $DB!"
    fi
    
    # Opcjonalnie: Możesz także dodać logowanie do pliku np. /var/log/mysql_backup.log
    # echo "$(date) - Kopia zapasowa bazy $DB utworzona." >> /var/log/mysql_backup.log

done

# Usuwanie starych kopii zapasowych
find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +$DAYS_TO_KEEP -exec rm {} \;
echo "Usunięto kopie zapasowe starsze niż $DAYS_TO_KEEP dni."

# Koniec
echo "Proces backupu zakończony."