MySQL und Barrakudas

Eigentlich sollte man sich um einen Datenbankserver möglichst wenig kümmern müssen. Regelmäßige Updates zur Sicherheit sind auch kein Thema. Bei der Konfiguration sollte man in der Regel auch nicht alle Tage was neues ausprobieren.

Spannend wird das nur, wenn dann etwas nicht funktioniert und man auf die Suche geht. So etwas ist mir heute einmal wieder passiert. Auslöser war eigentlich eine harmlose Sache: Vor kurzem gab es eine Fehlermeldung, dass ein Datensatz eines Benutzers nicht gespeichert werden konnte – mit dem Hinweis:

MySQL Error 1118 (Row size too large)

Soweit so ärgerlich – ich habe da erst ein wenig gesucht, aber nichts gefunden – da der Fehler sich auch irgendwie nicht adhoc reproduzieren lies habe ich mich erst mal um das Tagesgeschäft gekümmert. Bis mir das gleiche Problem heute selbst auf die Füße gefallen ist, allerdings nicht an ursprünglicher Stelle sondern bei einer ganz anderen Aktion: Eigentlich wollte ich nur „mal eben schnell“ feststellen ob die Performanceprobleme einer neuen Funktion nur darauf zurück zu führen sind, dass unser Entwicklungssystem schon etwas älter ist und damit nicht immer gerade als Vergleich herhalten kann (es hat gewisse Vorteile ein solches System zu verwenden: Was da schon nicht prickelnd läuft, ist in der Regel ein Hinweis, dass man sich die Programmierung nochmal anschauen sollte).

Nunja in diesem Fall hat die Analyse der Programmierung leider nicht so recht gefruchtet – daher wollte ich einen Versuchsballon starten und die aktuelle Entwicklung auf unserem Produktiv-System in einer Spielwiese testen. Normalerweise ist das kein Problem und wenn die Performance dort dank mehr Rechenleistung ausreichend ist, kann man es ja erst mal so lassen. Ich nehme also meinen Entwicklungs-Dump und versuche diesen in die Spielwiese zu laden. Aber – oh Wunder – ich renne genau in den Fehler von oben hinein. Allerdings mit einem Dump, den ich aus einer bestehenden Datenbank extrahiert habe – die Größe müsste also ja passen, denn sonst wäre es ja gar nicht erst reingekommen.

Aber der Reihe nach: Ich suche natürlich erst einmal nach einem Problem mit der Größe, dabei stoße ich darauf, dass es eine Veränderung an der Art und Weise gab, wie die Datenbank mit ihrer InnoDB-Engine die Daten ablegt – das neue Format wurde „Barracuda“ getauft. Dieses soll unter anderem effizienter mit dem Speicher haushalten, bzw. man kann festlegen wie ggf. gespeichert werden soll. Generell gilt für die InnoDB: Nur große Objekte (also TEXT, BLOB und Consorten) werden außerhalb der Seite abgelegt, alles andere bleibt in der Page. Das kann zu dem oben genannten Fehler führen. Allerdings muss man es da schon recht dicke treiben, denn die Blattgröße ist maximal 8126 Bytes bezüglich der Daten. Selbst wenn ich nun vom absoluten Worst-Case für meine Datenbank ausgehe und für jedes VARCHAR-Feld pro Zeichen von maximal für Bytes (weil wir mit UTF-8 arbeiten) ausgehe, komme ich auf etwas mehr als 600 Bytes. Also kann das nicht der Grund sein… ebenfalls würde das noch nicht erklären, warum es mit dem früheren Speicherformat (names „Antelope“) bisher funktioniert hat.

Auch wenn es auf den ersten Moment komisch erscheint, habe ich dann im Testsystem mal nach einem weiteren StackExchange-Eintrag experimentiert, und ins Schwarze getroffen. Mit der veränderten Einstellung lief der Import plötzlich sauber durch. Ganz wichtig dabei ist, dass man es wie hier beschrieben macht. Also erst den Server-Prozess sauber beenden, damit wirklich alle Änderungen aus dem Log geschrieben sind. Dann zusätzlich die Index, Log und Cache-Files für die InnoDB aus dem Weg räumen, dann umstellen und den Serverprozess wieder starten. Der kümmert sich dann darum, dass die notwendigen Verwaltungs-Dateien automatisch wieder erzeugt werden und diesmal die neue Größe haben.

Problem gelöst, nur weshalb trat der Fehler eigentlich auf? Denn man möchte ja etwas dabei lernen. Die Ursache ist in der Art und Weise zu suchen, wie der MySQL-Dump funktioniert: Im Prinzip ist die Datei nur eine große Sammlung von Statements, die nacheinander ausgeführt werden. Dabei wird natürlich auch Rücksicht auf Abhängigkeiten genommen, z.B. die Fremdschlüssel – denn es kann ja passieren, dass Tabelle „A“ auf eine Spalte in der Tabelle „Z“ referenziert, die Tabelle „Z“ aber noch nicht erzeugt wurde, wenn „A“ rekonstruiert wird. Die Daten werden dabei (wie man es auch ganz regulär machen würde) als Insert-Statements in die Tabellen geschrieben. InnoDB beachtet das ACID-Prinzip, jedes Statement wird daher als atomare Operation betrachtet. Um effizienter zu arbeiten, verwendet der Dump folgendes Konstrukt

