- Einsatz
- Apps und Werkzeuge mit einer Datendatei und jeweils einem Schreiber
- Wir stellen ein
journal_mode=WAL- Sicherung
- Eine Online-Kopie der Datei, nie die Kopie einer Datei im Betrieb
Datenbanken
Wo eine Website schnell oder langsam ist: in ihrer Datenbank.
Wir installieren, optimieren, replizieren und sichern die Datenbank hinter Ihrer Anwendung - und beweisen die Sicherungen, indem wir sie wiederherstellen.
MySQL
MariaDB
PostgreSQL
Redis
MongoDB
Elasticsearch
Sieben Datenbanksysteme, gezeichnet als ein Schema
Jeder Kasten ist eine Datenbank, die wir installieren, optimieren und sichern. Die Linien zeigen, wie sie in den Systemen, die wir betreiben, zusammenarbeiten - die meisten Anwendungen brauchen zwei oder drei davon, nicht eine.
- Einsatz
- Shops, WordPress und die meisten PHP-Anwendungen
- Wir stellen ein
innodb_buffer_pool_size- Sicherung
- Vollsicherungen plus Binärlogs, auf jeden Zeitpunkt
- Einsatz
- Cache, Sessions, Warteschlangen und Zähler
- Wir stellen ein
maxmemory-policy- Sicherung
- Snapshots und eine Append-only-Datei
- Einsatz
- Buchhaltung, ERP, Berichte und komplexe Abfragen
- Wir stellen ein
shared_buffers · work_mem- Sicherung
- Basissicherungen plus archiviertes WAL, auf jeden Zeitpunkt
- Einsatz
- Dieselben Aufgaben wie MySQL, dazu Galera-Cluster
- Wir stellen ein
innodb_buffer_pool_size- Sicherung
- mariabackup plus Binärlogs, auf jeden Zeitpunkt
- Einsatz
- Suche über Produkte und Artikel, Filter, Logs
- Wir stellen ein
JVM heap · shards- Sicherung
- Snapshots; der Index lässt sich aus der Hauptdatenbank neu aufbauen
- Einsatz
- Datensätze mit wechselnder Struktur: Ereignisse, Kataloge, Inhalte
- Wir stellen ein
wiredTiger cacheSizeGB- Sicherung
- Ein Replica Set, mit dem oplog für einen Zeitpunkt
- 1Wenn eine App einer Datei entwächst, zieht sie auf einen Datenbankserver um.
- 2MariaDB begann als Fork von MySQL; die meisten Anwendungen wechseln unverändert zwischen beiden.
- 3Redis sitzt davor: Wiederholte Antworten und Sessions bleiben im Speicher.
- 4Derselbe Cache vor PostgreSQL-Anwendungen.
- 5Der Suchindex wird aus der Hauptdatenbank gespeist, nie umgekehrt.
- 6JSONB in PostgreSQL deckt viele Dokumentaufgaben ab, bevor MongoDB nötig wird.
Welche Datenbank für welche Aufgabe
Meist entscheidet die Anwendung, und wir folgen ihr. Wo die Wahl offen ist, wählen wir so.
| Die Aufgabe | Unsere erste Wahl | Geht auch | Warum |
|---|---|---|---|
| Ein Shop, eine WordPress-Website oder eine PHP-Anwendung | MySQL · MariaDB | PostgreSQL | Worauf die Anwendung gebaut und getestet wurde, mit der breitesten Unterstützung. |
| Buchhaltung, ERP und Berichte mit vielen Joins | PostgreSQL | MySQL 8 | Strenge Transaktionen, Fensterfunktionen und ein Planer für komplexe Abfragen. |
| Cache, Sessions, Warteschlangen und Ratenbegrenzung | Redis | Memcached | Antworten aus dem Speicher. Legen Sie dort ab, was sich bei Verlust neu aufbauen lässt. |
| Suche über Produkte oder Artikel | OpenSearch · Elasticsearch | MySQL · PostgreSQL full-text | Relevanz, Tippfehler, Filter und Facetten, die eine LIKE-Abfrage nicht bietet. Für einen kleinen Katalog genügt die Volltextsuche der Datenbank selbst. |
| Eine mobile App, ein Desktop-Werkzeug oder ein kleiner interner Dienst | SQLite | —Nichts anderes | Kein Server zu betreiben: eine Datei, gesichert durch sicheres Kopieren. |
| Ereignisse, Logs oder Datensätze mit wechselnder Struktur | MongoDB | PostgreSQL JSONB | Flexible Dokumente; PostgreSQL, wenn zusätzlich Joins und Transaktionen nötig sind. |
| Lesezugriffe, die einem Server entwachsen | MySQL · MariaDB · PostgreSQL replicas | —Nichts anderes | Lesezugriffe verteilt auf Replikate, Schreibzugriffe bleiben auf einem Primärserver. |
Fünf Datenbanksysteme im Vergleich
Was jedes System selbst kann, entnommen der eigenen Dokumentation. Das Wort neben dem Marker sagt, wie weit es geht.
| Fähigkeit | MySQL | MariaDB | PostgreSQL | Redis | MongoDB |
|---|---|---|---|---|---|
| Einsatz | Shops, WordPress und die meisten PHP-Anwendungen | Dieselben Aufgaben wie MySQL, dazu Galera-Cluster | Buchhaltung, ERP, Berichte und komplexe Abfragen | Cache, Sessions, Warteschlangen und Zähler | Datensätze mit wechselnder Struktur: Ereignisse, Kataloge, Inhalte |
| Datenmodell | Tabellen und Zeilen, abgefragt mit SQL. | Tabellen und Zeilen, abgefragt mit SQL. | Tabellen und Zeilen, abgefragt mit SQL, mit einem JSONB-Typ für Dokumente. | Schlüssel mit Zeichenketten, Hashes, Listen, Mengen, sortierten Mengen oder Streams. | JSON-ähnliche Dokumente in Collections, mit der eigenen Abfragesprache von MongoDB. |
| Transaktionen | Unterstützt InnoDB, die Standard-Engine: Commit, Rollback und Wiederherstellung nach Abstürzen. | Unterstützt InnoDB ist auch hier die Standard-Engine. | Unterstützt Jede Änderung ist eine Transaktion, die bestätigt oder zurückgerollt wird. | Teilweise Ein Block von Befehlen läuft ohne Unterbrechung nacheinander ab, aber es gibt kein Rollback. | Unterstützt Über mehrere Dokumente hinweg, auf Replica Sets und Sharded Clustern. |
| Wo die Arbeitsdaten liegen | Auf der Festplatte; InnoDB hält einen Buffer Pool der meistgenutzten Daten im Arbeitsspeicher. | Auf der Festplatte; InnoDB hält einen Buffer Pool der meistgenutzten Daten im Arbeitsspeicher. | Auf der Festplatte; Shared Buffers halten die meistgenutzten Daten im Arbeitsspeicher. | Im Arbeitsspeicher; Snapshots und eine Append-only-Datei schreiben sie auf die Platte. | Auf der Festplatte; WiredTiger hält einen Cache der meistgenutzten Daten im Arbeitsspeicher. |
| Eingebaute Replikation | Unterstützt Quelle zu Replikaten, asynchron oder semisynchron. | Unterstützt Quelle zu Replikaten, dazu Galera Cluster für synchrones Multi-Primary. | Unterstützt Streaming-Replikation; Hot-Standby-Replikate können Leseabfragen beantworten. | Unterstützt Leader zu Replikaten, standardmäßig asynchron; Replikate können Lesezugriffe bedienen. | Unterstützt Replica Sets: mehrere Server mit denselben Daten und automatischem Failover. |
| Daten auf mehrere Server verteilen | Zusatz NDB Cluster, eine eigene Engine, die Daten automatisch partitioniert. | Zusatz Die Storage-Engine Spider, die Tabellen auf mehrere MariaDB-Server verteilt (Sharding). | Teilweise Partitionierung nach Bereich, Liste oder Hash teilt eine Tabelle innerhalb eines Servers. | Unterstützt Redis Cluster verteilt die Schlüssel auf mehrere Knoten. | Unterstützt Sharding ist eingebaut, pro Collection. |
| Wiederherstellung zu einem Zeitpunkt | Unterstützt auf jede Sekunde, die das Protokoll abdeckt | Unterstützt auf jede Sekunde, die das Protokoll abdeckt | Unterstützt auf jede Sekunde, die das Protokoll abdeckt | Teilweise bis zum letzten Schreibvorgang in der Append-only-Datei | Unterstützt auf jede Sekunde, die das Protokoll abdeckt |
Seitlich scrollen, um alle fünf Systeme zu sehen.
- Unterstützt das System erledigt es selbst
- Teilweise mit Einschränkung
- Zusatz eine eigene Komponente oder Engine
Funktionen unterscheiden sich je nach Version; maßgeblich ist die Dokumentation der Version, die Sie betreiben.
Quellen: MySQL Reference Manual MariaDB Knowledge Base PostgreSQL Documentation Redis Documentation MongoDB Manual
Warum wir MySQL betreibenFünf Ebenen, auf denen eine Datenbank schneller wird
Eine langsame Datenbank wird selten an einer einzigen Stelle repariert. Das sind die Ebenen in der Reihenfolge, in der man sie meist ansieht: die günstigste Änderung zuerst, die teuerste zuletzt.
-
1
Abfragen
Das Slow-Query-Log nennt die schlechtesten Abfragen, und EXPLAIN zeigt, warum jede langsam ist.
slow_query_log · pg_stat_statements · EXPLAIN ANALYZE -
2
Schema und Indizes
Eine auf ihre Fragen zugeschnittene Tabelle und der passende Index machen aus dem Lesen jeder Zeile eine kurze Suche - das Beispiel weiter unten ist genau ein solcher Index.
CREATE INDEX · ADD INDEX -
3
Engine-Einstellungen
Der Arbeitsspeicher wird zwischen Datenbank, Anwendung und System aufgeteilt, danach werden die Puffer jeder Engine passend gesetzt.
innodb_buffer_pool_size · shared_buffers · work_mem · wiredTiger cacheSizeGB -
4
Cache
Wiederholte Antworten und Sitzungen bleiben im Arbeitsspeicher, sodass die Datenbank seltener gefragt wird.
maxmemory-policy -
5
Hardware
Mehr Arbeitsspeicher, schnellere Platten oder mehr Prozessorkerne, wenn die Ebenen darüber ausgeschöpft sind.
RAM · CPU · disk I/O
Eine langsame Abfrage, gefunden und behoben
Hinter den meisten langsamen Seiten steckt eine Abfrage. Das Slow-Query-Log nennt sie, EXPLAIN zeigt, warum sie langsam ist, und oft ist ein einziger Index die ganze Lösung.
SELECT id, total, created_at
FROM orders
WHERE customer_id = 4821
ORDER BY created_at DESC
LIMIT 20;
Vorher
- type
- ALL
- key
- NULL
- Extra
- Using where; Using filesort
Liest jede Zeile der Tabelle und sortiert dann, was es gefunden hat.
Die Lösung: ein Index
ALTER TABLE orders
ADD INDEX idx_customer_created (customer_id, created_at);
Nachher
- type
- ref
- key
- idx_customer_created
- Extra
- Backward index scan
Liest nur die Zeilen dieses Kunden, bereits sortiert.
Ein Backup zählt erst, wenn es wiederhergestellt wurde
Eine nächtliche Kopie allein verliert den Tag. Wird auch das Änderungsprotokoll aufbewahrt, bringen wir die Datenbank auf die Sekunde vor einem Fehler zurück.
00:00
Bis hier wiederhergestellt14:31:59
Ein DELETE ohne WHERE14:32:00
- Die letzte Vollsicherung wiederherstellen
Auf einem separaten Server, damit die Live-Datenbank unberührt bleibt, während wir arbeiten.
- Das Protokoll bis zum Moment davor nachspielen
Binärlogs für MySQL und MariaDB, archiviertes WAL für PostgreSQL, das oplog für MongoDB.
- Prüfen, dann die Daten zurückholen
Entweder werden die verlorenen Zeilen zurückkopiert, oder die wiederhergestellte Kopie übernimmt - Ihre Entscheidung, mit dem Unterschied vor Augen.
Die Wiederherstellung auf einen Zeitpunkt hängt vom System ab:
- MySQL · MariaDB · PostgreSQL · MongoDBauf jede Sekunde, die das Protokoll abdeckt
- Redisbis zum letzten Schreibvorgang in der Append-only-Datei
- SQLitebis zur letzten Kopie der Datei
- OpenSearch · Elasticsearchbis zum letzten Snapshot, dann aus der Quelle neu aufgebaut
Wiederherstellungstests gehören zur Betreuung, die wir mit Ihnen vereinbaren: auf einen separaten Server, nach festem Plan, mit jedem Ergebnis dokumentiert. Ein Backup, das niemand wiederhergestellt hat, ist eine Hoffnung, kein Backup.
Die übrige Arbeit
Was eine Datenbank vom Tag der Installation bis zum Tag des Upgrades braucht, und die Einstellungen, die jeder Schritt berührt.
-
Installation und Dimensionierung
Die Version, die Ihre Anwendung unterstützt, aus dem eigenen Repository des Herstellers. Der Speicher wird zwischen Datenbank, Anwendung und System aufgeteilt, bevor irgendetwas anderes eingestellt wird.
innodb_buffer_pool_size · shared_buffers · maxmemory · -Xmx -
Indizes und langsame Abfragen
Das Slow-Query-Log wird gelesen, die schlimmsten Abfragen erklärt, und Indizes werden mit dokumentierter Begründung ergänzt oder entfernt.
slow_query_log · pg_stat_statements · EXPLAIN ANALYZE -
Replikation
Eine zweite Kopie, die der ersten folgt - um Lesezugriffe zu verteilen und zu übernehmen, wenn der Primärserver ausfällt.
GTID · Galera · streaming replication · replica set -
Sicherheit
Erreichbar nur im privaten Netz, ein Benutzer pro Anwendung mit genau den Rechten, die sie braucht, und verschlüsselte Verbindungen überall, wo Verkehr den Server verlässt.
bind-address · TLS · GRANT · SCRAM · ACL -
Überwachung
Verbindungen, Replikationsverzögerung, Speicherplatz und langsame Abfragen - mit einer Warnung, bevor eine Grenze erreicht ist, nicht danach.
max_connections · Seconds_Behind_Source · pg_stat_replication -
Upgrades
Zuerst an einer Kopie geprobt, Replikate vor dem Primärserver, und der Weg zurück ist aufgeschrieben, bevor wir beginnen.
pg_upgrade · mariadb-upgrade · rolling restart

Sagen Sie uns, was Ihre Datenbank tut
Welches System, wie groß, wo es läuft und was Ihnen daran Sorgen macht. Wir sehen es uns zuerst an und erstellen nach einem Gespräch ein Angebot für Einrichtung oder Betreuung.