MySQL Backup

Posted by on 01 Apr 2009 | Tagged as: CLI, Debian, hyper_ch, Ubuntu

Backups sind das A und O wenn es um Computer geht. Man kann versehentlich Dinge löschen oder ein Gerät hört auf zu funktionieren oder auch in letzter Zeit ist die Beschlagnahme von Computern Mode geworden (hier sollte man noch zusätzliche Verschlüsselung anwenden…). Damit sich der Datenverlust in Grenzen hält, sollte man also regelmässig Backups machen. Ein besonderes Problem hierbei stellen Daten in einer Datenbank.

Eine der populärsten Datenbanken unter Linux ist MySQL. Die Daten werden auf Debian/Ubuntu jeweils in /var/lib/mysql gespeichert. Man könnte einfach die ganzen binären Datenbanken kopieren. Das Problem ist jedoch, wenn sich während dem Kopieren der Datenbestand ändert. Dies kann dazu führen, dass die entsprechende Datenbank korrumpiert wird.

Aus diesem Grunde gibts entweder die Möglichkeit, dass man MySQL während dem Backup ausschaltet oder dass man nicht die binären Datenbanken kopiert sondern einen Dump der Struktur und Inhalte erstellt. Die nachfolgenden Scripte machen solch einen Dump:

Alle Datenbanken in je eine eigene .sql Datei:

#!/bin/bash
 
# Set variables
USER=root
PASSWORD=************
HOST=localhost
 
# Remove old backup files
mkdir /mysql_backup
rm -f /mysql_backup/*
 
#Dump new files
 
for i in $(echo 'SHOW DATABASES;' | mysql -u$USER -p$PASSWORD -h$HOST|grep -v '^Database$'); do
  mysqldump                                                     \
  -u$USER -p$PASSWORD -h$HOST                                   \
  -Q -e -C --add-drop-table --add-locks --quick --lock-tables   \
  -B $i                                                         \
  $i > /mysql_backup/$i.sql;
done;

Das nachfolgende Script wurde von dergringo weiter entwickelt und macht nicht nur separate .sql Files für jede Datenbank, sondern auch noch für jede einzelne Tabelle.

WICHTIG: TARGET muss wohl überlegt gesetzt werden, da alle Dateien dort drinnen jeweils gelöscht werde. Das Standardverzeichnis /mysql_backup/ ist eine gute Lösung, muss aber unter Umständen angepasst werden.

#!/bin/bash
 
###############
# CONFIG
###############
 
TARGET=/mysql_backup/
USER=root
PASSWORD=*********
HOST=localhost
 
###############
# SCRIPT
###############
 
# Remove old files
[[ $TARGET ]] && cd "$TARGET" && rm -r ./*
 
#Dump new files
for DB in $(echo 'SHOW DATABASES;' | mysql -u$USER -p$PASSWORD -h$HOST|grep -v '^Database$'); do
        FOLDER=$TARGET$DB
        mkdir $FOLDER > /dev/null 2>&1
        for TABLE in $(echo SHOW TABLES FROM $DB | mysql -u$USER -p$PASSWORD -h$HOST | tail -n +2); do
                mysqldump -u$USER -p$PASSWORD -h$HOST $DB $TABLE > $FOLDER/$TABLE.sql
        done;
done;

One Response to “MySQL Backup”

  1. on 08 Jun 2010 at 23:15 1.dergringo said …

    Habe das Script gerade noch leicht modifiziert, so dass es unter Debian und Ubuntu den “debian-sys-maint” Account von /etc/mysql/debian.cnf verwendet. Dazu muss man die Zeilen

    USER=root
    PASSWORD=*********

    löschen, bzw. mich nachstehender Zeile ersetzen

    while IFS=’ =’ read key value; do case $key in password) PASSWORD=$value;; user) USER=$value;; esac done < /etc/mysql/debian.cnf

    Viel Spass!