Zaloha mysql databaz cez shell skript s auto cron job.

Sekcia: Konfigurácia 12.01 | 11:25
Avatar maxxim999   Používateľ

Zdravim Vas, potrebujem pomoc so zalohovanim mysql databaz. Nasielk som jeden shell script n zalohovanie mysql databaz Použitie CronJob na automatické zálohovanie súborov MySQL, je to uz velmi stare vlakno a tak mi s tym zrejme nikto nepomoze. Spustil som ho a funguje, zalohuje vsetky najdene mysql databazy do urceneho priecinka a posle mail vypis zalohovnych databaz, akurat ich zalohuje osobitne a tym padom sa v adresari stracam pri viacerych zalohach. Jednoducho povedane, vela suborov v backup adresari. Ako mam upravit tento skript aby:(jedna z tychto moznosti) 1. mi vytvoril .tar.gz archiv kde budu zhrnute a spakovane komplet vsetky databazy v jednom .tar.gz subore vo formate napr. /bcup/mysql_bup/$date$time$mysql_db.tar.gz 2. alebo pri kazdej zalohe vytvori v adresári napr. /bcup/$date$time$mysql$dir/mysqldb.sql.gz,mysqldb2.sql.gz,mysqldb3sql.gz

Za kazdu pomoc dakujem.

    • RE: Zaloha mysql databaz cez shell skript s auto cron job. 12.01 | 13:21
      Avatar maxxim999   Používateľ

      Zdravim Ten CHATGPT na nieco bude. Pomohol mi upravit skript a funguje to ako som chcel tu je skript.

      #!/bin/bash
      
      # Premenné
      HOST=`hostname -s`
      DELETE_DAILY_BACKUPS_OLDER_THAN_DAYS=5
      DELETE_WEEKLY_BACKUPS_OLDER_THAN_WEEKS=4
      syslogtag=MySQL-Backup
      DEST="/bcs/mysql/"
      DBS="$(mysql -u root -Bse 'show databases' | egrep -v '^Database$|hold$' | grep -v 'performance_schema\|information_schema')"
      DATE=$(date +'%F')  # Formát: YYYY-MM-DD
      WEEK=$(date +'%Y-W%U')  # Formát: YYYY-WW
      SEND_EMAIL=1
      NOTIFY_EMAIL="admin@example.com"
      NOTIFY_SUBJECT="MariaDB Backup Notification on ${HOST}"
      
      # Typ zálohy (denná alebo týždenná)
      if [[ $(date +%u) -eq 7 ]]; then
          # Nedeľa = týždenná záloha
          BACKUP_TYPE="weekly"
          DEST_DIR="${DEST}${BACKUP_TYPE}/backup_${WEEK}/"
          DELETE_OLDER_THAN=$DELETE_WEEKLY_BACKUPS_OLDER_THAN_WEEKS
      else
          # Iný deň = denná záloha
          BACKUP_TYPE="daily"
          DEST_DIR="${DEST}${BACKUP_TYPE}/backup_${DATE}/"
          DELETE_OLDER_THAN=$DELETE_DAILY_BACKUPS_OLDER_THAN_DAYS
      fi
      
      # Vytvor adresár pre aktuálnu zálohu
      mkdir -p $DEST_DIR
      
      # Zálohovanie databáz
      for db in $DBS; do
          GZ_FILENAME="${DEST_DIR}${db}.sql.gz"
          mysqldump -u root --quote-names --opt --single-transaction --quick $db | gzip -cf > $GZ_FILENAME
          if [[ $? -ne 0 ]]; then
              echo "Error while backing up database: $db"
          else
              echo "Database $db backed up to $GZ_FILENAME"
          fi
      done
      
      echo "Backups stored in $DEST_DIR"
      
      # Odstránenie starých záloh
      if [[ $BACKUP_TYPE == "daily" ]]; then
          find "${DEST}daily/" -maxdepth 1 -type d -mtime +$DELETE_DAILY_BACKUPS_OLDER_THAN_DAYS -exec rm -rf {} \;
          echo "Old daily backups deleted."
      else
          find "${DEST}weekly/" -maxdepth 1 -type d -mtime +$(($DELETE_WEEKLY_BACKUPS_OLDER_THAN_WEEKS * 7)) -exec rm -rf {} \;
          echo "Old weekly backups deleted."
      fi
      
      # Odoslanie e-mailu
      if [ $SEND_EMAIL -eq 1 ]; then
          TMP_MSG_FILE="/tmp/mysql_backup_${RANDOM}.msg"
          echo "MySQL Backup completed on ${DATE}." > $TMP_MSG_FILE
          echo "Backup type: $BACKUP_TYPE" >> $TMP_MSG_FILE
          echo "Backups stored in: $DEST_DIR" >> $TMP_MSG_FILE
          mail -s "$NOTIFY_SUBJECT" "$NOTIFY_EMAIL" < $TMP_MSG_FILE
          rm -f $TMP_MSG_FILE
      fi
      
      exit 0