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

OptionErforderlichBeschreibung
--in <dbfilename>JaPfad zu einer vorhandenen .sqlite-Datenbank, die exportiert werden soll.
--out <outfile>NeinWohin das Skript geschrieben wird. Weglassen, um auf die Standardausgabe zu schreiben.
--schema-onlyNeinGibt 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.

MerkmalWarumAuch mit --schema-only abgelehnt?
Virtuelle TabellenEine 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-TabellenZeilen haben keine rowid, nach der sortiert werden könnte, der Export ließe sich also nicht deterministisch machen.Nein
Generierte SpaltenIn 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.

Siehe auch