All posts by Kuni

Heißer Rasenmäher

heiß im Sinne von “qualmt”…

Schon beeindruckend, wenn schlagartig aus allen möglichen Enden erbärmlich nach schmorendem Plastik stinkender Rauch austritt und anschließend bei jedem Startversuch nur noch profan sofort die Sicherung kommt.

Vermutete Diagnose: geschmolzene Wicklung in der Motorspule, was eine Reparatur hinreichend fragwürdig erscheinen ließ, so dass umgehend ein Nachfolger (stärker, breiter, etwas lauter und natürlich trotz gleicher Firma fangkorbinkompatibel) besorgt wurde.

In diesem Sinne: R.I.P. alter “Wolf 2.36E”

image

image

Elterngeld – update

Ich zitiere aus der Checkliste einzureichender Unterlagen in meiner letzten, umfangreichen Elterngeldantragsanalyse:

Verdienstbescheinigung des Arbeitgebers des Vaters vom August 2011 bis Juli 2012 (eigentlich will das Amt die monatlichen Verdienstbescheinigungen, aber der Arbeitgeber hat eine zusammenfassende Bescheinigung ausgestellt – mal gucken)

…ging natürlich nicht gut – laut Elterngeldstelle stimmen zwar die zusammengefassten Steuern, aber nicht die Angaben zur Sozialversicherung (mehr Details habe ich nicht bekommen und weiß auch nicht, ob ich die wirklich haben will).

Also habe ich umgehend die Verdienstabrechnungen der einzelnen Monate angefordert. In der Summe erhöht sich damit der Stapel toten Papiers, der zur Elterngeldbeantragung geopfert wurde, von 31 auf 47 Blatt.

Dennoch muss ich drei definitiv positive Punkte erwähnen:

  1. der Hinweis der Elterngeldstelle kam per Email
  2. diese Email kam bereits eine Stunde, nachdem ich den Elterngeldantrag eingereicht habe
  3. das Nachreichen der Verdienstabrechnungen kann ebenfalls per Email erfolgen

Mal gucken, wie’s weitergeht…

Elterngeld, statistisch gesehen

Soeben den Elterngeldantrag fertig gemacht, auf dessen Zusammenstellung wir uns ja schon hier im Blog vorgefreut haben. Mal sehen, ob wir alles haben:

  • Mantelbogen (2 Blatt Papier mit 4 bedruckten Seiten (im folgenden kurz in der Form “2/4” notiert))
  • Kopien der Personalausweise von Vater und Mutter (2/2)
  • separate Angabe der Steueridentifikationsnummern und Kontoverbindungen von Vater und Mutter (1/1)
  • Anlage zum Einkommen Vater (rosa Formular, 1/2)
  • Anlage zum Einkommen Mutter (hellgrünes Formular, 1/2)
  • Geburtsbescheinigung (exklusives Dokument, das es nur einmal vom Standesamt für die Beantragung von Elterngeld gibt, 1/1)
  • Bescheinigung der Krankenkasse für den Antrag auf Elterngeld inklusive Angaben zur Zahlung von Mutterschaftsgeld (1/1)
  • Bescheinigung des Arbeitgebers des Vaters über die vereinbarte Elternzeit (blaues Formular, 1/1)
  • Bescheinigung des Arbeitgebers der Mutter über die vereinbarte Elternzeit sowie den Arbeitgeberzuschuss zum Mutterschaftsgeld (eigentlich auch blaues Formular, aber der Arbeitgeber hat ein eigenes, weißes verwendet – ob das gut geht?, 1/1)
  • Verdienstbescheinigung des Arbeitgebers des Vaters vom August 2011 bis Juli 2012 (eigentlich will das Amt die monatlichen Verdienstbescheinigungen, aber der Arbeitgeber hat eine zusammenfassende Bescheinigung ausgestellt – mal gucken, 1/1)
  • Verdienstbescheinigungen des Arbeitgebers der Mutter vom Juni 2011 bis Mai 2012 (hier das volle Programm, 19/19)
  • nicht abzugeben sind die Ausfüllinformationen auf den gelben Blättern (3/5)

Aufsummiert ergibt das an abzugebenden Unterlagen: 31 Blatt Papier, von denen 35 Seiten bedruckt sind.

