Vier Prüfungen, die nichts geprüft haben

Sieben Datenbanken einer Bauart, dazu drei einer anderen, die meisten ein bis
zwei Hauptversionen zurück — alle noch im Wartungszeitraum, aber der Abstand wird
von allein nicht kleiner. Bei zustandslosen Diensten heißt Aktualisieren: Etikett
hochsetzen, neu starten, fertig. Für Datenbanken stand von vornherein etwas
anderes im Plan.

Ein Datenverzeichnis gehört zu der Fassung, die es angelegt hat; die neue liest
es nicht. Es braucht je Instanz einen Abzug, der vor dem Leeren der alten Ablage
geprüft wird, eine frisch aufgesetzte Fassung und ein Zurückspielen. Acht Mal.

Eine Falle steckte in der Wanderung selbst: Die neue Hauptversion hat den
Einhängepunkt eine Ebene nach oben verlegt. Wer den alten Pfad einhängt, gibt der
neuen Fassung ein leeres Verzeichnis und legt den echten Bestand daneben. Der
Container schreibt das hin, es klingt nur nach Randnotiz.

Prüfen lässt es sich vor dem ersten Start: sich vom Abbild ausgeben lassen,
welchen Pfad es als Ablage führt, und ihn gegen den halten, den die Stapeldatei
einhängt. Die übrigen vier Fallen steckten im Prüfen selbst.

Der Abzug enthielt zu wenig

Für den Abzug gibt es zwei Werkzeuge: eines für den ganzen Verbund samt
Kennungen, eines für eine einzelne Datenbank. Das erste brachte bei einer Instanz
die Systemdatenbank der alten Fassung mit und ließ das Zurückspielen scheitern.
Also nahm ich das zweite.

Fünf der sieben gingen glatt. Bei der sechsten meldete der Dienst, die
Anmeldung sei gescheitert. Er meldet sich nämlich nicht mit der Kennung an, die
der Erstlauf anlegt, sondern mit einer zweiten, die nur in seiner eigenen
Konfiguration steht. Kennungen gelten für den ganzen Verbund und gehören zu
keiner einzelnen Datenbank — im Abzug stand sie deshalb nicht.

Fünf Minuten Ausfall, dann war die Kennung neu angelegt und der Besitz an
sämtlichen Tabellen übertragen. Bei den übrigen sah ich vorher nach, welche
Kennungen es gibt und mit welcher der Dienst sich wirklich anmeldet. Nur bei
einer von sieben wich beides voneinander ab.

Zählen, was man zu zählen glaubt

Nach jedem Abzug wollte ich wissen, ob er vollständig ist. Naheliegend: die
Zeilen zählen, die eine Tabelle anlegen. Bei einer Instanz kam ich so auf 239
Tabellen, in der Datenbank waren es 40.

Der Unterschied stammt aus gespeicherten Prozeduren: Deren Quelltext steht als
Text im Abzug, und darin kommt dieselbe Anweisung dutzendfach vor. In die andere
Richtung geht es genauso schief — ein Abzug, der mitten im Schreiben abbricht,
hat trotzdem plausibel viele Treffer.

Verlässlich ist die Marke, die das Werkzeug ans Ende eines vollständigen
Abzugs setzt, und nach dem Einspielen die Auskunftstabellen der Datenbank selbst.
Beides fragt die Wirklichkeit statt eine Zeichenkette.

Von innen prüft man nichts

Zum Abschluss war ein Datenbankkennwort zu wechseln. Der Wechsel ist eine
Zeile. Die Prüfung danach lautete: Nimmt die Datenbank das neue Kennwort an, und
weist sie das alte ab?

Sie nahm beide an. Auch einen Fantasiewert. Für einen unangenehmen Moment sah
es aus, als stünde die Datenbank ohne jede Prüfung offen. Stand sie nicht.

Verbindungen von innerhalb des Containers gelten als vertrauenswürdig und
brauchen kein Kennwort — die Vorgabe, mit der so ein Verbund eingerichtet wird,
keine Aufweichung meinerseits. Erst für alles Übrige greift das Verfahren mit
Kennwort.

Ich hatte mich per Kommandoausführung in den Container gesetzt und von dort auf
die Rückschleife verbunden, also genau den Weg genommen, auf dem nichts geprüft
wird. Von außen war die Antwort eindeutig: neuer Wert angenommen, alter
abgewiesen, Fantasiewert abgewiesen.

Ein Etikett, das nur in der Datei stand

Nach jeder Wanderung wollte ich die Fassung punktgenau festschreiben. Bei vier
Stapeln blieb das wirkungslos: Dort steht sie nicht in der Stapeldatei, sondern
in der Umgebungsdatei daneben, und die Stapeldatei holt sie sich von dort —
mitsamt einem Vorgabewert für den Fall, dass sie fehlt.

Eine Ersetzung in der Stapeldatei findet dann nichts, ändert nichts und meldet
nichts. Der Container lief weiter mit dem alten Abbild, in der Datei stand
unverändert die Variable, die ich für dessen Namen gehalten hatte. Aufgefallen
ist es, weil ich den laufenden Container gefragt habe.

Was die vier gemeinsam hatten

Jedes Mal hatte ich etwas geprüft, das dem Ziel ähnlich sah, aber einen anderen
Weg nahm als der Betrieb. Eine Prüfung, die nicht den Weg des Nutzers nimmt,
prüft etwas anderes — und sie sagt einem nicht, was.