Datenbank-Backup per Email mit Backup2Mail und MariaDB

Vor einigen Jahren hat Marko Dugonjic ein kleines Skript namens Backup2Mail geschrieben, das es erlaubt, (automatische und regelmäßige) Datenbankbackups anzulegen und diese Backups an eine beliebige Emailadresse senden zu lassen. Als ich das Skript nach Jahren wieder nutzen wollte, stieß ich jedoch auf zwei Probleme: Mein Provider verlangte für die Verbindung mit einer MariaDB-Datenbank neben einer Server- auch eine Portangabe. Hierauf war Backup2Mail nicht vorbereitet. Außerdem waren die Datenbankbackups, die Backup2Mail schickte, falsch kodiert. Mit ein paar Änderungen am Skript lassen sich diese Probleme jedoch beseitigen.

Um Backup2Mail in Kombination mit MariaDB nutzen zu können, müssen an der derzeitigen „aktuellen“ Version 0.18 folgende Änderungen vorgenommen werden:

  • Unter „Database settings“ muss unter $db_server statt „localhost“ die korrekte IP-Adresse eingetragen werden.
  • Hinter $db_server muss eine neue Variable $db_port mit der korrekten Portnummer eingefügt werden:
    $db_port = 'port_hier_einfuegen';
  • Die Funktion db_dump() (Zeile 81 bis 95 in der Originaldatei) muss wie folgt ersetzt werden:
function db_dump() {

global $db_server, $db_port, $db_name, $db_user, $db_pass, $backup_filename, $html_output;

$port = (empty($db_port) === false) ? ' -P ' . $db_port : '';

$cmd = 'mysqldump -u ' . $db_user . ' -h ' . $db_server . $port . ' --password=' . $db_pass . ' ' . ($db_name == '' ? '--all-databases' : $db_name) . ' | gzip > ' . $backup_filename;

$dump_status = (passthru($cmd) === false) ? 'No' : 'Yes';

echo 'Command: ' . $cmd . '
';

echo 'Command executed? ' . $dump_status . '
';

return $dump_status;

}

Damit das Backup auch per Email versandt werden kann, sind noch die folgenden Änderungen notwendig:

  • Die Funktion send_attachment() muss wie folgt ersetzt werden:
function send_attachment($file, $file_is_db = true) {
global $send_to, $from, $website, $delete_backup, $html_output;
$sent = 'No';
$subject = 'MySQL backup - ' . ($file_is_db ? 'db dump' : 'report') . ' [' . $website . ']';
$boundary = md5(uniqid(time()));
$headers = 'From: ' . $from . "\n";
$headers .= 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '";' . "\n";
$headers .= 'Content-Language: de-DE' . "\n";
$headers .= 'This is a multi-part message in MIME format.';
$body .= '--' . $boundary . "\n";
$body .= 'Content-Type: text/plain; charset=utf-8; format=flowed' . "\n";
$body .= 'Content-Transfer-Encoding: 8bit' . "\n";
$body .= "\n" . 'Database backup file:' . "\n" . ' - ' . $file . "\n";
$body .= '--' . $boundary . "\n";
$body .= 'Content-Type: Application/Octet-Stream; charset=UTF-8; name="' . $file . "\"\n";
$body .= 'Content-Transfer-Encoding: base64' . "\n";
$body .= 'Content-Disposition: attachment; filename="' . $file . "\"\n";
$body .= "\n" . chunk_split(base64_encode(implode('', file($file)))) . "";
$body .= '--' . $boundary . "--\n";
if (mail($send_to, $subject, $body, $headers)) {
$sent = 'Yes';
echo ($file_is_db ? 'Backup file' : 'Report') . ' sent to ' . $send_to . '.
';
if ($file_is_db) {
if ($delete_backup) {
unlink($file);
echo 'Backup file REMOVED from disk.
';
} else {
echo 'Backup file LEFT on disk.
';
}
}
} else {
echo '' . ($file_is_db ? 'Database' : 'Report') . ' not sent! Please check your mail settings.
';
}
echo 'Sent? ' . $sent;
return $sent;
}
  • Zudem ist in der Funktion write_log() unmittelbar nach if (filesize($log_file) == '0') { die Zuweisung $log_header .= $label . "\n\n"; durch $log_header .= $label . "\n"; zu ersetzen.

Das Skript sollte nun wieder wie gewünscht funktionieren und kann mit einem CRON-Job auch automatisiert werden.

Datenbank-Backup per Email mit Backup2Mail und MariaDB

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.