Unglaublich interessante Nebeninformation:

  • auf dem Mantelbogen sind nicht weniger als 144 Ankreuzkästchen vorhanden (wir mussten 52 ankreuzen)
  • trotz der Papiermenge sind doch tatsächlich nur sechs Unterschriften nötig
  • der gesamte Antrag wiegt 158g
  • der gesamte Antrag mit halbwegs sinnvollen Einstellungen durch den Einzugsscanner gejagt ergibt ein PDF von 14MB

Unser Fazit: Wer auch immer Frau von der Leyen uneingeschränkt für das Elterngeld lobt, hat noch keinen derartigen Antrag ausgefüllt.

Über die Fallen, die man beachten muss, wenn man keinen Elterngeldabzug erleiden möchte (also zumindest die, die wir gefunden haben – welche wir übersehen haben, erfahren wir ja erst nach dem Einreichen) berichten wir nur persönlich auf Anfrage und wenn man uns dafür zum Essen einlädt 🙂

Du sollst nicht BLOBben!

Das folgende wird ein etwas weniger humoristischer Beitrag über ein Thema, das sich inzwischen zu einem meiner Hauptprobleme als Datenbankadministrator entwickelt hat: BLOBs in Datenbanken. Ich werde versuchen, das Ganze etwas ausführlicher zu beschreiben, damit ich später BLOB-geneigte Datenbanknutzer für einen Einstieg in die Problematik auf diese Seite verweisen kann.

Fangen wir also ganz harmlos an: was bedeutet BLOB? Das Wort ist überraschenderweise kein echtes Akronym, sondern wurde laut Wikipedia von einem Mitarbeiter bei DEC erfunden, um einen “Haufen unstrukturierter Daten” (freie Übersetzung von mir) zu bezeichnen:

Blobs were originally just amorphous chunks of data invented by Jim Starkey at DEC, who describes them as “the thing that ate Cincinnati, Cleveland, or whatever”.

Erst später tauchten die Backronyme “Basic Large Object” bzw. “Binary Large Object” auf.

Doch was sind BLOBs nun genau? Grob gesagt stellen jegliche Daten, die im jeweiligen Kontext unstrukturiert erscheinen, BLOBs dar. Damit sind sowohl tatsächlich unstrukturierte Daten gemeint als auch, was der weitaus häufigere Fall ist, strukturierte Daten, deren innere Struktur im Kontext jedoch nicht erfasst und somit auch nicht genutzt werden kann.

Am Beispiel etwas konkreter: eine MP3-Datei hat zwar durchaus einen wohldefinierten, strukturierten Aufbau (ein Dateiheader gefolgt von Musikdaten, die in exakt spezifizierten Frames vorliegen, letztere widerum mit jeweils einem eigenen Header versehen). Dennoch stellt eine MP3-Datei im Kontext von Datenbanken einen BLOB dar, da die Datenbank mit dieser inneren Struktur überhaupt nichts anfangen kann. Sie kann lediglich den gesamten “Datenhaufen” 1:1 in ein BLOB-Feld kopieren. Dasselbe gilt für alle in Dateien gekapselten Daten (Graphiken, Videos, Office-Dokumente, usw. aber auch reine Textdateien), wenn keine Anwendung vor die Datenbank geschaltet wird, die die Daten “auseinandernimmt” und eventuell auch noch weiter aufbereitet.

Eine zentrale Eigenschaft, durch die sich BLOBs von den restlichen Daten in einer Datenbank unterscheiden, liegt darin, dass die einzigen Datenbankoperationen im jeweils vollständigen Lesen oder Schreiben des gesamten BLOB-Datenfeldes bestehen. Andere Operationen, die eigentlich den Ausschlag für den Einsatz von Datenbanken darstellen (sortieren, suchen, filtern, usw.) sind nicht möglich. Auch in komplexeren Datenbankabfragen können BLOB-Felder maximal in der Form von “… und dann hängen wir in der Ergebnistabelle noch den BLOB dran” auftreten.

Nachdem nun also feststeht, was BLOBs sind, wird sich der geneigte Leser und insbesondere der unbedarfte Datenbanknutzer fragen, was denn nun das Problem sei. Es gibt doch in jeder besseren Datenbank (und auch bei MySQL) entsprechende Datentypen, also rein damit und gut ist…

