[PHP] Backup erstellen / versenden

27o8

abgemeldet
2 Mai 2006
9.028
933
Hallo,
ich habe mir folgendes kleines Script geschrieben, um täglich ein Backup der Datenbank zu machen:

PHP:
<?php
/* Zugangsdaten */
$db_host = 'foo';
$db_user = 'foo';
$db_pass = 'foo';

/* Datenbanken festlegen */
$haupt_db = 'foo';
$foren_db = 'bar';

/* Zur DB verbinden und Datenbank auswählen */
mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($haupt_db);

/* Seite auf Wartungsmodus setzen */
mysql_query('UPDATE wartung SET start='.time().', grund="Zur Zeit wird ein Backup der Datenbank erstelt. Wir sind in wenigen Augenblicken wieder verfügbar." LIMIT 1');

/* Haupt-DB backupen */
exec("mysqldump --host=".$db_host." --user=".$db_user." --password=".$db_pass." --opt ".$haupt_db." > /var/www/web4/html/backup/script_".date("d-m-y").".sql");
    
/* Foren-DB backupen */
exec("mysqldump --host=".$db_host." --user=".$db_user." --password=".$db_pass." --opt ".$foren_db." > /var/www/web4/html/backup/forum_".date("d-m-y").".sql");

/* Seite wieder freigeben */
mysql_query('UPDATE wartung SET grund="" LIMIT 1');    

/* MySQL Verbindung schließen */
mysql_close();

/* Backups komprimieren */    
exec("gzip /var/www/web4/html/backup/script_".date('d-m-y').".sql");
exec("gzip /var/www/web4/html/backup/forum_".date('d-m-y').".sql");
?>

Das ganze läuft auch ganz gut, es werden die Dumps der Datenbanken erstellt, in der Zwischenzeit ist die Seite im Wartungsmodus. Wenn die Dumps fertig sind öffnet die Seite wieder und das Script komprimiert noch die *.sql Dateien.

Nun würde ich diese am liebsten entweder:

a) An eine E-Mail Adresse schicken
b) Auf einen externen FTP Server uppen

Was davon würdet ihr mir empfehlen? Und falls ihr b) empfehlen solltet, wie stelle ich das am geschicktesten an.

Eine letzte Frage wäre noch, ob ich die erstellten Archive mit einem Passwort schützen kann (direkt per PHP) :think: und ob man die vielleicht noch kleiner bekommt. Forum Backup hat komprimiert immerhin noch 38MB, als normale .sql knapp 1,3 GB :roll: ist zwar schon eine extrem gute Komprimierung allerdings finde ich, ist das trotzdem noch viel :mrgreen:
 
Versuch mal
Code:
gzip --best
, damit müsste noch ein bisschen Speicher rauszukitzeln sein. Einen Passwort-Switch gibt es laut Manpage nicht.

a) mail()
b) ftp_put()

Ich würde FTP empfehlen, weil ich die Mail erst wieder runterladen muss, d.h. Traffic und Zeit braucht. Des Weiteren hab ich bei großen Mails immer ein mulmiges Gefühl, aber gut, ob FTP oder Mail is eigentlich wurscht.

Wie's geht, steht oben, einfach im Manual nachgucken.
Statt für a) das Rad neu zu erfinden, google nach PHPMailer. Damit kannst du Mails mit Attachments mit einigen wenigen Zeilen verschicken.
 
Ich weiss ja nicht, wie lange du die Datenbankbackups rumliegen hast, aber falls du sie langfristig vorliegen haben musst, wäre es eventuell sinnvoll, nur die jeweiligen Diff-Files statt der gesamten Datenbank vorrätig zu haben.

Anstatt das Archiv zu verschlüsseln, könntest du z.B. eine verschlüsselte Partition auf dem Zielserver erstellen, in der dann die Backups landen.
 
Klappt :)

Danke! Habe es nun noch etwas umgeschrieben (Namen) und um den FTP Transfer erweitert. Das --best hat die Datei noch einmal knapp 10MB kleiner gemacht. :)

PHP:
<?php
/* Zugangsdaten */
$db_host = 'foo';
$db_user = 'foo';
$db_pass = 'foo';

/* Datenbanken festlegen */
$haupt_db = 'foo';
$foren_db = 'bar';

/* Backup Server Daten */
$backup_server_ip    = 'foo';
$backup_server_login = 'foo';
$backup_server_pass  = 'bar';
$pfad = '/foo/';

