- 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.
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. |
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.