Skip to content

Von MySQL nach SQLite ...

Wie hier schon mehrfach im Blog geschrieben, bin ich ein grosser Fan der Mini-Datenbank SQLite.

Jetzt habe ich ein (verbesserungswürdiges aber funktionierendes) Skript gefunden, dass einen MySQL-Dump für SQLite aufbereitet: How-to: Convert mysql to sqlite

Dump der MySQL-Datenbank ziehen, wichtig ist die Option "--compatible=ansi":

$ mysqldump -u root -p --compatible=ansi --skip-opt generator > dumpfile
$ mysql2sqlite.bash dumpfile
$ sqlite3 dumpfile.db

Mit folgendem mysql2sqlite.bash:

#!/bin/bash
if [ "x$1" == "x" ]; then
  echo "Usage: $0 <dumpname>"
  exit
fi

cat $1 |
grep -v ' KEY "' |
grep -v ' UNIQUE KEY "' |
grep -v ' PRIMARY KEY ' |
sed '/^SET/d' |
sed 's/ unsigned / /g' |
sed 's/ auto_increment/ primary key autoincrement/g' |
sed 's/ smallint([0-9]*) / integer /g' |
sed 's/ tinyint([0-9]*) / integer /g' |
sed 's/ int([0-9]*) / integer /g' |
sed 's/ character set [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ on update [^,]*//g' |
sed 's/\\r\\n/\\n/g' |
sed 's/\\"/"/g' |
perl -e 'local $/;$_=<>;s/,\n\)/\n\)/gs;print "begin;\n";print;print "commit;\n"' |
perl -pe '
if (/^(INSERT.+?)\(/) {
  $a=$1;
  s/\\'
\''/'\'\''/g;
  s/\\n/\n/g;
  s/\),\(/\);\n$a\(/g;
}
'
> $1.sql
cat $1.sql | sqlite3 $1.db > $1.err
ERRORS=`cat $1.err | wc -l`
if [ $ERRORS == 0 ]; then
  echo "Conversion completed without error. Output file: $1.db"
  rm $1.sql
  rm $1.err
else
  echo "There were errors during conversion.  Please review $1.err and $1.sql for details."
fi

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

dakira am :

*Vielen Dank. Das werde ich demnächst auch brauchen können! Gleich mal gebookmarkt ;-)

Chain am :

*Danke für das tolle Script! Bei mir hatte es allerdings noch Schluckauf wegen ein paar Feldern. Ich habe es erweitert:

CODE:
#!/bin/bash
if [ "x$1" == "x" ]; then
  echo "Usage: $0 "
  exit
fi

