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

Datenbanktuning ...

So, ich habe mal ein wenig Datenbanktuning betrieben. Das Blog sollte jetzt deutlich schneller reagieren. Eine wirklich grosse Hilfe ist das MySQL Performance Tuning Primer Script von Sundry einem Mitarbeiter von MySQL.

Die meisten Variablen können Online mittels "set global variablenname=wert" gesetzt werden, wobei Wert auch ein Ausdruck wie "32*1024" sein kann.

Die dauerhaften Änderungen an den Variablen gehören bei Ubuntu und Debian in das Verzeichnis /etc/mysql/conf.d (man muss nur in den seltensten Fällen Original-Konfigurationsdateien verändern). ACHTUNG: Dort funktionieren die Ausdrücke nicht, dort müssen Werte gesetzt werden. (Macht nicht den gleichen Fehler wie ich ...)

MySQL via SSH verwalten ...

Auf den meisten Webspaces ist zum Verwalten der MySQL-Datenbank phpMyAdmin vorhanden. Das ist ein phantastisches Tool, das mit dem Webbrowser nahezu alle Aufgaben rund um die eigene Datenbank erschlägt. Aufgrund der Tatsache, dass ein Browser benutzt wird, ist es manchmal etwas "hakelig" Verwaltungsaufgaben zu erledigen.

Wenn man auf seinem Webspace einen SSH-Zugang hat oder einen root-Server betreibt und MySQL nicht von aussen zugreifbar haben möchte (gute Idee!), kann man damit wahre Wunderdinge bewegen.

Zum einen sind die auf dem Server installierten Tools benutzbar, was wiederrum nicht jedermanns Sache ist.

Alternativ dazu kann man auch jeden lokal (!) installierten Client verwenden. Dazu baut man einen SSH-Tunnel auf. Das geht über
ssh -L 12345:localhost:3306 user@server
Das "-L" gibt an, von wo der Tunnel benutzt werden kann (so merke ich mir das), nämlich von Links, von der lokalen Maschine zur entfernten Maschine (Rechts). Der lokale Port 12345 wird via SSH-Tunnel an den entfernten Port 3306 weitergeleitet. Spendiert man der Zeile noch ein "-g", so kann der lokale Rechner als Proxy für andere Rechner verwendet werden.

Ab jetzt ist es möglich via Port 12345 auf der lokalen Maschine auf die entfernte Datenbank zuzugreifen.

Eine Klippe gilt es aber noch zu umschiffen. Die Tools von MySQL wollen Datenbanken, die auf localhost laufen immer via Socket verbinden. Das kann für die entfernte Datenbank natürlich nicht funktionieren.
mysql --protocol=tcp -P 12345 -u user -p
funktioniert aber bestens. Bei den grafischen Tools ist anstelle von "localhost" die IP-Adresse "127.0.0.1" einzutragen, dann wird auch dort TCP benutzt.

Ich mag die MySQL-Tools allerdings gar nicht so sehr. Daher nutze ich den SQuirreL SQL Client, den ich im neuen Job schätzen und lieben gelernt habe. Das ist eine Java-Anwendung, die die Syntax von verschiedenen SQL-Dialekten schon via Plugin dabei hat (darunter DB2, Oracle, MySQL, Sybase und einige andere mehr). Das, was noch zu tun ist, ist den jdbc-Treiber in das lib-Verzeichnis zu kopieren und schon können entsprechende Datenbanken verwendet werden.

In unserem Beispiel sorgt
jdbc:mysql://localhost:12345/datenbank
für die Verbindung zur Datenbank mit dem Namen Datenbank.