Backup !

  • Thread starter Thread starter Mrcobaldo
  • Start date Start date
M

Mrcobaldo

Guest
Guten morgen. Wie erstelle ich am "besten" ein Backup einer MySQL Datenbank die für ein forum ist
? Forum vorher mit der htaccess und "deny for all" deaktivieren oder ? Dann einfach die Datenbank sichern ?? Habe mal gelesen MySQL Server stoppen doch dann ist doch phpmyadmin nicht verfügbar ?? Und kann was "passieren" wenn man man einfach so ohne was zu machen eine Sicherung macht und die einspielt ?? :mad:
 
Ich mache mit einem Script, das ich vor unendlich langer Zeit mal von SuSEs /etc/cron.daily geerbt habe (dort macht es m.W. ein Backup der RPM-DB) täglich einen vollen bzip2ten MySQL-Dump, versioniere den (wenn sich die MD5-Summe geändert hat, gibt's eine neue Version mit Zeitstempel) und werfe dieses Verzeichnis täglich der Backup-Software vor.

Der Vorteil ist, daß MySQL-Dump zur Laufzeit geht, ich muß das Wiki/CMS/Forum/Shop/Whatever nicht extra herunterfahren.

Wenn der Dump mit den passenden Parametern erstellt wurde, enthält er die passenden drop und create tables Befehle, damit läßt sich im Restore-Fall eine Datenbank von Null auf aufbauen und in kürzester Zeit gescriptet das System auf einen definierten Stand setzen.

Das nutze ich z.B. gerne, um ein Spiegelsystem auf einen definierten Schnappschuß-Zeitpunkt des Echtsystems zu setzen.
 
Einzelne Datenbank
Code:
mysqldump --allow-keywords --complete-insert --triggers --routines --events --order-by-primary --set-gtid-purged=OFF --tz-utc --hex-blob -uroot -p  database > /tmp/database.sql

Alle Datenbanken
Code:
mysqldump --flush-logs --master-data=2 --lock-all-tables --delete-master-logs --allow-keywords --complete-insert --triggers --routines --events --order-by-primary --set-gtid-purged=OFF --tz-utc --hex-blob --all-databases -uroot -p > /tmp/mysqldump.sql

Weitere Infos siehe Doku...
 
Wenn Du einen Server hast

Unter Debian/Ubuntu gibt es das Paket automysqlbackup. Das macht Dir automatisch in zyklisch Abständen(täglich,wöchentlich,monatlich) Dumps und komprimiert diese.

--single-transaction ist der Schalter von mysqldump der dafür sorgen wird, dass Dein Forum währen der Sicherung weiter läuft. Siehe Manpage von mysqldump. Ich vermute automysqlbackup nutzt diesen Schalter.

Das ganze in Kombination mit rsnapshot, was Dir die Dateien und Dumps vom Server wegsichert auf ein anderes System.

Wenn Du nur Webspace hast

Dei Software mysqldumper kann Dir über die Weboberfläche oder per Cron-Job DB-Dumps erstellen und diese per Mail schicken(Als Anhang oder als Link zum Download).

Ich meine mysqldumper kann auch ftp upload auf einen entfernten Server.

...Und kann was "passieren" wenn man man einfach so ohne was zu machen eine Sicherung macht und die einspielt...

Wenn Du einen ungünstigen Dump einer ungünstig angelegten Datenbank durchführst. Dann kann es passieren, dass die DB während der Sicherung blockiert ist und auch Deine Anwendung(=Webseite tot). Ich habe eine etwas ältliche Anwendung, die wird Nachts gesichert und dort ist das so. (30 GB MySQL, StorageEngine: MyISAM). Die Gefahr, dass das bei Deinem Forum auch so passiert würde ich äusserst gering einschätzen.

Was Du tunlichst unterlassen solltest, ist die Dateien von /var/lib/mysql händisch im laufenden Betrieb zu sichern. Ich kenne einige Leute die das tun und meinen dabei auch noch "is bis jetzt aber immer geloofn". Das kann man machen - ist halt Dreck, der einem vielleicht dann über die Füsse fällt wenn man das Backup wirklich braucht. Mach einen Dump und gut.

---

Neben Dateien der Forumssoftware, ist ein Backup von /etc auch immer ganz hilfreich, sowie eine Paketliste der installierten Pakete(dpkg --get-selections für Debian/Ubuntu oder rpm -qa für rpm-basierte Distris). (Ich persönlich sichere eigentlich immer den kompletten Server.)
 
Last edited by a moderator:
Wenn du das Script hier einstellen magst, hat vielleicht der Eine oder Andere auch Verwendung dafür.
PHP:
#!/bin/sh
#
# backup_wiki
#

umask 022

PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH

WIKI_BACKUP_DIR="/var/adm/backup/wiki"
MAX_WIKI_BACKUPS="8"

DATABASE=wikidb

HOSTNAME=`hostname -s`

BACKUP_FILE=$DATABASE-$HOSTNAME.sql

#
# create backups of wikidb data base as sql dump
#

if test -n "$WIKI_BACKUP_DIR" ; then
    mkdir -p $WIKI_BACKUP_DIR
    /usr/bin/mysqldump -uroot --opt -n $DATABASE \
      | grep -v "Dump completed on" > $WIKI_BACKUP_DIR/$BACKUP_FILE
    OLD_MD5=""
    test -e $WIKI_BACKUP_DIR/wiki_recent_md5 && \
        OLD_MD5="`cat $WIKI_BACKUP_DIR/wiki_recent_md5`"
    NEW_MD5="`cat $WIKI_BACKUP_DIR/$BACKUP_FILE | md5sum`"
    if test "$OLD_MD5" != "$NEW_MD5" ; then
        DATESTRING=`date +"%Y%m%d"`

        NEWNAME=$WIKI_BACKUP_DIR/$BACKUP_FILE-$DATESTRING
        NUMBER=2
        while [ -e $NEWNAME -o -e $NEWNAME.gz ] ; do
            NEWNAME=$WIKI_BACKUP_DIR/$BACKUP_FILE-$DATESTRING-$NUMBER
            NUMBER=`expr $NUMBER + 1`
        done

        if gzip -9 < $WIKI_BACKUP_DIR/$BACKUP_FILE > $NEWNAME.gz; then
            echo "$NEW_MD5" > $WIKI_BACKUP_DIR/wiki_recent_md5
            test "$MAX_WIKI_BACKUPS" -gt 0 2> /dev/null || MAX_WIKI_BACKUPS=0
            NUMBER=1
            for BACKUPFILE in `ls -1 -t $WIKI_BACKUP_DIR/$BACKUP_FILE-*` ; do
                if test "$NUMBER" -gt "$MAX_WIKI_BACKUPS" ; then
                    rm -f $BACKUPFILE
                fi
                NUMBER=`expr $NUMBER + 1`
            done
        else
            echo "ERROR!! can not backup WIKI Database to $WIKI_BACKUP_DIR."
            echo "Maybe there is not enough disk space."
            rm -f $NEWNAME $NEWNAME.gz
        fi
    fi
fi

exit 0
 
Das erstellt ein Backup der Datenbank oder wie ? Und das kann man auch wieder einfach bei phpmyadmin laden ?
 
Wenn wir schon bei Scripts sind:

Code:
#!/bin/bash
set -o pipefail

target_dir=/var/lib/btsync/Shares/backup/mysql

keep=5

MyUSER=backup
MyHOST=localhost
MyPASS=Bjwdh6jg
MyOPTS="--single-transaction --add-drop-database --add-locks --routines --triggers --events --default-character-set=utf8"

MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"

mkdir -p $target_dir
chmod 770 $(dirname $target_dir)

# do backup
$MYSQLDUMP --all-databases -u $MyUSER -h $MyHOST -p$MyPASS $MyOPTS | $GZIP -9 > $target_dir/$(date +%Y%m%d-%H%M).sql.gz

if [ $? != 0 ]; then
  echo "$(hostname -s)	backup_mysql	2	Backup of MySQL failed!" | /usr/sbin/send_nsca
  exit 1
fi

find $target_dir -type f -mtime +$keep -exec rm {} \;
find $target_dir -depth -type d -empty -exec rmdir {} \;

echo "$(hostname -s)	backup_mysql	0	Backup of MySQL finished $(date +%D-%T)" | /usr/sbin/send_nsca

Mein Script/Setup:
  • benutzt Authentifizierung gegenüber der DB (nicht einfach root ohne Passwd von local(host))
  • benutzt einen Backup-User, der nur Leseberechtigung hat
  • maskiert Fehler von mysqldump nicht hinter einer Pipe
  • sendet Erfolg/Fehlschlag via NSCA an mein Icinga-Monitoring

Nr. 1-3 sind Dinge, die mir bei Whistlers Script negativ aufgefallen sind.
 
Last edited by a moderator:
Mein Script macht's prinzipiell ähnlich mit einem Unterschied: Ich lasse mir nicht die kompletten DB-Server dumpen sondern lass mir erst mal eine Liste der DBs raus und dumpe dann die einzelnen DBs in ein ded. SQL-File.

Macht's um einiges einfacher, wenn man nicht den kompletten Server sondern nur eine einzelne DB zurückspielen will...
 
Nr. 1-3 sind Dinge, die mir bei Whistlers Script negativ aufgefallen sind.

1./2. hatte ich vereinfacht geschrieben (der MySQL-User hat ein Paßwort, welches man natürlich angeben muß),
3. mache ich darüber, daß mir CRON den Output von STDERR zumailt (der wird von der Pipe nicht mit umgelenkt).
 
Wenn Du einen Server hast

Unter Debian/Ubuntu gibt es das Paket automysqlbackup. Das macht Dir automatisch in zyklisch Abständen(täglich,wöchentlich,monatlich) Dumps und komprimiert diese.


lol ok . wie genau geht das ? habs installiert .


und wie genau geht

Code:
mysqldump --allow-keywords --complete-insert --triggers --routines --events --order-by-primary --set-gtid-purged=OFF --tz-utc --hex-blob -uroot -p  database > /tmp/database.sql

Code:
mysqldump: unknown variable 'set-gtid-purged=OFF'

? ohne set-gtid-purged=OFF gehts - doch geht es noch irgendwie dass ich nicht das PW eingeben muss ? weils ja ein script werden soll ...
 
Last edited by a moderator:
Endlich wieder Ferien...


Würdest Du bitte die Güte besitzen und künftig in ganzen und verständlichen Sätzen inklusive Punktuation zu kommunizieren, danke.
Dieses fordern im Übrigen auch die Nutzungsbedingungen, welche Du mit der Erstellung Deines Account akzeptiert hast.
 
#!/bin/bash

Code:
NOW=$(date +"%d-%m-%Y")
mysqldump --allow-keywords --complete-insert --triggers --routines --events --order-by-primary --tz-utc --hex-blob -uroot -p*** serversql1 > /root/serversql1_${NOW}.sql
exit

Ist das so gut ?? Sollte ich vorher noch die Tabellen sperren dass er da nicht was noch ändert während er sichert ? Wie geht das ?
 
Muss

Code:
--lock-all-tables

Einfach in den Befehl da rein oder wie ?
 
Back
Top