Archive und der Staub

Freundlicherweise bieten viele Hoster ihre Rootserver inklusive Backupspace an, meistens FTP. Sehr praktisch, denn so kann man beispielsweise nachts ein schönes Backup aller Datenbanken machen und die archivierten Backups auf den FTP-Server schieben. Wer dabei schonmal als Übertragungsmodus ASCII statt BINARY verwendet hat wird wissen wie wichtig es ist, auch immer gleich zu prüfen, ob ein Restore geht ;) Allerdings muss man sich trotz großzügigem Platzangebot auf den Backupservern auch mit der Frage beschäftigen, wie man dort nach gewisser Zeit wieder Platz schafft. Ich habe diese Frage etwas vor mir her geschoben und jetzt ist mein Backupserver gut gefüllt. Gut, dass auch hier das Netz wieder allerlei Sammlungen an Tipps und Befehlslisten vorhält, wie zum Beispiel auf der Seite von Moritz Schubel. Ich habe mich zuerst mit einem mdelete versucht, aber dabei muss man jede einzelne Löschung bestätigen. Die Lösung ist hier ein promt vorneweg zu schicken, das dann den interaktiven Modus beendet :)

Natürlich gibt es auch in der Rails-Community wieder fleißige Helferchen, die bereits Tasks zum Thema Datenbank-Backups erstellt haben. Craig Ambrose zum Beispiel zeigt in seinem Post A Rake Task for Database Backups eine Möglichkeit auf, insbesondere die vielen Kommentare zu seinem Post sind interessant.

Besonders ärgerlich bei meinem letzten Festplattencrash war auch, dass alle Daten aus meinem OpenLDAP einfach weg waren :( Dass man diese auch backupen sollte ist eigentlich das Logischste der Welt, aber ich glaube, dass man diese schmerzhafte Erfahrung einmal machen muss, dann vergisst man das nie wieder. Dabei ist das Sichern des Datenbestandes in einem LDAP-Verzeichnis denkbar einfach:

$ slapcat -l my_backup.ldif

Und auch das Restore ist kein Hexenwerk:

$ slapadd -l my_backup.ldif

Dann das ldif noch komprimieren und ab damit auf unseren Backupserver, per Cron natürlich, man ist ja schließlich vergesslich :D Das könnte dann im guten alten PHP ersmal in etwa so aussehen:

// Lokaler Teil
$dir_name = "ldap";

// In das Standard-Backupverzeichnis wechseln
chdir("/var/backups/".$dir_name);

$file_praefix = "ldap_backup_";
$file_suffix = ".ldif";

// Schritt 1: Daten in LDIF packen
shell_exec("slapcat -l ".$file_praefix.date('d_m_y_H').$file_suffix);

// Schritt 2: Das entstandene LDIF-File komprimieren
shell_exec("tar -czf ".$file_praefix.date('d_m_y_H').$file_suffix.".gz ".$file_praefix.date('d_m_y_H').$file_suffix." 2> /dev/null");

// Schritt 3: Das unkomprimierte LDIF-File loeschen
shell_exec("rm ".$file_praefix.date('d_m_y_H').$file_suffix);

// Alle Archive lokal loeschen, die aelter als 7 Tage sind
deleteOldGz(7);

// Remote Teil
// Alle Backups nun auf den FTP-Server schieben
$connection_id = ftp_connect($ftp_server, $ftp_port);
$login_result = ftp_login($connection_id, $ftp_benutzername, $ftp_passwort);

// In das LDAP-Verzeichnis wechseln
ftp_chdir($connection_id, $dir_name);

// Auf dem FTP-Server werden in der Schleife alle Backups geloescht, die aelter als 30 Tage sind.
// Erst alle Dateien vom Server holen
$alle_dateien = ftp_nlist($connection_id, '.');

$zieldatei = $lokale_datei = $file_praefix.date('d_m_y_H').$file_suffix.".gz";
$upload = ftp_put($connection_id, $zieldatei, $lokale_datei, FTP_BINARY);

// Alle alten Archive dieser Datenbank auf dem FTP-Server loeschen
$suche = $file_praefix.date('d_m_y_H', time() - 30 * 86400).$file_suffix.".gz";

// Wenn eine Datei entsprechend dem Suchstring im Array vorhanden ist, diese loeschen
if(in_array($suche, $alle_dateien))
ftp_delete($connection_id, $suche);

ftp_quit($connection_id);

Keine Kommentare mehr möglich.