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“