Fassen wir also zunächst zusammen, warum Datenbanknutzer (verständlicherweise) von BLOBs so begeistert sind:

  • die Daten sind im Datenbankschema sauber eingebunden und (hoffentlich durch echte Schlüsselbeziehungen – bei MySQL/MyISAM nicht möglich) referenziert – die Daten können weder verwaisen, noch können die Referenzen auf die Daten auf einmal ins Leere zeigen
  • in einem Datenbank-Dump sind sämtliche Daten enthalten: die strukturierten Daten und die BLOBs – dies erleichtert sowohl die Portierung als auch das komplette Zurücksetzen in einen früheren Zustand (Stichwort Backups) ungemein
  • je nach Datenbanksystem ist es möglich, die BLOB-Daten durch programmierbare Operationen auf dem Datenbankserver (Trigger, Rules, …) zu bearbeiten
  • die Rechteverwaltung (welcher Nutzer darf was?) ist deutlich leichter zu implementieren, wenn die BLOBs mit in der Datenbank liegen

Die Probleme, mit denen der oben beschriebene Komfort (und es geht hier ausschließlich um Komfort) erkauft werden, sieht der Nutzer nicht – ganz im Gegensatz zum Datenbankadministrator.

Grob kann man festhalten, dass BLOBs in Datenbanken immer ineffizient sind und zwar sowohl was die Zugriffszeit als auch den letztendlich verbrauchten Speicher angeht. Begründet liegt dies darin, dass bei allen Datenbanksystemen (und in Teilen auch bei MySQL) Datenkonsistenz die oberste Priorität besitzt.

So kann ein Datenbankserver z.B. nicht wie ein Fileserver dem Nutzer den Dateiinhalt einfach an den Kopf werfen (also lediglich: Datei lesen und den Inhalt an den Nutzer weiterleiten). Nein, ein Datenbankserver wird bei einem Zugriff auf einen BLOB (mindestens) folgende Operationen durchführen:

  • prüfen, ob der Datenbanknutzer die Berechtigung zum Zugriff auf die Datei hat (über mehrere Hierarchieebenen hinweg – Datenbankrechte sind in der Regel umfangreicher als Filesystemrechte aufgebaut)
  • prüfen, ob der BLOB gerade anderweitig gelesen/geschrieben wird oder sonstwie temporär gesperrt ist (dies dient der Sicherung der Datenkonsistenz – es soll verhindert werden, dass sich die Daten während des Zugriffs ändern könnten); falls ja, die Anfrage in einer Warteschlange eintragen
  • sobald ein Zugriff möglich ist, diesen in den entsprechenden Systemtabellen eintragen, damit die folgenden Zugriffe bei Bedarf hingehalten werden können
  • (nur zur Erinnerung: bis hierher wurde noch kein Byte des BLOBs gelesen!)
  • die Datei aus dem datenbankinternen Format in das ursprüngliche Format umwandeln (eventuell sind je nach Datenbankconnector noch weitere Umwandlungen nötig)
  • die Datei ausliefern
  • die eingetragenen Sperren wieder entfernen

… und je nach Datenbanksystem wird der gesamte Zugriff auch noch parallel in einer separaten Textdatei protokolliert. Spätestens an dieser Stelle sollte einleuchtend sein, warum es aus Effizienzgründen eine blöde Idee ist, einen Datenbankserver als Fileserver zu missbrauchen – es wird aber noch schlimmer…

Stichwort Backups. Jeder, der sich schon einmal ernsthaft mit Backups beschäftigt hat, kennt die goldene Methode, um die drei gegeneinander konkurrierenden Größen Backuplaufzeit, Rückspielzeit und Backupgröße miteinander in Einklang zu bringen: inkrementelle Backups.

Als Datenbankadministrator muss man lernen, mit einer unbequemen Wahrheit zu leben: es gibt keine inkrementellen Backups! Zur Sicherung der Datenkonsistenz (Erinnerung: oberste Priorität) besteht jedes Backup zwangsläufig aus einem vollständigen Datenbankdump.

