Docker/Datenbanken/MySQLMariaDB: Unterschied zwischen den Versionen

Aus Foxwiki
Wechseln zu:Navigation, Suche
Die Seite wurde neu angelegt: „== MySQL und MariaDB == MySQL zählt zu den populärsten Open-Source-Datenbanksystemen zur Entwicklung von Webanwendungen * Websites wie Facebook oder Wikipedia sind mit MySQL als Datenbank-Management-System groß geworden * MySQL ist ein »klassisches« relationales DBMS mit SQL als primärer Sprache MySQL versus MariaDB MySQL wurde ursprünglich von der MySQL AB entwickelt, einer schwedischen Firma Später wurde Oracle der Eigentümer von MySQL * Einig…“
 
 
(kein Unterschied)

Aktuelle Version vom 11. November 2026, 12:50 Uhr

MySQL und MariaDB

MySQL zählt zu den populärsten Open-Source-Datenbanksystemen zur Entwicklung von Webanwendungen

  • Websites wie Facebook oder Wikipedia sind mit MySQL als

Datenbank-Management-System groß geworden

  • MySQL ist ein »klassisches« relationales DBMS mit SQL als primärer Sprache

MySQL versus MariaDB MySQL wurde ursprünglich von der MySQL AB entwickelt, einer schwedischen Firma Später wurde Oracle der Eigentümer von MySQL

  • Einige der ursprünglichen MySQL-

Gründer initiierten dann ein neues Projekt, dessen Ergebnis ein weitgehend mit MySQL kompatibler Datenbankserver mit dem Namen MariaDB ist

Damit haben Sie nun die Wahl zwischen MySQL und MariaDB

  • In der Docker-Anwendung werden Sie nur wenige Unterschiede zwischen den beiden Systemen feststellen

Die Konfiguration erfolgt exakt gleich, selbst die Dokumentation auf dem Docker Hub ist über weite Strecken Wort für Wort identisch https://hub.docker.com/_/mysql https://hub.docker.com/_/mariadb In diesem Buch geben wir MariaDB den Vorzug

  • Für den Wechsel zwischen MariaDB

und MySQL reicht es, anstelle von mariadb den Image-Namen mysql zu verwenden Dabei ist aber zu beachten, dass ein derartiger Wechsel nur gelingt, solange noch keine Daten gespeichert wurden

  • Die Datenbankdateien von MariaDB und MySQL

sind nämlich nicht kompatibel miteinander. (Eine manuelle Portierung der Daten mit den Kommandos mysqldump und mysql ist aber in der Regel möglich.)

Noch eine letzte Vorbemerkung: Ihrer Popularität zum Trotz sind weder MySQL noch MariaDB ideale DBMS-Kandidaten für den Docker-Einsatz! Zwei Gründe sprechen gegen MySQL und MariaDB

Konzeption: MySQL und MariaDB sind für den Servereinsatz optimiert und können bei richtiger Konfiguration mit unzähligen Datenbanken und Clientverbindungen umgehen

  • Im Docker-Umfeld passiert es aber häufig, dass nicht nur ein, sondern gleich mehrere Datenbank-Container nebeneinander eingerichtet werden
  • Das kostet eine Menge Platz und Geschwindigkeit

Platzbedarf: Das Paradigma von Docker ist, dass Images, Container und Volumes möglichst schlank sein sollen

  • MySQL und MariaDB sind aber vergleichsweise riesige Systeme (siehe Tabelle 10.1)
  • Das Volume ist für das Verzeichnis /var/lib/mysql erforderlich, das Datenbank-, Loggingund Transaktionsdateien enthält
  • Sobald

Datenbanken angelegt werden, steigt der Platzbedarf dort natürlich weiter

DBMS           Image-Größe       Anfängliche Volume-Größe
MariaDB 11.0      405 MByte                          175 MByte
MySQL 8           565 MByte                         190 MByte

Tabelle 10.1 MySQL und MariaDB sind Docker-Schwergewichte

In der Praxis führt dennoch oft kein Weg an MariaDB bzw

  • MySQL vorbei
  • Viele Webapplikationen setzen diese Programme voraus oder sind zumindest für sie optimiert

Im Produktivbetrieb sollten Sie versuchen, den gleichzeitigen Betrieb mehrerer Container oder Services mit MySQL oder MariaDB zu vermeiden

  • Aus Performancegründen ist es besser, wenn es einen dedizierten MySQL- oder MariaDB-Container

gibt, dem ausreichend Ressourcen zugewiesen sind

  • Wenn Sie es mit wirklich großen

Datenbanken zu tun haben, sollten Sie unter Umständen sogar eine native MySQL- oder MariaDB-Installation in Erwägung ziehen, auch wenn Sie so die von Docker gewohnte Flexibilität verlieren

MariaDB-Container manuell einrichten und nutzen In Kapitel 3, »Grundlagen«, haben wir Ihnen bereits gezeigt, wie Sie MariaDB als Container einrichten und ausprobieren können

  • Dort haben wir darauf hingewiesen, dass es in der Regel zweckmäßig ist, das Volume für das Container-Verzeichnis

