Wie versprochen gibts hier auf sqlblog.fth-it.net wieder Regelmäßiger Tipps und Tricks für den täglichen Umgang mit Datenbanken.
Gestern war es wieder einmal so weit und ich durfte Daten aus einer recht großen MySQL Tabelle auslagern. Das heißt es ging darum, Daten die vor 2012 gespeichert wurden aus der Tabelle zu entfernen und in ein Textfile zwecks Archivierung zu sichern.
Der für den Export notwendige Befehl lautet:
[SQL]SELECT INTO OUTFILE[/SQL]
Das tolle an diesem Befehl im Vergleich zu einem mysql_dump ist der, dass man jede beliebige MySQL – Abfrage exportieren kann und eben nicht nur wie bei einem Dump ganze Tabellen oder Datenbanken. Wenn man jetzt also wie in meinem Fall alle Daten vor 2012 in eine Datei schreiben will, geht man wie folgt vor:
[SQL]SELECT * INTO OUTFILE ‚/tmp/daten_vor_2012.exp‘
FIELDS TERMINATED BY ‚\t‘
ENCLOSED BY ‚\“‚
FROM my_table
WHERE datum < ‚2012-01-01‘;[/SQL]
Wobei natürlich eine Spalte ‚datum‘ in der Tabelle my_table vorhanden sein muss. Zusätzlich habe ich hier noch angegeben, dass die einzelnen Datenbankfelder durch Tabulatoren getrennt werden sollen. Dies geschieht mit der Anweisung: FIELDS TERMINATED BY ‚\t‘
Natürlich kann man hier an Stelle von Tabulatoren auch andere Trennzeichen angeben.
Mit ENCLOSED BY ‚\“‚ erreichte ich noch, dass alle Textfelder schön von “ umgeben sind.
Dass für jeden Datensatz eine neue Zeile im File angelegt wird muss nicht extra angegeben werden. Und dass sich ‚/tmp/daten_vor_2012.exp‘ auf den Dateinamen des Files in das geschrieben wird bezieht, sollte auch selbsterklärend sein, und muss natürlich für nicht Unix-User entsprechend angepasst werden.
Hat man den Befehl eingegeben heißt es nur noch warten, bis alle Zeilen geschrieben sind. Als Kontrolle machte ich vor dem Löschen der Zeilen in der Tabelle noch ein [SQL]
SELECT COUNT(*) FROM my_table WHERE datum < ‚2012-01-01‘;[/SQL] und vergleichte das Ergebnis mit dem Ergebnis von
wc /tmp/daten_vor_2012.exp
um zu sehen, ob wohl wirklich alle Zeilen in die Datei geschrieben wurden. Das Löschen der nicht mehr in der Tabelle benötigten Zeilen ist dann mit einem einfachen [SQL]
DELETE FROM my_table WHERE datum < ‚2012-01-01‘;[/SQL]zu bewerkstelligen. Man sollte dabei aber nicht ausser Acht lassen, dass auch das Löschen von Datensätzen einiges an Zeit beansprucht.