Korrupte Blöcke in LONG Feldern ohne Backup behoben
Christian Peters ( Salzburg AG ) zur Problemstellung
Bei einer unserer Oracle Datenbanken wurden einige defekte Blöcke in einer Tabelle mit LONG Datentyp erkannt. Da diese Blöcke erst nach längerer Zeit aufgefallen waren, gab es keine fehlerfreien Backup-Versionen mehr - einzig ein älterer Export stand noch zur Verfügung. Wir zogen Christian Pfundtner von DB Masters zu rate - und dieser reagierte äußerst rasch, kompetent und sehr erfolgreich.
Details zur Problemstellung
In einer Tabelle mit einer LONG Spalte waren einige korrupte Oracle Datenblocks. Bei diesem Datentyp gibt es viele Einschränkungen - unter anderem funktioniert das Package DBMS_REPAIR nicht, und auch einige Möglichkeiten wie "SKIP CORRUPT BLOCKS" Events schlagen bei LONG fehl. Ein weiteres Problem ist, dass man Tabellen mit LONG Feldern nicht einfach mit CREATE TABLE AS SELECT "sichern" kann. Wir mussten ein eigenes Programm schreiben, das die nicht korrupten Daten aus der Tabelle rettet und feststellt welche Datensätze die Fehler enthalten. Diese Datensätze wurden letztlich vom Export gewonnen und mit den geretteten Daten zusammengesetzt. Als letzte Hürde mussten die korrupten Blöcke überschrieben werden, damit wieder gültige, fehlerfreie Backups möglich sind.
Christian Pfundtner von DB Masters zur Aufgabenstellung
Leider werden LONG RAW Datentypen noch in zu vielen Applikationen genutzt - Oracle hat seit Oracle 6 kein einziges neues Feature mit LONG Support ausgestattet und seit Oracle 8 gibt es mit den LOBs ja eine sinnvolle und deutlich bessere Alternative. Die größte Hürde war jedoch das Problem, dass man LONG RAWs auch nicht mittels INSERT AS SELECT kopieren kann - wir mussten ein eigenes PL/SQL Programm schreiben, das die Daten entsprechend Record orientiert transportiert hat. Zum Glück konnten wir feststellen, dass kein LONG mehr als 30k lang war (das Limit von PL/SQL sind 32k).