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.

SQLiteeingebettet
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
MySQLrelational
Einsatz
Shops, WordPress und die meisten PHP-Anwendungen
Wir stellen ein
innodb_buffer_pool_size
Sicherung
Vollsicherungen plus Binärlogs, auf jeden Zeitpunkt
Warum wir MySQL betreiben
Redisim Arbeitsspeicher
Einsatz
Cache, Sessions, Warteschlangen und Zähler
Wir stellen ein
maxmemory-policy
Sicherung
Snapshots und eine Append-only-Datei
PostgreSQLrelational
Einsatz
Buchhaltung, ERP, Berichte und komplexe Abfragen
Wir stellen ein
shared_buffers · work_mem
Sicherung
Basissicherungen plus archiviertes WAL, auf jeden Zeitpunkt
MariaDBrelational
Einsatz
Dieselben Aufgaben wie MySQL, dazu Galera-Cluster
Wir stellen ein
innodb_buffer_pool_size
Sicherung
mariabackup plus Binärlogs, auf jeden Zeitpunkt
MongoDBDokumente
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
  1. Wenn eine App einer Datei entwächst, zieht sie auf einen Datenbankserver um.
  2. MariaDB begann als Fork von MySQL; die meisten Anwendungen wechseln unverändert zwischen beiden.
  3. Redis sitzt davor: Wiederholte Antworten und Sessions bleiben im Speicher.
  4. Derselbe Cache vor PostgreSQL-Anwendungen.
  5. Der Suchindex wird aus der Hauptdatenbank gespeist, nie umgekehrt.
  6. JSONB 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;
Eine Beispielabfrage auf einer Beispieltabelle

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.

Nächtliche Vollsicherung00:00 Bis hier wiederhergestellt14:31:59 Ein DELETE ohne WHERE14:32:00
Jede Änderung, sofort ins Protokoll geschrieben Auf die Sicherung nachgespielt
Ein Beispieltag. Die Uhrzeiten sind erfunden.
  1. Die letzte Vollsicherung wiederherstellen

    Auf einem separaten Server, damit die Live-Datenbank unberührt bleibt, während wir arbeiten.

  2. Das Protokoll bis zum Moment davor nachspielen

    Binärlogs für MySQL und MariaDB, archiviertes WAL für PostgreSQL, das oplog für MongoDB.

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