Skip to main content

BASH: kopia 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."

Polecenie: Napisz skrypt wykonujący kopię baz danych mysql. Kopia każdej bazy danych powinna być w osobnym pliku w folderze /home/backup (jeżeli folder nie istnieje - utwórz go). Dodaj tekstowy pasek postępu. Na końcu umieść podsumowanie w pliku /home/backup/log_backup.txt zawierające: nazwę serwera (hostname), datę wykonania backupu,  listę backupowanych baz danych oraz ich wielkości w MB.

ChatGPT: Skrypt wykonuje kopię zapasową każdej bazy danych (pomijając systemowe), zapisuje je w formacie .sql.gz oraz tworzy podsumowanie w pliku logu. Dodałem także prosty pasek postępu informujący o aktualnym etapie backupu.

#!/bin/bash

# Ustawienia
BACKUP_DIR="/home/backup"
LOG_FILE="$BACKUP_DIR/log_backup.txt"
MYSQL_USER="root"
# Pobranie hasla
echo -n "Podaj haslo do MySQL: "
read -s MYSQL_PASSWORD
echo.
# MYSQL_PASSWORD="your_password"

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

# Pobranie listy baz danych
DATABASES=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | tail -n +2 | grep -v -E "^(information_schema|performance_schema|mysql|sys)$")

# Pobranie nazwy hosta i daty
HOSTNAME=$(hostname)
DATE=$(date +"%Y-%m-%d %H:%M:%S")

# Czyszczenie logu
echo "Backup wykonany na serwerze: $HOSTNAME" > "$LOG_FILE"
echo "Data: $DATE" >> "$LOG_FILE"
echo "Lista backupowanych baz danych:" >> "$LOG_FILE"
echo "-------------------------------------" >> "$LOG_FILE"

# Backup każdej bazy
TOTAL=${#DATABASES[@]}
COUNT=0
for DB in $DATABASES; do
    COUNT=$((COUNT + 1))
    BACKUP_FILE="$BACKUP_DIR/$DB.sql.gz"
    echo -n "Backup bazy: $DB ($COUNT/$TOTAL)... "
    mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD --databases "$DB" | gzip > "$BACKUP_FILE"
    SIZE=$(du -m "$BACKUP_FILE" | cut -f1)
    echo "Zakończono (${SIZE}MB)"
    echo "$DB - ${SIZE}MB" >> "$LOG_FILE"
done

echo "-------------------------------------" >> "$LOG_FILE"
echo "Backup zakończony." >> "$LOG_FILE"
echo "Log zapisany w: $LOG_FILE"