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.
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;
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
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;
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.