Ubuntu a záloha MySQL

Počítače nejsou nikdy perfektní a vždy je potřeba si udržovat nějakou zálohu dat. V tomto příspěvku se podíváme na zálohu MySQL databází na Ubuntu. Skript není problém přepsat pro jiný druh databáze, případně pro jinou distribuci Linuxu. Budeme dumpovat přímo databázi, nikoliv jen kopírovat soubory, což mi přijde jako lepší cesta.

Budeme potřebovat uživatele MySQL, který má ideálně jen práva pro čtení databáze. Další disk, na který soubory zkopírujeme a nastavení cronu pro automatickou úlohu.

V libovolném adresáři si vytvoříme dva soubory – konfigurační a shell skript. V příkladu oba vložím např. do „/etc/_scripts“.

Soubor konfigurace si pojmenuje např.: mysql.cnf
touch mysql.cnf
vi mysql.cnf

Vložíme přístupy:
[client]
user = uzivatel
password = heslo
host = localhost

Vytvoříme sh skript:
touch backup-mysql.sh
vi backup-mysql.sh

Obsah backup-mysql.sh:

#!/bin/bash
#----------------------------------------
# OPTIONS
#----------------------------------------
DAYS_TO_KEEP=64    # Jak dlouho budeme ponechavat soubory - 0 pro zachovani vsech
GZIP=1            # 1 = zapina archivaci
BACKUP_PATH='/mnt/backup/mysql' # Kam budeme zalohovat
CONFIG='/etc/_scripts/mysql.cnf' # Cesta ke konfig souboru
#----------------------------------------

# Vytvoreni backup adresare, pokud neexistuje
if [ ! -d $BACKUP_PATH ]; then
  mkdir -p $BACKUP_PATH
fi

# Z informacniho schematu vytahneme nazvy tabulek
# Jako parametr --defaults-extra-file posleme konfiguracni soubor, ve kterem jsou pristupove udaje

  databases=`mysql --defaults-extra-file=$CONFIG -e "SHOW DATABASES;" | tr -d "|" | grep -v Database`

  for db in $databases; do
  # Preskocime nektere systemove tabuky mysql 
  if [ $db == 'information_schema' ] || [ $db == 'performance_schema' ] || [ $db == 'mysql' ] || [ $db == 'sys' ] 
  then
    continue;
  fi
  
  date=$(date -I)
  # Backup do sql souboru nebo archivu
  if [ "$GZIP" -eq 0 ] ; then
    echo "Backing up database: $db without compression"      
    mysqldump --defaults-extra-file=$CONFIG --databases $db > $BACKUP_PATH/$date-$db.sql
  else
    echo "Backing up database: $db with compression"
    mysqldump --defaults-extra-file=$CONFIG --databases $db | gzip -c > $BACKUP_PATH/$date-$db.gz
  fi
done

# Smazani starych zaloh
if [ "$DAYS_TO_KEEP" -gt 0 ] ; then
  echo "Deleting backups older than $DAYS_TO_KEEP days"
  find $BACKUP_PATH/* -mtime +$DAYS_TO_KEEP -exec rm {} \;
fi

V souboru můžeme upravit nastavení:
DAYS_TO_KEEP – Jak dlouho budeme držet zálohy po dnech
GZIP – Komprese nebo bez komprese souborů
BACKUP_PATH – Do kterého adresáře zálohovat
CONFIG – Cesta ke konfiguračnímu souboru

Uložíme a nastavíme práva po spouštění souboru:
chmod +x backup-mysql.sh

Nastavíme cron:
crontab -e

Jako poslední řádek vložíme čas a cesty pro soubor a log:
0 23 * * * sudo /etc/_scripts/backup-mysql.sh >> /var/log/backup-mysql.sh.log 2>&1

Skript se spustí ve 23:00 a logovat bude do „/var/log/backup-mysql.sh.log