MySQL und MariaDB sind für ihre Zuverlässigkeit und Leistungsfähigkeit bekannt. Dennoch benötigen auch diese Datenbanksysteme regelmäßige Wartung, damit Abfragen schnell bleiben, Speicherplatz effizient genutzt wird und mögliche Probleme frühzeitig erkannt werden.
Gerade bei Datenbanken, die von Blogs, Content-Management-Systemen, Webanwendungen oder anderen dynamischen Anwendungen verwendet werden, sammeln sich mit der Zeit Daten, veraltete Einträge und möglicherweise ineffiziente Tabellenstrukturen an.
Diese Anleitung zeigt, wie sich MySQL- und MariaDB-Datenbanken im laufenden Betrieb kontrollieren, analysieren, bereinigen und optimieren lassen, ohne unnötige Risiken einzugehen.
1. Vor jeder Wartung: Ein Backup erstellen
Bevor Änderungen an einer Datenbank vorgenommen werden, sollte grundsätzlich eine aktuelle Sicherung erstellt werden.
Für eine einzelne Datenbank:
mariadb-dump -u root -p \ --single-transaction \ --routines \ --events \ --triggers \ datenbankname > backup.sql
Bei MySQL:
mysqldump -u root -p \ --single-transaction \ --routines \ --events \ --triggers \ datenbankname > backup.sql
--single-transaction ermöglicht bei InnoDB-Tabellen eine konsistente Sicherung ohne längere Tabellensperren. Bei MyISAM gilt diese Garantie nicht.
Anschließend kann das Backup komprimiert werden:
gzip backup.sql
Wichtig: Ein Backup ist erst dann wirklich zuverlässig, wenn auch eine Wiederherstellung erfolgreich getestet wurde. Zusätzlich sollte die Sicherung auf einem anderen System aufbewahrt werden.
2. Zustand der Datenbank überprüfen
Zunächst wird eine Verbindung zum Datenbankserver hergestellt:
sudo mariadb
Alternativ:
mysql -u root -p
Alle Datenbanken anzeigen:
SHOW DATABASES;
Datenbank auswählen:
USE datenbankname;
Tabellen anzeigen:
SHOW TABLE STATUS;
Diese Ausgabe enthält Informationen über Tabellen, Speicherbedarf, Speicher-Engine und weitere Eigenschaften.
Speicherverbrauch der Tabellen ermitteln
SELECT
table_name AS Tabelle,
ROUND(data_length / 1024 / 1024, 2) AS Daten_MB,
ROUND(index_length / 1024 / 1024, 2) AS Index_MB,
ROUND((data_length + index_length)
/ 1024 / 1024, 2) AS Gesamt_MB
FROM information_schema.tables
WHERE table_schema = 'datenbankname'
ORDER BY data_length + index_length DESC;
Damit lassen sich besonders große Tabellen identifizieren.
Bei InnoDB handelt es sich teilweise um Schätzwerte. Die angezeigten Größen entsprechen nicht zwangsläufig dem tatsächlich freigebbaren Speicherplatz.
3. Tabellen auf Fehler überprüfen
MariaDB und MySQL bieten die Möglichkeit, Tabellen auf Probleme zu untersuchen.
Für eine einzelne Tabelle:
CHECK TABLE tabellenname;
Für mehrere Tabellen:
CHECK TABLE tabelle1, tabelle2, tabelle3;
Alternativ über die Kommandozeile:
MariaDB:
mariadb-check -u root -p \ --check datenbankname
MySQL:
mysqlcheck -u root -p \ --check datenbankname
Alle Datenbanken überprüfen:
mariadb-check -u root -p \ --all-databases --check
Hinweis: Eine vollständige Tabellenprüfung kann erhebliche I/O-Last verursachen. Bei großen produktiven InnoDB-Datenbanken sollte sie gezielt und vorzugsweise während eines Wartungsfensters durchgeführt werden. CHECK TABLE ersetzt keine InnoDB-Konsistenzprüfung oder einen Wiederherstellungstest.
4. Tabellen optimieren
Ein häufig verwendeter Wartungsbefehl lautet:
OPTIMIZE TABLE tabellenname;
Er kann insbesondere nach größeren Löschaktionen oder umfangreichen Datenänderungen sinnvoll sein.
Über die Kommandozeile:
mariadb-check -u root -p \ --optimize datenbankname
Oder für MySQL:
mysqlcheck -u root -p \ --optimize datenbankname
Was passiert bei OPTIMIZE TABLE?
Bei InnoDB wird die Tabelle in vielen Fällen intern neu aufgebaut. Dabei können Daten und Indizes reorganisiert werden.
Allerdings gilt:
- Die Operation kann erhebliche Zeit und zusätzlichen Speicherplatz benötigen.
- Je nach Version und Tabellenstruktur können Sperren auftreten.
- Nicht jede Optimierung führt zu einer messbaren Beschleunigung.
- Freigegebener Speicher wird nicht immer an das Betriebssystem zurückgegeben.
- Bei
innodb_file_per_tablekönnen Tabellen-Rebuilds unter geeigneten Bedingungen Dateispeicher zurückgeben.
Empfehlung: OPTIMIZE TABLE nicht pauschal täglich oder wöchentlich für alle InnoDB-Tabellen ausführen. Sinnvoll ist der Befehl insbesondere nach umfangreichen Löschaktionen und bei einem konkret festgestellten Bedarf.
5. Statistiken aktualisieren
Eine wichtige und häufig schonendere Wartungsmaßnahme ist die Aktualisierung der Tabellenstatistiken.
ANALYZE TABLE tabellenname;
Für mehrere Tabellen:
ANALYZE TABLE tabelle1, tabelle2;
Der Datenbankoptimierer verwendet Statistiken, um geeignete Ausführungspläne für SQL-Abfragen zu bestimmen.
Veraltete Statistiken können dazu führen, dass beispielsweise ein ungünstiger Index verwendet wird.
Nach umfangreichen Datenänderungen kann ANALYZE TABLE deshalb sinnvoll sein.
Auch diese Operation sollte bei großen Tabellen hinsichtlich ihrer Laufzeit und möglichen Sperrwirkungen geprüft werden.
6. Langsame Datenbankabfragen erkennen
Nicht jede langsame Datenbank benötigt eine Tabellenoptimierung. Häufig liegt das Problem an ineffizienten SQL-Abfragen oder fehlenden Indizes.
Den Status des Slow Query Logs überprüfen:
SHOW VARIABLES LIKE 'slow_query_log';
Weitere Einstellungen:
SHOW VARIABLES LIKE 'long_query_time'; SHOW VARIABLES LIKE 'slow_query_log_file';
Das Slow Query Log kann beispielsweise in der Datenbankkonfiguration aktiviert werden.
MariaDB:
[mariadb] slow_query_log = ON long_query_time = 2
MySQL:
[mysqld] slow_query_log = ON long_query_time = 2
Je nach Version unterscheiden sich unterstützte Variablennamen und Konfigurationsmöglichkeiten.
Nach einer Konfigurationsänderung ist gegebenenfalls ein Neustart des Datenbankdienstes erforderlich.
Die Auswertung kann unter anderem mit folgendem Werkzeug erfolgen:
mysqldumpslow /pfad/zur/slow-query.log
Bei MariaDB steht je nach Installation auch mariadb-dumpslow zur Verfügung.
SQL-Abfragen analysieren
EXPLAIN SELECT * FROM beispieltabelle WHERE benutzer_id = 123;
EXPLAIN zeigt, wie die Datenbank eine Abfrage voraussichtlich ausführt.
Besonders interessant sind fehlende Indizes, große untersuchte Datenmengen und unnötige vollständige Tabellenscans.
7. Nicht mehr benötigte Daten bereinigen
Gerade Webanwendungen sammeln häufig Daten an, die nicht dauerhaft benötigt werden.
Typische Beispiele sind alte Sitzungsdaten, temporäre Einträge, abgelaufene Tokens oder umfangreiche Protokolldaten.
Ein Beispiel für die Bereinigung einer anwendungseigenen Protokolltabelle:
DELETE FROM application_logs WHERE created_at < NOW() - INTERVAL 90 DAY;
Das Beispiel setzt voraus, dass die Tabelle und die Spalte tatsächlich existieren und eine Aufbewahrungsfrist von 90 Tagen fachlich zulässig ist.
Bei sehr großen Tabellen sollten Löschaktionen in kleinen, kontrollierten Chargen erfolgen, um lange Transaktionen und starke Belastungen zu vermeiden.
Achtung: Niemals unbekannte Tabellen oder vermeintlich überflüssige Datensätze direkt löschen. Bei WordPress, Nextcloud und anderen Anwendungen sollten bevorzugt deren eigene Bereinigungsmechanismen verwendet werden.
8. Serverstatus und Ressourcen kontrollieren
Ein weiterer wichtiger Bestandteil der Wartung ist die Überwachung des Datenbankservers.
Aktuelle Verbindungen anzeigen:
SHOW FULL PROCESSLIST;
Globale Statuswerte:
SHOW GLOBAL STATUS;
Maximal erlaubte Verbindungen:
SHOW VARIABLES LIKE 'max_connections';
Aktuelle Verbindungszahl:
SHOW GLOBAL STATUS LIKE 'Threads_connected';
Besonders wichtig sind außerdem CPU-Auslastung, Arbeitsspeicher, Datenträgerbelegung, I/O-Wartezeiten und auffällige Datenbankprozesse.
Unter Linux helfen beispielsweise:
top
free -h
df -h
iostat -xz 2
iostat ist Bestandteil des Pakets sysstat.
9. Datenbankprotokolle kontrollieren
Fehlerprotokolle liefern wertvolle Hinweise auf Probleme.
Den konfigurierten Pfad ermitteln:
SHOW VARIABLES LIKE 'log_error';
Unter Linux kann außerdem das Systemjournal geprüft werden:
sudo journalctl -u mariadb --since "24 hours ago"
Für MySQL entsprechend:
sudo journalctl -u mysql --since "24 hours ago"
Dabei sollte auf wiederkehrende Fehlermeldungen, unerwartete Neustarts, Speicherprobleme und beschädigte Tabellen geachtet werden.
10. Regelmäßigen Wartungsplan einführen
Nicht jede Maßnahme sollte gleich häufig durchgeführt werden.
Intervall
Empfohlene Wartung
Täglich
Backups, Backup-Status, Fehlermeldungen, Speicherplatz
Wöchentlich
Slow Queries, Serverressourcen, auffällige Tabellen
Monatlich
Tabellenwachstum, Indizes, Statistiken und Datenbereinigung
Bei Bedarf
ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE
Nach großen Änderungen
Abfragepläne, Statistiken und Speicherverbrauch kontrollieren
Regelmäßig
Wiederherstellung aus Backups testen
Die Häufigkeit hängt insbesondere von Datenbankgröße, Schreiblast, Verfügbarkeit und Bedeutung der Anwendung ab.
11. Wartung automatisieren
Für wiederkehrende, risikoarme Kontrollen bietet sich ein Shell-Skript an.
Beispiel:
#!/bin/bash
set -euo pipefail
DATE=$(date +%Y-%m-%d_%H-%M-%S)
LOGDIR="/var/log/db-maintenance"
mkdir -p "$LOGDIR"
{
echo "Wartung gestartet: $(date)"
echo "Datenbankversion:"
mariadb --version
echo "Datenbankverbindung:"
mariadb -e "SELECT VERSION();"
echo "Datenbankstatus:"
mariadb -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';"
echo "Freier Speicherplatz:"
df -h
echo "Wartung beendet: $(date)"
} >> "$LOGDIR/maintenance-$DATE.log" 2>&1
Das Skript setzt eine funktionierende lokale Authentifizierung voraus, beispielsweise über den Unix-Socket des administrativen Benutzers.
Ausführbar machen:
chmod 750 /usr/local/sbin/db-maintenance.sh
Ein Cron-Eintrag für die wöchentliche Ausführung am Sonntag um 03:00 Uhr:
0 3 * * 0 /usr/local/sbin/db-maintenance.sh
Das Skript führt bewusst nur lesende Prüfungen durch. Auf diese Weise entstehen keine unkontrollierten Tabellen-Rebuilds oder Löschaktionen.
12. Was sollte man vermeiden?
Einige vermeintliche Wartungsmaßnahmen können mehr schaden als nutzen.
Insbesondere sollte man nicht regelmäßig alle InnoDB-Tabellen optimieren, Datenbankdateien manuell löschen oder verändern, produktive Tabellen ohne Sicherung reparieren oder große Datenmengen ohne Wartungsfenster entfernen.
Auch REPAIR TABLE ist kein allgemeines Reparaturwerkzeug für InnoDB. Es wird für diese Engine nicht unterstützt.
Bei tatsächlichen InnoDB-Beschädigungen sind eine gezielte Fehleranalyse und gegebenenfalls die Wiederherstellung aus einem geprüften Backup erforderlich.
MySQL und MariaDB benötigen keine ständige manuelle Optimierung. Eine regelmäßige, strukturierte Kontrolle ist jedoch sinnvoll.
Die wichtigsten Wartungsmaßnahmen bestehen darin, Backups zu überprüfen, Tabellenwachstum zu beobachten, langsame Abfragen zu analysieren, unnötige Daten kontrolliert zu entfernen und bei Bedarf Statistiken zu aktualisieren.
Die beste Datenbankwartung ist nicht diejenige, die möglichst viele Optimierungsbefehle ausführt, sondern diejenige, die Probleme frühzeitig erkennt und unnötige Eingriffe vermeidet.