Hallo, mein Name ist Christoph Jahn. Ich bin ein Softwareentwickler und Fotograf aus Leipzig.

ORA-01562: Failed to extend rollback segment.

2007-07-09

Fehlermeldungen

Bleiben wir doch gleich bei den Oracle Fehlermeldungen. Beim Massenimportieren von Daten sollte man nicht nur seinen Festplattenspeicher im Auge behalten, sondern auch den Füllstand seiner Datatables. Für den meinen letzten Import von Daten hatte ich die spezielle Anforderung, dass nur Teile der Daten in einer Tabelle ausgetauscht werden sollten. Das Problem dabei ist, dass die alten Daten erst herausgelöscht werden müssen, was bei großen Tabellen recht schnell sehr große Archivelogs erzeugt.

Rollbacktablespace

Zudem reicht eine normale Rollbackdatendateigröße für diesen Lösch- und Importvorgang häufig nicht aus, was unter anderem auch den Fehler ”ORA-01562: Failed to extend rollback segment” auslöst. Zur Umgehung des Problems habe ich für den Import einen eigenen Tablespace mit viel Platz eingerichtet und diesen einem Rollbacksegment zugeordnet. Den DELETE-Statements habe ich dann den Befehl …

SET TRANSACTION USE ROLLBACK SEGMENT RBSIMPORT;

… vorangestellt, der dieser Transaktion explizit das Rollbacksegment “RBSIMPORT” zuweist. Soweit so gut.

DELETE stückeln

Jetzt ist es aber häufig so, dass auf dem Datenbankrechner nicht genug Speicherplatz auf der Festplatte für große Rollback-, Archivelog-, Löschaktionen zur Verfügung steht. Ist das der Fall, dann kann man sich noch behelfen und die Löschung auf mehrere Durchgänge aufteilen. Am einfachsten geht dies über ein “SELECT” auf die Daten mit den Schlüsselfeldern und einer Einschränkung auf eine Menge an Datensätzen. Diese reduzierte Menge an Daten kann jetzt einem “DELETE” übergeben und danach durch ein “COMMIT” abgeschlossen werden. Diese Löschung wird dann einfach durchgeführt, bis keine Daten mehr gelöscht werden. Ok, zu viele Worte, …. ein Beispiel:

delete from

  tabelle where

(key1, key2, key3) in (

  select

    key1, key2, key3

  from tabelle

    where

      key1 = 'beispiel' and rownum < 250001

  );

Das löscht die Tabelle “TABELLE” in handlichen 250.000er Zeilenpäckchen mit den unteren Einschränkungen. Ein “COMMIT” danach nicht vergessen.