Linux Self-Hosted Datenbanken Administration

MySQL und MariaDB warten und optimieren – Die praktische Anleitung

Auch MySQL- und MariaDB-Datenbanken benötigen regelmäßige Pflege. Diese Anleitung zeigt Schritt für Schritt, wie sich Datenbanken überprüfen, Tabellen optimieren, Statistiken aktualisieren, langsame Abfragen analysieren und Wartungsarbeiten unter Linux automatisieren lassen – inklusive praktischer SQL-Befehle und Bash-Beispiele.

6 min Lesezeit
Grafik: MySQL und MariaDB: Wartung und Optimierung

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_table kö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.