/* Zur DB verbinden und Datenbank auswählen */
mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($haupt_db);

/* Seite auf Wartungsmodus setzen */
mysql_query('UPDATE wartung SET start='.time().', grund="Zur Zeit wird ein Backup der Datenbank erstelt. Wir sind in wenigen Augenblicken wieder verfügbar." LIMIT 1');

/* Haupt-DB backupen */
exec("mysqldump --host=".$db_host." --user=".$db_user." --password=".$db_pass." --opt ".$haupt_db." > /var/www/web4/html/backup/paidmail_".date("d-m-y").".sql");
    
/* Foren-DB backupen */
exec("mysqldump --host=".$db_host." --user=".$db_user." --password=".$db_pass." --opt ".$foren_db." > /var/www/web4/html/backup/forum_".date("d-m-y").".sql");

/* Seite wieder freigeben */
mysql_query('UPDATE wartung SET grund="" LIMIT 1');    

/* MySQL Verbindung schließen */
mysql_close();

/* Backups komprimieren */    
exec("gzip --best /var/www/web4/html/backup/paidmail_".date('d-m-y').".sql");
exec("gzip --best /var/www/web4/html/backup/forum_".date('d-m-y').".sql");

/* SSL Verbindung zum Backup Server herstellen */
$ftp = ftp_ssl_connect($backup_server_ip);
ftp_login($ftp, $backup_server_login, $backup_server_pass);

/* Wenn Dateien kopiert wurden, vom lokalen Server löschen */
if (ftp_put($ftp, $pfad."forum_".date('d-m-y').".sql.gz", "/var/www/web4/html/backup/forum_".date('d-m-y').".sql.gz", FTP_ASCII) AND ftp_put($ftp, $pfad."paidmail_".date('d-m-y').".sql.gz", "/var/www/web4/html/backup/paidmail_".date('d-m-y').".sql.gz", FTP_ASCII))
{
    unlink("./forum_".date('d-m-y').".sql.gz");
    unlink("./paidmail_".date('d-m-y').".sql.gz");
}

/* FTP Verbindung schließen */
ftp_close($ftp);
?>

Klappt perfekt. :D

Ich weiss ja nicht, wie lange du die Datenbankbackups rumliegen hast
In der Regel eine Woche, wenn ich jedoch mal längere Zeit weg bin (Urlaub etc.) dann über den gesamten Zeitraum.

nur die jeweiligen Diff-Files statt der gesamten Datenbank vorrätig zu haben.
Was meinst du damit? :oops:
 
Was meinst du damit? :oops:
Backup A hat das hier:
INSERT a;
INSERT b;
Backup B:
INSERT a;
INSERT b;
INSERT c;
Platzbedarf: 20+30 = 50 Bytes

Besser:

Backup A:
INSERT a;
INSERT b;
Backup B:
Platzbedarf: 20+17 = 37 Bytes

(soll nur das Prinzip erklären)

Tipp einfach mal
Code:
[FONT=Lucida Sans Unicode]man diff[/FONT]
ein ;)
 
Hi,

ich kann dir auch mal raten https://mysqldumper.de/ anzuschauen.
Mit dem kannst du auch Cron-Backups erstellen und FTP&Mail Support ist schon Integriert ;)
Auch das Splitten von zu Großen Datenbanken ist vorhanden.

Das Script ist einfach, hat auch eine Wiederherstellungsoberfläche - auch hilfreich bei großen Datenbanken.
 
Danke. Das hatte ich mal im Einsatz und damit täglich meine Datenbanken gebackupt, aber irgendwo war da der Wurm drin. Hatte das über das cgi Script gemacht.

Dann gab es Nachts immer Ausfälle, und irgendwann hat der Techniker dann bemerkt das es die crondump.pl war welche den Server immer lahmgelegt hat. :-?

Ich hab zwar keine Ahnung warum, aber habe es seitdem nicht mehr benutzt und keinerlei Probleme mehr gehabt mit dem Server.
 
Hi, okay woran dies liegt ist mir auch unklar, nutze es selber.

Ich habe das immer um 04:18 gestartet, den da sollten die meisten Scripte usw. fertig sein. Die vom Hoster i.d.R. um 0-1h gestartet werden (Traffic Berechnung, Space Berechnung etc - Confixx/Plesk halt) und bei mir gibt es keine Probleme...

Aber dennoch gutes gelingen.