(Kleine Fußnote der Vollständigkeit halber: man kann bei echten Datenbanksystemen durch eine explizite, separate Sicherung der Write-Logs eine Art inkrementelles Backup simulieren, was auch durchaus nicht selten praktiziert wird, aber im Falle der BLOBs die Probleme auch nur verlagert – davon abgesehen, dass eine Backup-Strategie immer so trivial und unkompliziert wie möglich sein sollte.)

Dazu ein Beispiel aus unserer Praxis zur Verdeutlichung. Bei unseren PostgreSQL-Datenbankservern erfolgt einmal täglich ein Datenbankdump aller Datenbanken, wobei die Datenbanken jeweils erst einmal einzeln und dann noch einmal die gesamte Datenbankinstanz in einem eigenen Dump abgezogen werden.

Diese Datenbankdumps heben wir derzeit für 100 Tage auf (darüber hinaus heben wir noch die monatsersten Dumps ein Jahr lang auf und die jahresersten Dumps bisher ohne Begrenzung, des Weiteren machen wir noch ein zweites Backup pro Tag, das wir kürzer aufheben, aber für das folgende Rechenbeispiel beschränken wir uns auf die 100 Tage). Daraus folgt, dass jedes Byte in unserer Datenbank auf dem Backupserver das 200fache als Speicherplatz benötigt.

Dazu ein paar Rechenbeispiele: eine 100kB-Graphikdatei benötigt auf dem Backupserver langfristig nicht weniger als 19MB (in Wirklichkeit sogar noch etwas mehr, da die BLOBs im Datenbankdumpformat auch nochmal aufgebläht werden). Eine 578kB-Worddatei (Beispieldatei eines BLOB-geneigten Datenbanknutzers) belegt 112MB. Was mit Daten im MB-Bereich passiert, kann sich der geneigte Leser selbst ausrechnen.

Und nun haben wir Anfragen im zweistelligen GB-Bereich (und einen Ausreißer im dreistelligen GB-Bereich) erhalten…

Von unseren PostgreSQL-Servern konnten wir BLOBs bisher weitestgehend fernhalten, bei unseren MySQL-Servern ist das Kind schon in den Brunnen gefallen (was unter anderem dazu geführt hat, dass wir die obige Backup-Strategie zum Leidwesen der mehrheitlich BLOB-losen Nutzer dort nicht fahren können). Dadurch wurden wir aber auch schon mit einem weiteren, echten Problem konfrontiert: das Abziehen von riesigen, BLOB-lastigen Datenbanken kostet Zeit – viel Zeit – zuviel Zeit.

Denn zusätzlich besteht bei MySQL (auf Basis von MyISAM) das Problem, dass man Datenbanken nicht im laufenden Betrieb abziehen kann. Die Datenbank muss also für die Zeit des Datenbankdumps gesperrt werden. Was dies bedeutet, wenn die Dauer eines Dumps im Stundenbereich liegt, kann sich der geneigte Leser selbst ausmalen. Erfreulicherweise wurden wir bisher von dem Erlebnis von Kollegen verschont, bei denen BLOB-bedingt Backupzeiten von mehr als 24h auftraten – was bei täglichen Backups ziemlich unpraktisch ist und wo dann auch “echte” Datenbanksysteme nicht mehr weiterhelfen könnten.

Bleibt also die Frage, welche sinnvollen Optionen nun für einen Datenbanknutzer bestehen, der neben strukturierten Daten auch BLOBs sinnvoll verwalten möchte. Nun, es gibt eine Lösung, die sogar älter ist als BLOBs selbst (und zwar schlichtweg deshalb, da sie aus einer Zeit kommt, als Datenbanken noch keine BLOBs aufnehmen konnten): Referenzen.

Gemeint sind damit Referenzen, die man in der Datenbank (in Textfeldern) hinterlässt und die auf BLOB-Daten verweisen. Dabei kann es sich beispielsweise um vollqualifizierte Verzeichnis- und Dateinamen auf einem Fileserver oder URLs, die sonstwie auf den eigentlichen Speicherort des BLOBs verweisen, handeln. Der einzige, wirklich kritische Nachteil dieser Lösung besteht darin, dass die Sicherstellung der Konsistenz zwischen Datenbank- und Fileserverinhalt der zugreifenden Applikation aufgebürdet wird. Auch beim Backup muss man nun aufpassen, dass man Datenbank und Fileserver möglichst synchron sichert. Ansonsten löst dieser Ansatz aber schlagartig alle oben genannten Probleme.

