Wie man SQLite-Datenbanken zwischen Computern schneller kopiert
(alexwlchan.net)Einleitung
- Wenn man eine SQLite-Datenbank direkt mit
rsynckopiert, wird sie durch Indizes usw. groß, langsam und unzuverlässig. - Deshalb wird vorgeschlagen, mit
.dumpeinen textbasierten Ansatz zum Komprimieren und Wiederherstellen zu verwenden.
Hauptteil
-
Der Befehl
.dumpgibt die gesamte Datenbank als SQL-Text aus; Indizes werden dabei durch eine einzelne Befehlszeile ersetzt, wodurch die Dateigröße kleiner wird.sqlite3 my_database.db .dump > my_database.db.txt -
Die Textdatei lässt sich mit gzip zusätzlich weiter verkleinern:
sqlite3 my_database.db .dump | gzip -c > my_database.db.txt.gz -
Stattdessen wird auf ein Verfahren umgestellt, bei dem auf dem Server ein komprimierter Dump erzeugt, lokal kopiert und dann wiederhergestellt wird:
ssh username@server "sqlite3 db.db .dump | gzip -c > db.txt.gz" rsync --progress username@server:db.txt.gz . gunzip db.txt.gz cat db.txt | sqlite3 restored.db -
Die ursprüngliche DB-Datei schrumpft von 3,4 GB auf 1,3 GB als Dump-Text und auf 240 MB als gzip-komprimierte Datei — also auf etwa ein Vierzehntel.
-
Beim bisherigen
rsync-Verfahren kann, wenn sich die DB während der Übertragung ändert, der Fehlerdatabase disk image is malformedauftreten. -
Beim Text-Dump-Verfahren besteht nach Beginn des Kopiervorgangs kein Risiko mehr, dass sich der Inhalt ändert, sodass konsistente Backups möglich sind.
Fazit
- Die Methode aus
.dump+ Komprimierung + Wiederherstellung verbessert bei großen SQLite-Übertragungen sowohl Geschwindigkeit als auch Stabilität. - Sie ist besonders wirksam bei Datenbanken mit vielen Indizes und kann das Risiko von Übertragungsfehlern oder Beschädigungen verringern.
- Wer regelmäßig mit großen SQLite-Datenbanken arbeitet, kann diese praktische Optimierung gut einsetzen.
2 Kommentare
Ich frage mich, welchen Hintergrund es gibt, warum so eine Aufgabe nötig ist.
Im Original heißt es, dass es für Backup und Analyse gedacht ist. Vermutlich wollte man die Daten lokal mit etwas wie DuckDB analysieren.