insert into table a values ('a','b','c'), ('d','e','f'), .... ('xyz','aa','cc');

Das ist völlig legitim. Man kann alternativ auch folgende Statements ausführen.

insert into table a values ('a','b','c');
insert into table a values ('d','e','f');
....
insert into table a values ('xyz','aa','cc');

Das Ergebnis ist das Gleiche. Nur intern ist es ein kleiner aber feiner Unterschied. Um die ACID-Kriterien zu erfüllen, wird im zweiten Fall nach jedem einzelnen Statement ein Commit durchgeführt (was etwas Performance kostet), für InnoDB ein Zeichen, dass man die Log-Datei „wegschreiben“ kann und damit dann auch wieder leeren kann, es ist also Platz für neue Daten in der Datei vorhanden. Passiert das nicht (wie im ersten Fall, in dem InnoDB davon ausgehen muss, es handelt sich um ein atomares Statement) kann die Log-Datei zu klein sein, was dann zur Fehlermeldung führt. Warum dann aber eine völlig fehlweisende Fehlermeldung auftaucht, die keinen Hinweis auf das Logfile enthält, bleibt vorerst noch Sache der jeweiligen Entwickler. Ich habe mal einen Bug-Report ausgefüllt, mal sehen ob das behoben werden kann (oder ob ich selbst einmal die Zeit finde mich dem Problem zu widmen).

 

 

Rheintalquerung 2015

tmp_7091-IMG_20150228_0751293771344Nun ist es Tradition, zumindest mal für mich, für andere war es das ja schon: Am vergangegenen Wochenende trafen sich wieder eine Reihe handverlesener Lauffanatiker um die etwas mehr als 43km von Leutershaisen an der Bergstraße bis nach Bad Dürkheim an der Weinstraße anzugehen. Die Veranstaltung ist rein privat organisiert und alles, nur kein Wettkampf. Der Spaß am Laufen und der Ausstausch nach der Winterpause (sofern man eine solche überhaupt macht, denn laufen kann man bei jedem Wetter: Es gibt nur unpassende Kleidung, aber doch kein unpassendes Wetter …)

Die Versorgung entlang der Strecke ist auch immer ein Highlight: Einige Unterstützer (Familie, Freunde, etc.) fahren mit einem Kleinbus verschiedene Punkte an der Strecke an. Passend zur kühlen Jahreszeit gibt es dann warmen Tee. Ich habe auch dieses Jahr wieder einen Energieriegel vom Blech, sprich einen Schokokuchen beigesteuert – der wurde auch gleich beim Start nachgefragt: „Ohne den laufe ich nicht …“

tmp_7091-IMG_20150228_084050994491734Pünktlich um 8:00 setzt sich der Tross in Bewegung – noch haben wir alle Energie und das Wetter ist vorzüglich: schönster Sonnenschein, wenn auch etwas frisch. In Heddesheim stößt als Neuerung Franks Vater mit dem Rad zu uns – er will mal sehen wie weit er mithalten kann, immerhin ist er der mit Abstand älteste Teilnehmer.

Noch nicht mal eine Stunde ist vergangen und die erste Versorgungsstation in Ilvesheim kommt in Sicht – ich habe eigentlich noch keinen Hunger und auch wenig Drust, aber ich weiß ja was kommt, also doch ein wenig Kalorien zu sich nehmen. Weiter geht es entlang des Neckars-Kanals, in der Ferne sehen wir schon den Fernmeldeturm in Mannheim – rund 3 km dahinter liegt schon der nächste Versorgungspunkt. Das Feld zieht sich vergleichsweise stark auseinander – jeder läuft mit der für ihn angenehmen Geschwindigkeit – für mich heißt das fast immer in der Spitzengruppe unterwegs zu sein, auch wenn ich das nicht unbedingt vorhatte. Entlang des Neckars kann man erste ganz zaghafte Versuche des Frühlings sehen – alles wartet scheints nur noch auf etwas wärmere Temperaturen.

tmp_7091-IMG_20150228_095936-1691766784Am Fuß der Kurt-Schumacher-Brücke in Mannheim machen wir nochmal Rast. Scherzhaft erfolgt eine Abfrage ob denn auch jeder die notwendigen Papiere für die Einreise nach Rheinland-Pfalz dabei hat. Die nun folgende Etappe ist das längste Teilstück – von Mannheim bis nach Ruchheim – etwa 15km liegen vor uns. Leider nicht mehr so malerisch und naturnah wie am Neckar – sondern durch die Industrielandschaft und Wohnbebauung in Ludwigshafen. Besondere Herausforderung: die Strecke nach Oggersheim – kerzengerade und fast keine Abwechslung, wenn man von den verschiedenen Autohäusern und Werkstätten einmal absieht. An der BG-Klinik gibt es immerhin noch was zu sehen – der Rettungshubschrauber startet zum Einsatz als wir vorbei laufen. Ich habe mit einem „Halbstreckler“, der in Mannheim begonnen hat die Führung übernommen. Wir sind soweit voraus, dass wir im Zentrum Ogggersheims erst einmal auf den Rest der Gruppe warten.

