Lesefortschritt:

    Immer aktuelle Backups: Word­Press-Datenbank automatisch sichern

    7. Juni 2026 | functions.php, Word­Press

    Trick # 577 | Dieser Beitrag beinhaltet 923 Wörter. – Geschätzte Lesezeit: ca. 5 Minuten.

    Heute bauen wir uns ein Datenbank-Backup für die Word­Press-Website. In der Datenbank ist praktisch alles abgelegt, was Word­Press 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 Word­Press-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 Word­Press-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 Word­Press-Installation. Damit der Server nicht volläuft, löscht Word­Press 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

    Keine Inhalte gefunden.

    Werbung

     

    Pin It on Pinterest

    Share This