Wie Du die Binary Logs Deiner MySQL Datenbank löschen und zeitlich begrenzen kannst
MySQL und MariaDB schreiben jede Änderung am Datenbestand in das Binary Log. Das ist nützlich: es treibt die
Replikation an, und zusammen mit einem vollen Backup erlaubt es die Wiederherstellung auf jeden Zeitpunkt. Es
ist auch der Grund, warum einem Server, der seit zwei Jahren läuft, plötzlich der Plattenplatz ausgeht, bei
einem Verzeichnis voller mysql-bin.000001, mysql-bin.000002 und so weiter.
Zwei Aufgaben, in dieser Reihenfolge: löschen, was Du nicht mehr brauchst, und dann verhindern, dass der Stapel neu wächst.
Erst schauen, dann löschen
SHOW BINARY LOGS;
SHOW VARIABLES LIKE 'log_bin%';
Die erste Anweisung listet die Log-Dateien mit ihrer Größe, die zweite zeigt, ob das Log überhaupt an ist und wo die Dateien liegen. Wenn Du Repliken betreibst, prüfe vor dem Löschen, wie weit sie gelesen haben — ein Log zu löschen, das eine Replik noch braucht, bricht die Replikation, und die Reparatur ist eine neue Kopie der Daten.
Die alten Logs löschen
Nach Datum löschen oder bis zu einer bestimmten Datei:
PURGE BINARY LOGS BEFORE '2026-11-01 00:00:00';
PURGE BINARY LOGS TO 'mysql-bin.000123';
Ein rollendes Fenster von sieben Tagen, ohne ein Datum zu tippen:
PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 7 DAY);
Und alles bis zu diesem Augenblick, womit nur das Log übrig bleibt, in das der Server gerade schreibt:
PURGE BINARY LOGS BEFORE NOW();
Die Anweisung braucht in MySQL 8 das Recht BINLOG_ADMIN (SUPER in älteren Versionen, BINLOG ADMIN in
MariaDB). Sie löscht die Dateien und pflegt die Index-Datei — genau darum ist rm mysql-bin.* das falsche
Werkzeug. Nach einem rm führt der Index Dateien, die es nicht mehr gibt, und der Server beschwert sich bei
jedem Start darüber.
Verhindern, dass sie sich neu stapeln
Der Server kann alte Logs selbst verfallen lassen. Welche Variable Du brauchst, hängt vom Produkt ab:
MySQL 8.0 und neuer rechnet in Sekunden. Die Vorgabe ist 2592000, also dreißig Tage.
SET PERSIST binlog_expire_logs_seconds = 604800; -- 7 Tage, übersteht einen Neustart
MariaDB rechnet in Tagen:
SET GLOBAL expire_logs_days = 7;
SET GLOBAL wirkt sofort, ist nach einem Neustart aber vergessen — MySQL 8 hat dafür SET PERSIST, MariaDB
braucht die Konfigurationsdatei. Die Einstellung gehört in den Abschnitt [mysqld] von /etc/mysql/my.cnf
oder /etc/my.cnf:
[mysqld]
# MySQL 8 und neuer
binlog_expire_logs_seconds = 604800
# MariaDB
expire_logs_days = 7
Nimm die Zeile, die zu Deinem Server passt; eine unbekannte Variable hindert MySQL am Start.
expire_logs_days ist in MySQL 8.0 als veraltet markiert und in MySQL 8.4 nicht mehr vorhanden, während
MariaDB es weiter annimmt. Im Zweifel den Server fragen:
SHOW VARIABLES LIKE '%expire_logs%';
Wenn Du schon in der Datei bist: max_binlog_size (Vorgabe 1 GB) entscheidet, wie groß eine einzelne
Log-Datei wird, bevor der Server zur nächsten wechselt. Kleinere Dateien werden in feineren Schritten
gelöscht.
Das Log ganz abschalten
Wenn es keine Replik und keinen Plan für die Wiederherstellung auf einen Zeitpunkt gibt, kannst Du das Schreiben der Binary Logs ganz beenden:
[mysqld]
skip-log-bin
Sei Dir klar darüber, was Du aufgibst: danach ist das Backup von letzter Nacht der neueste Stand, den Du wiederherstellen kannst. Auf jedem Server mit Kundendaten ist die Begrenzung der Lebensdauer der bessere Handel als das Abschalten.
Häufige Fragen
Kann ich die mysql-bin-Dateien einfach mit rm löschen?
Nein. Der Server führt eine Index-Datei, in der die Binary Logs stehen. Entfernst Du Dateien hinter seinem Rücken, zeigt der Index weiter auf sie, der Server schreibt Fehler, und eine Replikation kann stehen bleiben. Nimm PURGE BINARY LOGS — das löscht die Dateien und pflegt den Index mit.
Brauche ich Binary Logs auf einem einzelnen Server ohne Replikation?
Nur für die Wiederherstellung auf einen Zeitpunkt: ein volles Backup plus die Binary Logs bringt Dich bis zur Minute vor dem Fehler. Ohne diesen Plan sind die Logs reiner Plattenverbrauch, und Du kannst sie mit skip-log-bin abschalten.
Wie lange soll ich sie aufbewahren?
Mindestens so lange wie das älteste Backup, das Du wirklich wiederherstellen würdest, plus einen Zuschlag für die langsamste Replik. Sieben Tage sind für einen einzelnen Server mit täglichem Backup eine übliche Wahl.
Welche Variable benutzt mein Server?
Führe SHOW VARIABLES LIKE "%expire_logs%" aus. MySQL 8 meldet binlog_expire_logs_seconds, MariaDB meldet expire_logs_days, neuere MariaDB-Versionen melden beides.