MySQL Backup
Das folgende Perl Script führt den Backup aller Datenbanken auf einem MySQL Server durch. Dabei wird für jede Datenbank ein Ordner der mit dem Datenbanknamen betitelt ist angelegt.
Um das Script nutzen zu können, muss der MySQL Server vom Rechner auf dem das Script ausgeführt wird erreichbar sein!
Um Datenbanken dem Backup auszuschließen, können diese in das BLACKLIST Array eingetragen werden. So werden die Datenbanken beim Backup übersprungen. Was vor allem bei der Datenbank information_schema oder mysql sinnvoll ist.
Das Script
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #!/usr/bin/perl use DBI; # Variablen my $DUMP_DIR = "/data/sqlbackup/"; # Zielordner my $MYSQL_HOST = "localhost"; # Host des MySQL Servers my $MYSQL_USER = "username"; # Username my $MYSQL_PASS = "password"; # Password # Ausgeschlossene Datenbanken my @BLACKLIST = ("information_schema","mysql"); sub is_in_array{ foreach my $i (@BLACKLIST){ if ($DBS[0] eq $i) { return 1; } } return 0; } # Datum ermitteln my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time); my $time = sprintf("%0.2d-%0.2d-%0.2d",$hour,$min,$sec); my $date = sprintf("%0.2d-%0.2d-%0.2d",$year+1900,++$mon,$mday); # Herstellen der MySQL Verbindung my @DSN = ('DBI:mysql:host='.$MYSQL_HOST, $MYSQL_USER , $MYSQL_PASS); my $DB = DBI->connect(@DSN) || exit 1; print "\\n\\n#=> Verbindung hergestellt\\n"; # Auslesen der Datenbanken $RESULT = $DB->prepare('show databases') || die "Error: ".$DBI::errstr; $RESULT->execute() || die "Error: ".$DBI::errstr; print "#=> Datenbanken ausgelesen\\n"; # Backups erstellen print "#=> Starte Backup\\n\\n"; while(@DBS=$RESULT->fetchrow_array) { # Wenn Datenbank nicht in Blacklist if(is_in_array()==0) { # Falls nicht vorhanden Ordner fuer Datenbank anlegen if(! -d $DUMP_DIR.$DBS[0]) { mkdir($DUMP_DIR.$DBS[0],0700); } print " => Datenbank \\"".$DBS[0]."\\"\\n"; # Backup durchfuehren my $dump_file = $DUMP_DIR . $DBS[0] . "/" .$date . "_" . $time . "_". $DBS[0] . ".sql.gz"; my $dump_command = "/usr/bin/mysqldump --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS --compress --no-create-db $DBS[0] | gzip > $dump_file"; system($dump_command); # Ueberspringen } else { print " => Datenbank \\"".$DBS[0]."\\" uebersprungen\\n"; } } print "\\n#=> Backup beendet\\n"; # Verbindung trennen $RESULT->finish() || die "Error: ".$DBI::errstr; $DB->disconnect() || die "Error: ".$DBI::errstr; print "#=> Datenbank Verbindung getrennt\\n\\n"; |
Ausgabe
Der Output des Scripts sieht dann wie folgt aus.
| 1 2 3 4 5 6 7 8 9 10 11 12 | #=> Verbindung hergestellt #=> Datenbanken ausgelesen #=> Starte Backup => Datenbank "information_schema" uebersprungen => Datenbank "mysql" uebersprungen => Datenbank "datenbank1" => Datenbank "datenbank2" => Datenbank "datenbank3" #=> Backup beendet #=> Datenbank Verbindung getrenn |
Nach dem Herstellen der MySQL Verbindung werden alle Datenbanken ausgelesen und in einer Schleife die Backups erstellt. Dabei wird überprüft, ob schon ein Ordner mit dem Datenbanknamen als betitelung vorhanden ist. Ist dies nicht der Fall, wird der Ordner erstellt.
Der Backup wird als komprimierter gzip SQL Dump erstellt. Um den Dump wieder einspielen zu können, muss der Dump entpackt werden, oder mit zcat an mysql übergeben werden.
Dump wieder einspielen
| 1 | zcat /sqldumps/datenbank1/2009-01-03_15-50-21_datenbank1.sql.gz | mysql -h hostname -u benutzername --database=datenbank1 |
Mit dem obrigen Befehl kann die Datenbank wieder Reimportiert werden. zcat dekomprimiert den Datenbank Dump und gibt ihn über stdout aus. Über ein Pipe-Zeichen ( | ) wird der Output an den MySQL Befehl übergeben. So wird die Datenbank wieder importiert.




