Exportieren Sie eine MySQL-Datenbank in eine SQLite-Datenbank

80

Bitte helfen Sie mir beim Exportieren einer MySQL-Datenbank in eine SQLite-Datenbank.

Devi
quelle
2
Das SQLite-Projekt hat auch eine Seite über Konvertierungsdienstprogramme: sqlite.org/cvstrac/wiki?p=ConverterTools
Clinton
@Clinton Auf der Seite, auf die Sie verlinkt haben, wird eine Warnung angezeigt, dass die Informationen veraltet sind.
Kjones

Antworten:

71

Auf Github gibt es ein fantastisches Linux-Shell-Skript , das MySQL in eine Sqlite3-Datei konvertiert. Sie müssen sowohl mysqldump als auch sqlite3 auf Ihrem Server installiert haben. Funktioniert super.

georgiecasey
quelle
funktioniert bisher am besten! Es müssen nur einige "COLLATE xy" -Anweisungen mit Codierungen entfernt werden, die SQLite nicht versteht. Beachten Sie, dass Sie sqlite3 auf Ihrem Server nicht benötigen, wenn Sie einen Klon Ihrer MySQL-Datenbank für die lokale Entwicklung benötigen.
Benzkji
1
Hat bei mir leider nicht funktioniert. Abgesehen von den unten erwähnten Problemen mit "PRIMARY KEY" -Anweisungen wurden viele andere Fehler gemeldet, die sich auf "INSERT" -Anweisungen und fehlende Tabellen ("Objekte") beziehen.
BartoszKP
2
Der Autor hat das Skript anandoniert, aber die Arbeit in dieser Gabelung wurde fortgesetzt: github.com/dumblob/mysql2sqlite
ilyaigpetrov
3
github.com/dumblob/mysql2sqlite ist jetzt die offizielle Version. 2016-05-11 17:32 GMT+2 @esperlu declared MIT as a fitting license (also retrospectively) and the original gist as deprecated.
Li-aung Yip
1
danke für das Headsup ilyaigpetrov und @ Li-aungYip, ich habe den Link aktualisiert
georgiecasey
7

Die Antwort von @ user2111698, bearbeitet von @quassy, ​​funktioniert wie versprochen. Da ich dies häufig mache, füge ich ihre Anweisungen in ein Bash-Skript ein:

#!/bin/bash

mysql_host=localhost
mysql_user=george
mysql_dbname=database
sqlite3_dbname=database.sqlite3

# dump the mysql database to a txt file
mysqldump \
  --skip-create-options \
  --compatible=ansi \
  --skip-extended-insert \
  --compact \
  --single-transaction \
  -h$mysql_host \
  -u$mysql_user \
  -p $mysql_dbname \
  > /tmp/localdb.txt

# remove lines mentioning "PRIMARY KEY" or "KEY"
cat /tmp/localdb.txt \
  | grep -v "PRIMARY KEY" \
  | grep -v KEY \
  > /tmp/localdb.txt.1

# mysqldump leaves trailing commas before closing parentheses  
perl -0pe 's/,\n\)/\)/g' /tmp/localdb.txt.1 > /tmp/localdb.txt.2

# change all \' to ''
sed -e 's/\\'\''/'\'''\''/g' /tmp/localdb.txt.2 > /tmp/localdb.txt.3

if [ -e $sqlite3_dbname ]; then
    mv $sqlite3_dbname $sqlite3_dbname.bak
fi
sqlite3 $sqlite3_dbname < /tmp/localdb.txt.3

Eine Übersicht mit detaillierten Kommentaren finden Sie unter https://gist.github.com/grfiv/b79ace3656113bcfbd9b7c7da8e9ae8d

George Fisher
quelle
Wenn Sie Ihren Code formatieren, um das Scrollen zu vermeiden, erleichtern Sie anderen das Lesen.
Zhon
Glücklich zu; nicht schnell sehen wie
George Fisher
1
Wenn Sie die Kommentare entfernen, sind Sie mit dem vertikalen Bildlauf fertig (fügen Sie alle Kommentare, die Sie für wichtig halten, in den Text Ihrer Antwort ein). Vertikales Scrollen kann mit Backslash-Zeilenumbruch behandelt werden.
Zhon
Wenn Ihre SQL-Datei größer als 1 GB ist, teilen Sie sie zuerst auf. Andernfalls gibt das Perl-Skript einen Ersetzungsschleifenfehler aus.
Nurp
3

mysql2sqlite.sh, das im oberen Beitrag erwähnt wird, kommt mit PRIMARY KEY-Zeilen nicht gut zurecht, es schreibt nicht das Trailing ), um die CREATE-Anweisung zu vervollständigen.

Das habe ich getan. Ich habe den MySQL-Dump wie folgt ausgeführt:

mysqldump --skip-create-options --compatible=ansi --skip-extended-insert --compact --single-transaction -h<host> -u<user> -p<passwd> <database name> > localdb.txt

Ich habe dann grep verwendet, um PRIMARY KEY und KEY zu entfernen:

cat localdb.txt | grep -v "PRIMARY KEY' | grep -v KEY > localdb.txt.1

Ich habe dann einen Editor verwendet, um die Datei zu reparieren. Wenn die Schlüssel entfernt werden, erhalten Sie eine CREATE-Anweisung, die wie folgt aussieht:

CREATE ...
  ...,
)

Das Nachlaufen , muss entfernt werden. In vi stimmt dieser Ausdruck mit ihnen überein, $ \ n)

Dann müssen Sie alle ändern \' zu''

Dann können Sie den Import durchführen:

sqlite3 local.sqlite3 < localdb.txt.1

