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