tmp_7091-IMG_20150228_113547_1312982119Mit einigen Schlenkern geht es aus Oggersheim langsam heraus – die Umgebung wird wieder ländlicher bzw. landwirtschaftlicher – wir durchlaufen die Gemüseäcker der Region – noch sind die Felder fast alle kahl, aber bereits in einigen Wochen wird hier wieder Salat und Gemüse geerntet. Das Wetter spielt weiterhin mit. Die Sonne ist so kräftig, dass ich die Jacke um die Hüft schlingen kann. Am Ortseingang Ruchheim postiere ich mich dann für ein gesammeltes Foto-Shooting. Zwischen der Spitze und der Nachhut der Gruppe liegen satte 10 Minuten … mich beschleicht das Gefühl, dass ich wohl mal wieder zu schnell an die Sache heran gegangen bin, aber noch ist ja alles gut. Außerdem ist die Versorgung auch nicht mehr weit. Diesmal habe ich auch richtig Hunger und Durst.

tmp_7091-IMG_20150228_113746457152875In der nächsten Etappe bezwingen wir die letzten Höhenmeter des heutigen Tages: Es geht über die A67 (also rund 7 Höhenmeter) nach Maxdorf. Dieser Ort ist ein klassisches Straßendorf – nicht zu sehr in die Breite gewachsen, dafür aber in die Länge. Gut, dass es immerhin eine paralelle Straße durch die Bebauung gibt, entlang der Hauptstraße wollte ich das nicht laufen. Gegen Ende plagt mich dann auch mein Magen etwas – normalerweise habe ich doch keine Probleme mit Magenkrämpfen. Die Versorgung liegt am Ende des Ortes – ich nutze die Chance, dass dort schon wieder Acker, Weinberge und Hecken vorhanden sind. Nach dem Bescuh im Tempel der Erleichterung bin auch wieder deutlich entspannter. Laufen wenn man eigentlich aufs Klo müsste iest einfach nur anstrengend. Daher mag ich auch eher Läufe durch die Natur 😉

Kaum zu glauebn, wir haben bereits etwas mehr als 30km hinter uns gebracht, und es geht auf die letzte Etappe bis nach Bad Dürkheim. Die Strecke ist flach und verläuft in wenigen schnurgeraden Abschnitten, also nochmal etwas für den Kopf des Läufers. Im Industriegebiet von Bad Dürkheim laufen wir dieses Jahr ein wenig anders als bisher. Anstelle der Magistralen zu folgen schwenken wir auf den Radweg entalng des Bachs ein – vielleicht einige hundert Meter mehr zu laufen, aber deutlich angenehmer. In der Ferne kann man schon die Ausläufer des Pfälzer Walds sehen. Bis ins Zentrum an die Saline am Festparkplatz sind es nur noch drei Kilometer – kurz vor dem Ziel heißt es dann wie jedes Jahr: „call me Ultra“ – wir überschreiten die  „magische“ Marke von 42.195km. Der Vollständigkeit halber laufe ich auch noch ein wenig weiter als den Parkplatz, um dem Motto der Querung „von der Berg- an die Weinstraße“ gerecht zu werden.

Zum Abschluss heißt es Entspannen im Thermalbad bzw. der Sauna. Marion stößt dann kurz vor dem Abendessen im großen Fass auf dem Festplatz zu uns. Ich plane mit den PULTlern eigentlich noch am Sonntag von Mannheim wieder mit der Straßenbahn nach Bad Dürkheim zu fahren und die Strecke auch zurück zu laufen – zumindest ein gutes Stück. Grudrun, Peter und Jürgen haben sich für die Nacht ein Zimmer genommen.

Als es dann am Sonntag früh um kurz nach sechs für mich heißt: Aufstehen! Fällt mein Blick aus dem Fenster – es gießt gerade wie aus Eimern – da vergeht selbst mir die Lust auf den Lauf (wenn man wenigstens im Trockenen startet ist alles kein Ding, aber schon durchfeuchtet starten ist nicht mein Ding). Daher sage ich die Rückrunde ab. Im Luafe des Vormittags hört es zwar dann recht bald auf zu regnen, aber richtig schön wird das Wetter auch nicht. Rein von der Kondition und dem Muskelnkater her könnte ich das ohne Probleme laufen. Soviel ist sicher, nachdem ich nachmittags im Schwimmbad noch einige Bahnen als Ersatz schwimme.