Eine Datenbank mit sqldump exportieren
Vorläufige, ungeprüfte automatische Übersetzung. Im Zweifelsfall konsultieren Sie die englische Version, die als Referenzversion gilt.
kent sqldump exportiert eine Datenbank in ein .sql-Skript, das sie
beim Abspielen wiederherstellt. Mit --schema-only exportiert es allein die
Struktur, so entstehen die auf
Das Schema als SQL veröffentlichten
Schemadateien.
Der Befehl ist nur lesend. kent sqldump öffnet die Datenbank in SQLites
Nur-Lese-Modus und schreibt nichts hinein.
Übersicht
kent sqldump --in <dbfilename> [--out <outfile>] [--schema-only]
Argumente
| Option | Erforderlich | Beschreibung |
|---|---|---|
--in <dbfilename> | Ja | Pfad zu einer vorhandenen
.sqlite-Datenbank, die exportiert werden soll. |
--out <outfile> | Nein | Wohin das Skript geschrieben wird. Weglassen, um auf die Standardausgabe zu schreiben. |
--schema-only | Nein | Gibt das Schema aus und keine Zeilendaten. Nimmt keinen Wert entgegen. |
In eine Datei oder auf die Standardausgabe schreiben
Mit --out wird das Skript in diese Datei geschrieben. Ohne sie geht das
Skript auf die Standardausgabe, damit es in etwas anderes weitergeleitet werden kann:
$ kent sqldump --in old.sqlite | python3 migrate.py > new.sql
Weil die Standardausgabe das Skript selbst trägt, geht jede Meldung, die
kent sqldump ausgibt, auf die Standardfehlerausgabe, Fehler wie Hinweise.
Nichts, was Kent ausgibt, wird jemals in den Export hineingemischt.
Was das Skript enthält
Der Reihe nach: ein Kommentarkopf, PRAGMA foreign_keys=OFF und das
PRAGMA user_version, das die Schemamarke wiederherstellt, eine Transaktion, jedes
CREATE TABLE, jede Zeile als INSERT, dann die Indizes, Sichten und
Trigger, dann COMMIT.
$ kent sqldump --in mydata.sqlite --out mydata.sql
$ head -10 mydata.sql
-- kent sqldump
-- source: mydata.sqlite
-- kent: 1.3.4
-- cordelia: 1.3.3
-- exported: 2026-09-16T22:55:58Z
-- user_version: 2
PRAGMA foreign_keys=OFF;
PRAGMA user_version = 2;
BEGIN TRANSACTION;
Die Tabellendaten kommen bewusst vor den Triggern. Ein Trigger, der beim Einfügen einer Zeile eine andere Tabelle verändert, würde sonst während der Wiederherstellung ein zweites Mal auslösen und die wiederhergestellte Datenbank subtil vom Original abweichen lassen.
PRAGMA user_version wird mitgeführt, weil Cordelia sich weigert, eine
Datenbank zu öffnen, deren Schemaversion sie nicht kennt. Ohne es würde ein
wiederhergestellter Export Version 0 melden und Cordelia würde ihn nicht öffnen.
Warum der Kopf Cordelias Version festhält
Cordelia definiert das Schema einer Cordelia-Datenbank; Kent schreibt es nur ab. Ein späterer Kent-Build erzeugt aus derselben Datenbank dasselbe Schema, also sagt Kents eigene Version nichts darüber aus, woher das Schema stammt, Cordelias schon. Für eine als Referenzartefakt aufbewahrte Schemadatei ist das die entscheidende Zeile.
Zwei Exporte derselben Datenbank stimmen überein
Abgesehen vom Zeitstempel im Kopf sind zwei Exporte derselben Datenbank Byte für Byte identisch. Tabellen werden in Namensreihenfolge und Zeilen in Einfügereihenfolge ausgegeben, sodass ein Export gegen einen anderen gediffbar ist, worum es gerade dann geht, wenn Sie ein Skript zur Umstellung eines alten Schemas auf ein neues schreiben.
--schema-only
Gibt jede CREATE-Anweisung und das PRAGMA user_version aus, ohne
INSERTs. Bei einer frisch angelegten Datenbank ist das der Unterschied zwischen
54 KiB und 2,3 MiB, da rund 98 % der Zeilen einer neuen Datenbank vorbefüllte
Nachschlagedaten sind:
$ kent sqldump --in mydata.sqlite --schema-only --out schema_01.sql
$ grep -c '^CREATE' schema_01.sql
129
$ grep -c '^INSERT' schema_01.sql
0
Das Skript spielt weiterhin ab, es erzeugt eben eine leere Datenbank mit demselben
Schema. Das ist die Form für ein Referenzartefakt je Version, bei dem
diff schema_01.sql schema_02.sql als Aussage darüber gelesen werden soll, was
sich zwischen zwei Schemaversionen geändert hat.
Eine alte Datenbank wird exportiert, nicht abgelehnt
Anders als jeder andere Kent-Befehl lehnt sqldump eine Datenbank nicht ab, deren
Schemaversion von der dieses Builds abweicht. Es exportiert sie trotzdem, mit einem Hinweis
auf der Standardfehlerausgabe. Sie abzulehnen würde den Zweck verfehlen: eine alte Datenbank
zu exportieren ist genau das, was man vor einer Migration tut.
$ kent sqldump --in old.sqlite --out old.sql
kent sqldump: note: this database reports schema version 0, but this build of cordelia expects 2. Exporting it anyway.
$ echo $?
0
Vergleichen Sie kent info, das dieselbe Datei
ablehnt.
Der Export überschreibt nichts
Wenn --in und --out dieselbe Datei benennen, wird das abgelehnt,
bevor irgendetwas gelesen wird, statt die Datenbank abzuschneiden, die Sie exportieren
wollten.
$ kent sqldump --in mydata.sqlite --out mydata.sqlite
kent sqldump: refusing to write the export over its own source: mydata.sqlite
Ein an --in übergebener Pfad, der nicht existiert, wird als fehlend gemeldet
und nicht angelegt, SQLites eigener Öffnen-Aufruf erzeugt die übergebene
Datei, ein vertippter Pfad würde sonst eine verwaiste leere Datenbank hinterlassen.
$ kent sqldump --in nope.sqlite
kent sqldump: nope.sqlite does not exist
Schemata, die sich nicht exportieren lassen
Eine Cordelia-Datenbank verwendet keines davon. kent sqldump lehnt sie ab, statt
ein Skript zu erzeugen, das falsch wiederherstellen würde, ein falscher Export ist schlimmer
als ein verweigerter.
| Merkmal | Warum | Auch mit --schema-only
abgelehnt? |
|---|---|---|
| Virtuelle Tabellen | Eine anzulegen bringt Schattentabellen mit, die wie
gewöhnliche Tabellen erscheinen, eine FTS5-Tabelle erzeugt fünf. Das Abspielen des
CREATE VIRTUAL TABLE legt sie erneut an, sodass das
CREATE TABLE jeder Schattentabelle danach daran scheitert, dass sie schon
existiert. | Ja |
WITHOUT ROWID-Tabellen | Zeilen haben keine rowid, nach der sortiert werden könnte, der Export ließe sich also nicht deterministisch machen. | Nein |
| Generierte Spalten | In eine generierte Spalte kann nicht eingefügt werden,
das abgespielte INSERT würde also scheitern. | Nein |
Zwei der drei bestehen nur, weil Zeilen geschrieben werden, also hebt
--schema-only sie auf: ohne INSERT, das scheitern könnte, und ohne
zu sortierende Zeilen tritt keines der beiden Probleme auf. Die Ablehnung virtueller Tabellen
betrifft das Schema selbst und gilt daher in beiden Modi.
Einen Export wiederherstellen
Das Skript spielt unter jedem SQLite-Werkzeug ab, nicht nur unter Kent:
$ kent sqldump --in mydata.sqlite --out mydata.sql
$ sqlite3 restored.sqlite < mydata.sql
$ sqlite3 restored.sqlite 'PRAGMA user_version'
2
$ sqlite3 restored.sqlite 'SELECT count(*) FROM better_labels_lookup'
16866
Stellen Sie in eine leere Datei wieder her, nicht in eine Datenbank, die
kent createdb bereits angelegt hat. Ein
Export trägt jedes CREATE TABLE mit sich, sodass sein Abspielen in eine
vorhandene Cordelia-Datenbank sofort mit table AadAccelFeatures already exists
scheitert. Der Export ist in sich geschlossen: er ist das Schema und die Daten.
Ein Export ist die Eingabe für eine Migration, nicht selbst eine. Ein altes Schema in ein
neues zu überführen heißt, das Skript zwischen Dump und Restore zu bearbeiten, dafür ist die
Weiterleitung oben da. Ein Umwandlungsskript sollte die vorbefüllten Referenztabellen
nicht entfernen (FileTypeLookup,
FieldTypeLookup, better_labels_definitions,
better_labels_lookup, rund 19.700 Zeilen). Bei einer
Wiederherstellung erzeugt sie nichts neu, denn nichts außer dem Skript selbst legt das Schema
an; ihre Zeilen zu streichen ergibt eine Datenbank mit leeren Nachschlagetabellen.
Siehe auch Fehlermeldungen und Exit-Codes und Das Schema als SQL.