Trick # 577 | Dieser Beitrag beinhaltet 923 Wörter. – Geschätzte Lesezeit: ca. 5 Minuten.
Heute bauen wir uns ein Datenbank-Backup für die WordPress-Website. In der Datenbank ist praktisch alles abgelegt, was WordPress nützlich und schön macht. Vor allem aber auch sind alle unsere Inhalte in der Datenbank. Zu dumm, wenn die Datenbank abschmieren sollte; es sei denn man hat ein aktuelles Backup zur Hand. Dann sind vielleicht ein paar Stunden – aber nicht ganze Tage verloren. So ein Backup bauen wir heute.
Eins vorweg: Dieses Backup-Script sichert Ihre Datenbank auf den Webserver, auf welchem Ihre Website liegt. Das ist kein 100-Prozent-Schutz – aber allemal besser als gar kein Backup; respektive ein teures Restore durch den Provider.
Mit dieser Lösung haben Sie aber jederzeit ein aktuelles Backup zur Hand, wenn Sie zum Beispiel mit einem fehlerhaften Code die Website zerschossen haben.
Fangen wir aber vorne an. Sie benötigen nicht mehr als das folgende PHP-Script. Legen Sie es in der Datei functions.php ab (unter Design/Theme-Datei-Editor im Backend):
// Routine zur Sicherung der WordPress-Datenbank
function backup_wordpress_database() {
global $wpdb;// Pfad und Name der Backup-Datei
$backup_dir = wp_upload_dir()['basedir'] . '/db_backups';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
$backup_file = $backup_dir . '/backup_' . date('Y-m-d_H-i-s') . '.sql';
$compressed_file = $backup_file . '.gz';// Befehl zur Datenbanksicherung
$command = sprintf(
'mysqldump --user=%s --password=%s --host=%s %s > %s',
DB_USER,
DB_PASSWORD,
DB_HOST,
DB_NAME,
escapeshellarg($backup_file)
);// Backup ausführen
exec($command, $output, $return_var);if ($return_var !== 0) {
error_log('Datenbank-Backup fehlgeschlagen: ' . print_r($output, true));
return;
}// Backup komprimieren
$gz = gzopen($compressed_file, 'wb9');
$sql_data = file_get_contents($backup_file);
gzwrite($gz, $sql_data);
gzclose($gz);// Ursprüngliche SQL-Datei löschen
unlink($backup_file);error_log('Datenbank-Backup erfolgreich erstellt: ' . $compressed_file);// Maximal 30 Dateien behalten
$files = glob($backup_dir . '/backup_*.sql.gz');
usort($files, function($a, $b) {
return filemtime($b) - filemtime($a);
});if (count($files) > 30) {
$files_to_delete = array_slice($files, 30);
foreach ($files_to_delete as $file) {
unlink($file);
}
}
}// Ereignis für Backup planen
if (!wp_next_scheduled('four_hourly_backup')) {
wp_schedule_event(strtotime('08:00:00'), 'four_hours_limited', 'four_hourly_backup');
}
add_action('four_hourly_backup', 'backup_wordpress_database');// Intervall alle vier Stunden zwischen 8:00 und 20:00 hinzufügen
add_filter('cron_schedules', function ($schedules) {
$schedules['four_hours_limited'] = [
'interval' => 4 * HOUR_IN_SECONDS,
'display' => __('Every Four Hours (Limited)'),
];
return $schedules;
});// Admin-Seite zur Verwaltung der Backups
add_action('admin_menu', function() {
add_menu_page(
'DB Backups',
'DB Backups',
'manage_options',
'db-backups',
'render_db_backups_page',
'dashicons-database'
);
});function render_db_backups_page() {
if (!current_user_can('manage_options')) {
return;
}$backup_dir = wp_upload_dir()['basedir'] . '/db_backups';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
$files = glob($backup_dir . '/backup_*.sql.gz');
usort($files, function($a, $b) {
return filemtime($b) - filemtime($a);
});echo '<div class="wrap">';
echo '<h1>Database Backups</h1>';
echo '<table class="widefat">';
echo '<thead><tr><th>Datei</th><th>Grösse</th><th>Erstellt am</th><th>Aktionen</th></tr></thead><tbody>';foreach ($files as $file) {
$file_url = wp_upload_dir()['baseurl'] . '/db_backups/' . basename($file);
$file_size = size_format(filesize($file));
$file_time = date('Y-m-d H:i:s', filemtime($file));echo '<tr>';
echo '<td>' . esc_html(basename($file)) . '</td>';
echo '<td>' . esc_html($file_size) . '</td>';
echo '<td>' . esc_html($file_time) . '</td>';
echo '<td><a href="' . esc_url($file_url) . '" download class="button">Herunterladen</a></td>';
echo '</tr>';
}echo '</tbody></table>';
echo '</div>';
}Das war’s auch schon.
Natürlich noch ein paar erklärende Worte: Ab sofort macht das Script alle vier Stunden – täglich zwischen 8 und 20 Uhr – eine Kopie Ihrer aktuellen WordPress-Datenbank. Diese Kopie wird komprimiert und mit einem Zeitstempel versehen. Anschliessend landet das File im Upload-Verzeichnis Ihrer Website: unter https://ihredomain.com/wp-content/uploads/db_backups/
Die vier Backups je Tag enthalten die vollständigen Daten Ihrer Website – aber natürlich keine Dateien der WordPress-Installation. Damit der Server nicht volläuft, löscht WordPress die ältesten Files automatisch, sobald deren Anzahl den Wert 30 übersteigt.
Und zu guter Letzt haben Sie einen Adminbereich: Im Backend erhalten Sie den neuen Menüpunkt «DB-Backups». Dort sind sämtliche vorhandenen Backupversionen fein säuberlich aufgelistet und Sie können sie sogar herunterladen.
Wie erwähnt: Der Backupschutz ist nicht perfekt. Wenn Ihr Webserver plötzlich gelöscht werden sollte, sind logischerweise auch die dort enthaltenen Backups futsch. Aber für das Daily Business und den schnellen Datenbank-Restore zwischendurch, funktioniert diese Lösung gut.
Werbung