/var/lib/mysql zu benennen oder überhaupt mit einem lokalen Verzeichnis zu verbinden

  • Wenn Sie auf diesen Schritt verzichten, richtet Docker selbst ein Volume ein und speichert die Datenbankdatei dort
  • Das erschwert die weitere Administration, weil das Volume nur durch eine lange UUID gekennzeichnet ist

Das folgende Kommando erzeugt also einen Container zum MariaDB-Betrieb, gibt ihm den Namen mariadb, verwendet geheim als MariaDB-Root-Passwort und speichert alle Datenbankdateien im Volume-Verzeichnis ./dbvolume

mkdir dbvolume docker run -d --name mariadb -e MYSQL_RO O T _P A S S W OR D = geheim \ -v $ ( pwd ) / dbvolume :/ var / lib / mysql mariadb

Unter Fedora und RHEL müssen Sie die Volume-Angabe um das Flag :z ergänzen

  • Der

Container wird nun im Hintergrund ausgeführt

  • Sie können Logging-Meldungen mit docker logs mariadb lesen und Clientverbindungen durch docker exec testen

docker exec -it mariadb mysql -u root -p Enter password : ******** ( root - Passwort fü r MariaDB )

Eine Anleitung, wie Sie die MariaDB-Instanz mit phpMyAdmin administrieren können, finden Sie in Abschnitt 3.8, »Kommunikation zwischen mehreren Containern« Wenn sich im Volume für das Verzeichnis /var/lib/mysql bereits Datenbankdateien befinden, werden sie beim Einrichten eines neuen Containers durch docker run verwendet und nicht etwa überschrieben

  • Wenn Sie explizit einen Neustart wünschen, müssen Sie die Dateien selbst löschen – für das obige Beispiel also

rm -rf ./ dbvolume / *

Einen MariaDB-Service mit compose einrichten Das manuelle Einrichten von MariaDB ist sicherlich die Ausnahme

  • In der Regel werden Sie MariaDB als Teil einer ganzen Gruppe von Docker-Services einrichten und dabei auf docker compose zurückgreifen

Im einfachsten Fall sehen die MariaDB-spezifischen Zeilen in compose.yaml wie folgt aus

  1. Datei : compose
  • yaml services

mariadb image : mariadb restart : always environm e nt MYSQL_ROO T _ P AS S W O R D : geheim volumes - ./ db :/ var / lib / mysql

Um die Datenbank im Hintergrund zu starten, führen Sie das folgende Kommando aus

docker compose up -d

Während der Initialisierung des Containers werden die folgenden Umgebungsvariablen ausgewertet

MYSQL_ROOT_PASSWORD : Diese Variable bestimmt das root-Passwort für den Datenbankserver Beachten Sie, dass diese Variable (so wie die weiteren Variablen) dauerhaft im Container gesetzt bleibt

  • Jeder Benutzer, der docker exec -it <mariadbcontainer>

bash ausführen darf, kann diese Variable auslesen

  • Die Variable wird auch in den Container-Eigenschaften gespeichert und kann somit durch docker inspect

<mariadbcontainer> ermittelt werden MYSQL_DATABASE : Wenn diese Variable gesetzt ist, wird während der Initialisierung eine Datenbank mit dem angegebenen Namen erzeugt MYSQL_USER und MYSQL_PASSWORD : Wenn diese beiden Variablen gesetzt sind, richtet das Initialisierungs-Script einen entsprechenden Benutzer ein

  • Der Benutzer erhält uneingeschränkte Zugriffsrechte auf die durch MYSQL_DATABASE angegebene Datenbank (GRANT ALL)

MYSQL_ALLOW_EMPTY_PASSWORD : Wenn diese Variable auf yes gesetzt wird, akzeptiert das Initialisierungs-Script ein leeres root-Passwort

  • Aus Sicherheitsgründen ist das natürlich nicht zu empfehlen

MYSQL_RANDOM_ROOT_PASSWORD : Wenn diese Variable auf yes gesetzt wird, erzeugt das Initialisierungs-Script ein zufälliges root-Passwort und gibt dieses im Terminal aus

Die gerade aufgezählten Variablen können auch in der Form <NAME>_FILE=filename verwendet werden, also z

  • B
  • MYSQL_ROOT_PASSWORD_FILE=./pw.txt
  • In diesem Fall liest das Initialisierungs-Script den Inhalt der Variablen aus der angegebenen Datei
  • Damit vermeiden Sie die Klartext-Angabe des Passworts in compose.yaml

Die _FILE-Umgebungsvariablen können auch mit dem Secrets-Mechanismus kombiniert werden (siehe den Absatz »Passwörter und andere Geheimnisse« in Abschnitt 5.3, »Die Datei compose.yaml«)

  • Aktuell funktioniert das aber nur mit

Docker, nicht mit Podman Anstelle der MYSQL_xxx -Variablen können Sie auch die gleichwertigen Variablen mit dem Präfix MARIADB_ verwenden

  • Wir bleiben in diesem Buch bei den MYSQL_xxx -

Varianten, weil sie gleichermaßen für MariaDB und MySQL funktionieren