Und das ist es. Ich habe kein einziges Programm gefunden, das für mich funktioniert hat. Ich hoffe das hilft jemandem.

quassy
quelle
2

Ich habe die Tabellenstruktur manuell in der SQLite-Datenbank erstellt.

Dann habe ich die Daten mit dem folgenden Befehl hochgeladen:

mysqldump -u root {database} {table} --no-create-info --skip-extended-insert  --complete-insert --skip-add-locks  --compatible=ansi | sed "s/\\\'/''/g" |sqlite3 flora.db

Ich musste sed verwenden , um eine andere Apex-Codierung in den beiden Datenbanken zu korrigieren

caiofior
quelle
Vielen Dank dafür, es war hilfreich, da in der ursprünglichen Frage nicht angegeben wurde, ob das Erstellungsschema enthalten sein muss oder nicht. Einfacher, wenn das Schema bereits eingerichtet wurde
kjones
0

Persönlich mag ich die einfache Verwendung von mysqldump, aber einige Anpassungen sind erforderlich (abhängig von Ihrer Kunst mit Unix und was Sie tun möchten).

Ex. für nur einen Tisch (Prods) mit PK:

$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
    Error: near line 1: table "prods" already exists
    Error: near line 7: UNIQUE constraint failed: prods.id, prods.ts
$ sqlite3 testme2.db '.schema'
    CREATE TABLE "prods" (
      "id" varchar(30) NOT NULL DEFAULT '',
      "ts" int(11) NOT NULL DEFAULT '0',
      "val" double DEFAULT NULL,
      PRIMARY KEY ("id","ts")
    );

Für komplexere Dinge ist es wahrscheinlich besser, einen Wrapper zu schreiben, oder verwenden Sie dann das bereits erwähnte fantastische awk Linux-Shell-Skript auf Gist .

Nuno
quelle
-1

Es gibt ein fantastisches, leichtes Tool namens SQLite Database Browser, mit dem Sie SQLite-Datenbanken erstellen und bearbeiten können. Ich habe es verwendet, um Datenbanken für Android-Apps zu erstellen. Sie können SQL-Anweisungen ausführen, um die Daten zu laden. Wenn Sie die Daten aus einer mySQL-Datenbank exportieren, können Sie sie einfach mit diesem Tool importieren. Hier ist ein Link: http://sqlitebrowser.sourceforge.net/

Aaron Ratner
quelle
2
Wie hilft dies bei der MySQL-Konvertierung?
CL.
2
Es hilft Ihnen, genau das zu tun, was Sie tun müssen. Tatsächlich mache ich das jetzt buchstäblich. Exportieren Sie MySQL mit mysqldump oder phpMyAdmin und importieren Sie es dann mit dem oben genannten Tool in eine SQLite-Datenbank. Er fragte nach "beim Exportieren einer MySQL-Datenbank in eine SQLite-Datenbank" und das obige Tool wird der zweite Schritt sein, um genau das zu tun, was Sie brauchen. Eine legitime Hilfe abzustimmen ist einfach so falsch. Ich bin neu hier und meine Antwort hat nicht nur die Frage angesprochen, sondern ist das, was ich gerade in einer realen Situation verwende. Stimmen Sie nicht so schnell ohne Grund ab und halten Sie die Leute von der Teilnahme ab.
Aaron Ratner
2
Sie haben den eigentlichen zweiten (und wichtigsten) Schritt ausgelassen und alle MySQL-spezifischen Teile des MySQL-Dumps in SQLite-spezifische oder Standard-Syntax konvertiert.
CL.
4
Spät, aber dieses Tool funktioniert bei diesem Problem nicht. Es unterstützt keine MySQL-spezifische Syntax (nur SQLite-Syntax). Sie müssen die Dump-Datei ziemlich stark bearbeiten, damit sie erfolgreich importiert werden kann.
Sverri M. Olsen
5
@ AaronRatner Nein, die Lösung funktioniert nicht. In der Frage wird explizit nach der Konvertierung einer MySQL-Datenbank gefragt, und das von Ihnen empfohlene Tool verarbeitet die MySQL-Syntax nicht. Sie müssen dies nicht persönlich nehmen - von dem, was Sie sagen, würde ich vermuten, dass Sie derjenige sind, der sich "entspannen" muss :-) Wenn jemand sagt, dass Ihre Lösung für ihn nicht hilfreich ist, gibt er nur a an einfache Tatsache. Ihre Antwort, dass dies "außergewöhnlich schwierig ist, weil die Lösung hilfreich ist", ist absurd. Ich weiß, dass es für mich nicht hilfreich ist, weil es nicht :-) Prost!
BartoszKP
-17

Exportieren Sie die Daten mit

  mysqldump database > database.sql

und importieren Sie die Daten mit

  sqlite3 database < database.sql

Möglicherweise benötigen Sie die Optionen -u (Benutzer) und -p (Kennwort)

Orbit
quelle
9
Funktioniert dies tatsächlich mit den Unterschieden und Funktionen, die in MySQL und nicht in SQLite verfügbar sind?
Rzetterberg
5
Dies wird nicht funktionieren. Indizes, Tabellenbeschreibungen, Escape-Sequenzen für binäre Daten, Sperrmechanismen und wahrscheinlich andere Dinge unterscheiden sich zwischen MySQL und SQLite.
CR.
Dies ist eine viel bessere Lösung: stackoverflow.com/questions/455606/…
Joseph
4
das wird nicht funktionieren. Bitte testen Sie die Lösung, bevor Sie etwas veröffentlichen, das Ihnen zuerst in den Sinn kommt ...
Maciej Jankowski