Zu guter letzt noch, Ehre wem Ehre gebührt: dieser Artikel hat mir beim Schreiben sehr geholfen. In dem Artikel, der die gesamte Problematik vor allem aus der Sicht per PHP angebundener Webdatenbanken betrachtet, werden auch noch ein paar weitere Gründe gegen BLOBs genannt, die in diesem speziellen Kontext zusätzlich auftreten.

Auch diesen Artikel zu dem Thema fand ich sehr lesenswert. Der Autor ist ein DB-Admin, der für sehr große Datenmengen zuständig ist. Neben interessanten Erfahrungsberichten aus seiner Praxis und den oben genannten Gründen greift er unter anderem auch noch den Kostenaspekt auf (den er sehr zugespitzt formuliert: “If you’re storing your BLOBs, especially large media files in database, aren’t you choosing the most expensive file system available?”).

Kurzzusammenfassung all des Gesagten (siehe auch Subject): Du sollst nicht BLOBben!

4h meines Lebens…

Auf die Gefahr hin, dass Erik wieder in den Kommentaren sinngemäß schreibt, dass ich mich gefälligst nicht so haben soll, mein heutiger Rant. Ich schreibe ihn primär, damit andere nicht ihre wertvolle Lebenszeit opfern müssen, um zu meinen Erkenntnissen zu kommen.

Alles fing relativ harmlos mit der zufälligen Feststellung an, dass ein bestimmtes Windows Update (Windows 7 – KB2655992) seit Juli nicht installiert werden konnte. Dabei handelt es sich dummerweise um einen Patch, der wirklich sicherheitskritisch zu sein scheint.

Als zugehörige Fehlermeldung wird Code 80070570 angezeigt und direkt daneben ein Link mit dem Titel “Hilfe zu diesem Fehler” angeboten. Also alles kein Problem, oder? Nunja, hinter dem Link hat Microsoft eine Fehlerliste von sage und schreibe ganzen acht Fehlernummern hinterlegt und 80070570 war natürlich nicht darunter.

Also Google… Die Ergebnisse im deutschsprachigen Raum kann man erwartungsgemäß getrost in die Tonne kloppen (so in die Richtung “Speicherriegel defekt”, “Graphikkarte nicht schnell genug”, “LOL”, usw.). Auf englisch findet man aber mit etwas Filtern immerhin ein paar sinnvolle Hinweise.

Zunächst den Vorschlag, dass Update direkt von Microsoft herunterzuladen und auszuführen. Gesagt, getan und … die Meldung bekommen, dass das Update nicht für mein System bestimmt sei (wie sich später herausstellt, anscheinend die Default-Fehlermeldung).

Dann der Vorschlag, ein Reparatur-Update von Microsoft herunterzuladen, dass den Update-Mechanismus reinitialisiert (die Datenbank der installierten Updates neu aufbaut). Klingt ziemlich gut, aber leider ist auch dieses Reparatur-Update nach den Starten laut eigener Aussage für mein System nicht geeignet.

Also tiefer rein. Es gibt ein Kommandozeilenwerkzeug, mit dem man die Windows-Systemdateien überprüfen und bei Bedarf semi-automatisch reparieren kann:
sfc.exe /scannow
Im Prinzip ein guter Ansatz, allerdings stürzt das Programm mit der aussagekräftigen Fehlermeldung “Der Windows-Ressourcenschutz konnte den angeforderten Vorgang nicht ausführen” ab. Ok, eine Ebene weniger tief, kann man sfc auch erstmal nur scannen lassen:
sfc.exe /verifyonly
Hier brauchte er zwar eine Weile, aber lief immerhin durch und hinterließ ein grottig lesbares Logfile (und auch aus diesem Grund sollte man unter Windows immer einen vim installiert haben). Aha: mehrere, durchaus bekannte Windows-Systemdateien sind nicht lesbar (access denied): csrss.exe, lsass.exe, services.exe, smss.exe und winlogon.exe.

