Interessantes zum Recycle Bin-Konzept

01.
August
2006
Veröffentlicht von: Matthias Meyer

Haben Sie bereits auf 10g umgestellt? Falls ja, haben Sie sich vielleicht schon einmal gewundert, warum Sie nach dem Löschen einer Tabelle keinen freien Speicherplatz gewonnen haben, aber dafür plötzlich Objekte mit Namen BIN$c7WXyzMkT1q9DglxITmbRw==$0 (oder so ähnlich) vorhanden sind?

Haben Sie bereits auf 10g umgestellt? Falls ja, haben Sie sich vielleicht schon einmal gewundert, warum Sie nach dem Löschen einer Tabelle keinen freien Speicherplatz gewonnen haben, aber dafür plötzlich Objekte mit Namen BIN$c7WXyzMkT1q9DglxITmbRw==$0 (oder so ähnlich) vorhanden sind?

Das liegt an einem in 10g eingeführten Feature names RECYCLE BIN.

Durch einen (alten) DROP TABLE-Befehl wird eine Tabelle nicht mehr - wie in den vorangegangenen Versionen - endgültig gelöscht und der Speicherplatz sofort freigegeben, sondern die Tabelle und alle darauf liegenden Indizes (inkl. Constraints) werden umbenannt und dem Recycle Bin zugeordnet. Der Inhalt des Recycle Bin wird somit weiter zur Quota des Benutzers gezählt.

Views zu Recycle Bin

Folgende Befehle zeigen den Inhalt des eigenen "Papierkorbs" an:

SELECT * FROM recyclebin;
-- oder
SELECT * FROM user_recyclebin;
-- oder
SHOW RECYCLEBIN

Und über folgenden SELECT kann sich der Administrator den Recycle Bin der gesamten Datenbank anzeigen lassen:

SELECT * FROM dba_recyclebin;

 

Einsatz des Recycle Bin

Im ersten Beispiel soll die Tabelle EMP gelöscht und anschließend wieder hergestellt werden.

DROP TABLE emp;

SELECT object_name, object_type FROM user_objects
     WHERE object_name LIKE 'BIN$%';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
BIN$c7WXyzMkT1q9DglxITmbRw==$0 INDEX
BIN$vvz7kZGhSoqCVWbdTtoSbQ==$0 TABLE

Hinweis:

Ab Version 10.2.0.4 werden die gelöschten Objekte nicht mehr in der USER_OBJECTS-View angezeigt. Gesehen werden sie nur noch in der View USER_RECYCLEBIN oder über:

SHOW RECYCLEBIN

ORIGNAME_PLUS_SHOW_RECYC OBJECTNAME_PLUS_SHOW_RECYC     OBJTYPE_PLUS_SHOW_RECYC 
DROPTIME_PLUS_SHOW_
------------------------ ------------------------------ ----------------------- -------------------
EMP                      BIN$vvz7kZGhSoqCVWbdTtoSbQ==$0 TABLE                   2006-05-26:09:42:33

FLASHBACK TABLE emp TO BEFORE DROP; 
-- die Tabelle wird unter ihrem alten Namen wieder hergestellt.

Indizes und Constraints bekommen beim Flashback ihren alten Namen nicht automatisch wieder. Sie müssen extra umbenannt werden:

ALTER INDEX "BIN$c7WXyzMkT1q9DglxITmbRw==$0" RENAME TO pk_emp;

ALTER TABLE emp RENAME CONSTRAINT "BIN$c7WXyzMkT1q9DglxITmbRw==$0" 
       TO pk_emp;

Im zweiten Beispiel wird die Tabelle EMP endgültig gelöscht und der Speicherplatz freigegeben.

DROP TABLE emp PURGE;

-- alternativ
DROP TABLE emp;
PURGE TABLE emp;
-- oder
PURGE RECYCLEBIN; 
-- alle Objekte aus dem Benutzer-Papierkorb werden endgültig gelöscht

 

Ausschalten des Recycle Bin

Vielleicht erscheint dem ein oder anderen Benutzer das Recycle Bin-Konzept überflüssig und er möchte gerne auf dieses Feature verzichten. Da aus Gewohnheit die PURGE-Option beim Löschen aber vergessen wird und der "Papierkorb" somit noch einmal separat geleert werden muss, kann dieses Verhalten auch ausgeschaltet werden.

In Version 10g Release 1 wird dies - noch etwas umständlich - über einen undokumentierten Initialisierungsparameter gemacht:

CONN sys AS sysdba

SELECT a.ksppinm, b.ksppstvl, b.ksppstdf 
       FROM x$ksppi a, x$ksppcv b
      WHERE a.indx = b.indx
        AND a.ksppinm LIKE '%recycle%'
      ORDER BY a.ksppinm;

ALTER SYSTEM SET "_recyclebin" = FALSE;

In Version 10g Release 2 ist das ganze vereinfacht worden und wird nun über einen offiziellen Parameter gesteuert:

SHOW PARAMETER recyclebin
ALTER SESSION SET recyclebin = OFF; 
-- oder
ALTER SYSTEM  SET recyclebin = OFF;

 

Weitere Tipps zu Recycle Bin

  • Tabellen der Benutzer SYS und SYSTEM werden nicht in den Recycle Bin verschoben."      
  • Beim Löschen von Tablespaces oder Benutzern werden die Tabellen nicht in den Recycle Bin verschoben."      
  • SELECT-Zugriffe sind auf die Tabellen des Recycle Bin unter dem vom System-generierten Namen möglich. DDL- und DML-Anweisungen sind nicht zulässig und ergeben den Fehler ORA-38301."      
  • Die Objekte im Recycle Bin werden automatisch gelöscht, wenn die Quota eines Benutzers ausgeschöpft wäre oder ein Tablespace erweitert werden müsste, weil kein Platz mehr verfügbar ist."  
  • Beim Wiederherstellen einer Tabelle müssen eventuelle Fremdschlüssel manuell erzeugt werden."      
  • Werden ab Version 10.2.0.4 diverse BIN$...-Indizes in den xxx_OBJECTS-Views angezeigt, handelt es sich dabei um noch nicht umbenannte Indizes von wiederhergestellten Tabellen.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.