Weitere Beispiele Eine Menge konkreter Beispiele für compose.yaml-Dateien folgen in Kapitel 12, »Webapplikationen und CMS«

  • Dort kommt MariaDB als Datenbank-Backend für

WordPress, Nextcloud und Joomla zum Einsatz

  • Das WordPress-Beispiel zeigt auch, wie Sie mit Secrets das MySQL-Root-Passwort einstellen

Datenbank während der Initialisierung einrichten Das Initialisierungs-Script wertet das Verzeichnis /docker-entrypoint-initdb.d aus Alle dort gefundenen Scripts (*.sh-Dateien) werden ausgeführt; alle dort befindlichen SQL-Dateien (*.sqlsowie *.sql.gz-Dateien) werden in die durch MYSQL_DATABASE bezeichnete Datenbank importiert Das folgende Beispiel zeigt, wie Sie diesen Mechanismus nutzen können

  • Dazu legen

Sie das Verzeichnis init an und speichern dort eine SQL-Datei, die vielleicht das Ergebnis eines früheren Backups ist

mkdir init cp / mybackup / db

  • sql init /

In compose.yaml verwenden Sie dieses Verzeichnis als Volume für das oben erwähnte Entrypoint-Verzeichnis

  1. Datei : compose
  • yaml mariadb

image : mariadb restart : always environm e nt MYSQL_ROO T _ P AS S W O R D : secret MYSQL_DAT A B A SE : db1


volumes - ./ db :/ var / lib / mysql - ./ init :/ docker - entrypoint - initdb

  • d

Wenn Sie nun das erste Mal docker compose up -d ausführen, wird das Verzeichnis db im lokalen Verzeichnis erzeugt und initialisiert

  • Bei weiteren Starts des Containers ist das Volume-Verzeichnis db bereits initialisiert
  • In diesem Fall erfolgt keine neuerliche

Initialisierung mehr

  • Wenn Sie das wünschen, müssen Sie das Verzeichnis db vorher löschen (sudo rm -rf db)

Backups Die einfachste Form eines Backups besteht darin, das gesamte Volume-Verzeichnis zu sichern

  • Der Container bzw
  • der Service darf dabei nicht in Betrieb sein!

Oft ist stattdessen ein Backup in SQL-Form wünschenswert

  • Gerade bei kleinen Datenbanken ist der Platzbedarf wesentlich kleiner, weil das Volume für /var/lib/mysql nicht nur die Datenbanken, sondern auch diverse andere Dateien enthält

Ein Backup einer Datenbank in SQL-Form können Sie mit dem Kommando mysqldump erstellen

  • Bei der ersten Variante wird das root-Passwort im Klartext übergeben
  • Das folgende Beispiel setzt voraus, dass der Container den Namen mariadb und die Datenbank den Namen db1 hat. (Ermitteln Sie den Container-Namen vorweg mit docker ps

Wenn Sie den Datenbankserver mit docker compose up gestartet haben, setzt sich der Container-Name aus dem Verzeichnisnamen, mariadb und einer Nummer zusammen, also beispielsweise mydir-mariadb-1.) Beachten Sie, dass das Passwort der Option -p unmittelbar folgt und nicht durch ein Leerzeichen getrennt übergeben wird!

docker exec -it mariadb mysqldump -u root -psecret db1 > db1 .sql

Eleganter, aber mit mehr Tippaufwand verbunden ist die zweite Variante

  • Hier wird mit docker exec eine Shell ausgeführt, an die das mysqldump -Kommando als Zeichenkette übergeben wird
  • Das hat den Vorteil, dass die Shell die Umgebungsvariable

MYSQL_ROOT_PASSWORD auswerten kann

  • Das vermeidet die Übergabe des Passworts im

Klartext

docker exec mariadb sh -c \ 'exec mysqldum p -u root -p " $MYSQL_RO O T _ P AS S W O R D " db1 ' > db1

  • sql

Eigene Konfigurationsdatei verwenden (my.cnf) Die Konfiguration des MariaDB-Servers erfolgt durch die Datei /etc/mysql/my.cnf Außerdem werden diverse weitere *.cnf-Dateien im Verzeichnis /etc/mysql sowie in seinen Unterverzeichnissen ausgewertet

Davon abweichende Einstellungen schreiben Sie am besten in eine eigene Konfigurationsdatei, die Sie als Volume-Datei einbinden

  • Im Container können Sie z
  • B
  • den Pfad

/etc/mysql/conf.d/myown.cnf verwenden

Wenn Sie beispielsweise ein besonders schnelles (aber nicht ACID-konformes) Transaktions-Logging wünschen, richten Sie die folgende Datei myown.cnf ein

  1. Datei myown .cnf

[ mysqld ] innodb_fl u s h _ lo g _ a t_ t r x _ co m m i t =0

Bei der Auflistung der Volumes in compose.yaml fügen Sie nun einen entsprechenden Eintrag hinzu

  1. Datei : compose
  • yaml services

mariadb volumes - ./ myown

  • cnf :/ etc /mysql /conf
  • d/ myown
  • cnf