Nach diesen Dateien und dem Problem zu googlen ist sinnlos. Man findet nur endlos viele Seiten, wo Leute sie für Viren halten und verzweifelt versuchen, sie zu löschen (ja, es gibt ein paar Viren, die einige dieser Dateien austauschen, aber auf den genannten Seiten geht es eigentlich immer um die Originaldateien…). Um dennoch ganz sicher zu sein, kurz meine Versionen der Dateien bei virustotal.com geprüft – es sind die originalen.

Hmm, aber dennoch nicht lesbar – warum eigentlich? Ok, Rechte angucken. Die Dateien gehören “TrustedInstaller”, der alle Rechte hat, aber auch “System” und “Administratoren” können zumindest lesend und ausführend darauf zugreifen. Ersteres sollte allerdings schon ausreichen, da sowohl Windows Update als auch sfc als “TrustedInstaller” ausgeführt werden – und nu?

Ok, härtestes Geschütz: Process Monitor von Sysinternals und gucken, was da eigentlich genau beim sfc-Aufruf passiert. Auf jeden Fall viel – sehr sehr viel. Eine Viertelstunde Logfiltern später kristallisiert sich langsam eine bedeutende Frage heraus: was zum *** macht denn eigentlich der Virenscanner da?

Kurze Rückblende: ich hatte vor mehreren Monaten McAfee installiert, allerdings bewusst nur in der On-Demand-Variante, da die On-Access-Variante gerne mal mit bestimmten Programmen (gerne auch aus dem Windows-System-Umfeld) kollidierte (experimentell bestätigt).

Nun musste ich entsetzt feststellen, dass sich diverse McAfee-Prozesse rund um meine sfc-Anfrage tummeln, deren Dateien auch noch aus so romantisch benannten Unterverzeichnissen wie “Desktop Protection” stammen.

Also McAfee-Dienste (es sind drei) beenden – zwei lassen sich; einer weigert sich, zu sterben. McAfee-Prozesse im Process Explorer töten – geht nicht (darf der Administrator unter Windows eigentlich irgendetwas?). Also, letztes Mittel, McAfee deinstallieren und … das geht sogar wirklich.

Mit zitternden Händen erneut das Windows Update laufen lassen: läuft. Natürlich auch nochmal sfc (mit scannow) laufen lassen: “Der Windows-Ressourcenschutz hat keine Integritätsverletzungen gefunden.”

Wir fassen zusammen: wenn man McAfee installiert und extra das On-Access-Modul nicht installiert, bekommt man dennoch den umfassenden Systemressourcenschutz, der die Systemressourcen professionell vor dem System schützt – tolle Leistung. Microsoft kann ich nur den etwas schwächeren Vorwurf machen, dass deren Fehlermeldung Schrott sind (“irreführend” erscheint mir irgendwie zu schwach).

Dafür bin ich wie immer bei solchen Problemen Mark Russinovich und Bryce Cogswell für Sysinternals dankbar.

Was bei mir jetzt allerdings im Nachhinein ein sehr ungutes Gefühl hinterlässt, ist das Wissen, dass einer der unreflektierten Standardhinweise in so ziemlich jedem Dummy-Computerbuch oder äquivalenten Zeitschriften ist, “unbedingt” und “einfach” einen Virenscanner zu installieren. Benutzen die Leute, die solche Tips geben, eigentlich selbst welche?

Färbbarkeit in der Praxis

Gleich vorneweg, bevor ein falscher Eindruck entsteht: wir waren mit dem Krankenhaus Köpenick rundum zufrieden und würden es zumindest im Bereich Geburtshilfe jederzeit ohne Bedenken weiterempfehlen. Dennoch mussten wir mehrmals schmunzeln, wenn wir die Verteilung der Abteilungen auf die einzelnen Etagen im Fahrstuhl sahen:

image

Gleiche Farben bedeuten (inhaltlich) zusammenhängende Bereiche – so befindet sich z.B der Kreißsaal (gelb) in der 7. Etage und nach der Entbindung geht es dann halt in die Wochenbettstation (immer noch gelb) in die 4. Etage. Das ganze ist, für Informatiker und Administratoren wenig überraschend, historisch gewachsen (verschiedene Abteilungen sind wohl immer wieder mal bei laufendem Betrieb umgezogen). Das Ergebnis ist auf jeden Fall bunt.