cat $1 |
grep -v ' KEY "' |
grep -v ' UNIQUE KEY "' |
grep -v ' PRIMARY KEY ' |
sed '/^SET/d' |
sed 's/ unsigned / /g' |
sed 's/ auto_increment/ primary key autoincrement/g' |
sed 's/ smallint([0-9]*) / integer /g' |
sed 's/ tinyint([0-9]*) / integer /g' |
sed 's/ int([0-9]*) / integer /g' |
sed 's/ character set [^ ]* / /g' |
sed 's/ CHARACTER SET [^ ]* / /g' |
sed 's/ COLLATE [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ set([^)]*) / varchar(255) /g' |
sed 's/ on update [^,]*//g' |
sed 's/\\r\\n/\\n/g' |
sed 's/\\"/"/g' |
perl -e 'local $/;$_=;s/,\n\)/\n\)/gs;print "begin;\n";print;print "commit;\n"' |
perl -pe '
if (/^(INSERT.+?)\(/) {
  $a=$1;
  s/\'''/''''/g;
  s/\\n/\n/g;
  s/\),\(/\);\n$a\(/g;
}
' > $1.sql
cat $1.sql | tee $1.lite | sqlite3 $1.db > $1.err
ERRORS=`cat $1.err | wc -l`
if [ $ERRORS == 0 ]; then
  echo "Conversion completed without error. Output file: $1.db"
  rm $1.sql
  rm $1.err
else
  echo "There were errors during conversion.  Please review $1.err and $1.sql for details."
fi

Chain am :

*Das war wohl nix...


#!/bin/bash
if [ "x$1" == "x" ]; then
echo "Usage: $0 "
exit
fi

cat $1 |
grep -v ' KEY "' |
grep -v ' UNIQUE KEY "' |
grep -v ' PRIMARY KEY ' |
sed '/^SET/d' |
sed 's/ unsigned / /g' |
sed 's/ auto_increment/ primary key autoincrement/g' |
sed 's/ smallint([0-9]*) / integer /g' |
sed 's/ tinyint([0-9]*) / integer /g' |
sed 's/ int([0-9]*) / integer /g' |
sed 's/ character set [^ ] / /g' |
sed 's/ CHARACTER SET [^ ]
/ /g' |
sed 's/ COLLATE [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ set([^)]*) / varchar(255) /g' |
sed 's/ on update [^,]*//g' |
sed 's/\\r\\n/\\n/g' |
sed 's/\\"/"/g' |
perl -e 'local $/;$_=;s/,\n\)/\n\)/gs;print "begin;\n";print;print "commit;\n"' |
perl -pe '
if (/^(INSERT.+?)\(/) {
$a=$1;
s/\\'\''/'\'\''/g;
s/\\n/\n/g;
s/\),\(/\);\n$a\(/g;
}
' > $1.sql
cat $1.sql | tee $1.lite | sqlite3 $1.db > $1.err
ERRORS=`cat $1.err | wc -l`
if [ $ERRORS == 0 ]; then
echo "Conversion completed without error. Output file: $1.db"
rm $1.sql
rm $1.err
else
echo "There were errors during conversion. Please review $1.err and $1.sql for details."
fi

Dirk Deimeke am :

*Vielen Dank für Deine Ergänzung! Ich habe das Skript lange nicht mehr gebraucht, es kann sein, dass es mittlerweile neuere Versionen der beiden Beteiligten gibt, die weitere Änderungen nötig machen.

Chain am :

*Das Script läuft übrigens auch mit SQLite2 - einfach sqlite3 auf sqlite ändern. Hab's grad ausprobiert. Sinn war das "downgrade" von MySQL auf SQLite auf einem Embedded-Server. Da aber PHP (ohne PDO) nur SQLite2 unterstützt eben nochmal downgraden ;-)

Chain am :

*So, ein letztes Mal melde ich mich noch :-)

Leider hat es immer noch nicht gepasst. Meine Applikation ist relativ bald gecrasht, und die Probleme die sich ergeben sind leider zu mannigfaltig (fehlende Indexes etc.) -- aber! Ich schreibe hier, was mich wirklich auf die richtige Spur gebracht hat!

Nämlich SQL Fairy. http://sqlfairy.sourceforge.net/

Scheint alt und unbetreut, aber zu unrecht, denn es ist wirklich nett, und brauchbar. Hier der Aufruf der bei mir Anhieb geklappt hat:

// Dump File umwandeln (mysqldump wie oben gezeigt)
sqlt -f MySQL -t SQLite dump.sql > dump-sqlite.sql

// Einlesen!
cat dump-sqlite.sql | sqlite datenbank.db

---

Ich konnte sogar meine Daten behalten, indem ich danach dann einfach die alte DB "drübergeprügelt" habe. Da die Tables ja schon bestehen, werden bloß die Daten eingefügt. Und schon war alles perfekt:

mv datenbank.db datenbank-old.db
sqlite datenbank-old.db .dump | sqlite datenbank.db

Wichtig zu erwähnen: SQLFairy kümmert sich lediglich um die Struktur. Die Daten muss man also noch irgendwie einfügen. Da empfehle ich nach wie vor dein Script ;-)

Auf dass es jemandem helfen möge =)

Dirk Deimeke am :

*Vielen Dank für die Ergänzung.

Ich vermute, dass viele Applikationen damit Probleme haben werden, dass SQLite nur vier Datentypen kennt.

SQL-Fairy muss ich mir einmal anschauen.

Kommentar schreiben

Gravatar, Favatar, Pavatar, Identica, Twitter, MyBlogLog Autoren-Bilder werden unterstützt.
BBCode-Formatierung erlaubt
Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
:'(  :-)  :-|  :-O  :-(  8-)  :-D  :-P  ;-) 
Formular-Optionen