2 min read

Im IT-Museum

Im IT-Museum
Photo by Hester Qiang / Unsplash

Ich bin tatsächlich in die Lage gekommen, Probleme mit einer Oracle 8i Datenbank beheben zu müssen. Der Kunde hatte eine sehr alte Software, auf die er sich über 20 Jahre verlassen konnte. Den Hersteller gab es schon lange nicht mehr und er hatte einen Supporter, der den Anwendungsserver in einer virtuellen Maschine installiert hatte, so dass das 32-bit System weiter in seinem Betrieb genutzt werden konnte. Soweit so gut. Das System tat seine Arbeit - wie gesagt für über 20 Jahre ohne Herstellersupport. Dann aber gab es eines Tages ein Problem und die Software wollte die komplexe Abrechnung nicht mehr erstellen. Es war 'Holland in Not'. Schnell mal eben eine neue Software kaufen und die Daten migrieren war zeitlich nicht drin. Also wurde ich gefragt, ob ich das Problem beheben könnte, denn ich hatte einst beim Hersteller gearbeitet.

Was war passiert? Anstatt, wie es 20 Jahre lang gelaufen war, die Abrechung zu erstellen, erschien eines Tages die Meldung

SQL-DB error detected: 000001631#ORA-01631: Max. Extents (300) in temporärem Segment von Tablespace SYSTEM erreicht

auf dem Bildschirm. Aus der Meldung wird sofort klar, dass die dem System zugrunde liegende Datenbank ein Problem hatte. Ausserdem ist anhand des Codes #ORA-* klar, dass es sich um eine Oracle-Datenbank handelt.

Was besagt diese Meldung? Sie besagt, dass die Speicherplatzverwaltung für die Tabelle oder den gesamten Tablespace ein Problem verursachte. Dabei bietet das Konzept der Tablespaces schon die Möglichkeit von Speicherproblemen, die auf heutigen Festplatten auf Grund der Kapazität nicht auftreten müssten. So kennt PostgreSQL auch keine Tablespaces. Oracle 8i ist wirklich sehr alt und bereits mit Oracle 9 wurde das Tablespace-Konzept deutlich verbessert.

Der Techniker, der sich auf die Suche nach dem Fehler macht, ist gleich mit mehreren Möglichkeiten konfrontiert, die den Fehler verursachen könnte. So kann die gemeldete Tabelle in den Extends beschränkt sein, oder es ist eine abhängige oder temporäre Tabelle beschränkt oder der Tablespace ist in den Extends beschränkt.

Eine Tabelle wird in einem Segment gespeichert. Das Segment umfasst ein oder mehrere Extends. Die genaue maximale Anzahl an Extents hängt von der Blockgröße ab. Bei einer 4K-Blockgröße ist das Limit besonders niedrig (oft nur 505 Extents pro Segment).

In Oracle 8 waren Tablespaces als Dictionary Managed Tablespaces definiert. Mit Oracle 8i wurden dann Locally Managed Tablesspace eingeführt. In meinem Fall, war dem Fehler nicht wirklich bei zu kommen. Letztlich habe ich einen neuen Locally Managed Tablespace angelegt und die betroffene Tabelle dorthin verschoben. Nachdem ich lange nach einer Lösung gesucht hatte, konnte das Problem damit behoben werden.