Nach den Gesprächen mit den verschiedensten DBA`s denke ich, das es den Mythos gibt, das sich auf einer Oracle Datenbank der „recycle bin“ nicht automatisch leert. Das stimmt so nicht. Oracle hat sehr wohl dafür gesorgt, das es hier nicht zu Problemen kommt. Das Prinzip ist ähnlich der Fast Recovery Area, wo im Falle eines „Space Pressure“ nicht mehr benötigte Elemente gelöscht werden.
Hier ein kurzes Beispiel:Ich habe eine Tabelle mit einem Index im Tablespace EXP_TEST erzeugt, welche zusammen in etwa 300MB haben.
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME MB ------------------------------ ---------- ---------------- ------- EXP_TEST TABLE EXP_TEST 272 EXP_TEST_IDX INDEX EXP_TEST 25
Man kann auch gut erkennen das mein Tablespace (autoextend off) gut gefüllt ist.
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT ------------------------------ ---------- --------------- ------------ EXP_TEST 38144 38400 99.3333333
Auch die dba_free_space zeigt an, das nicht wirklich viel freier Speicherplatz vorhanden ist.
TABLESPACE_NAME MB BLOCKS ------------------------------ ------- ---------- EXP_TEST 2 256
Mein recycle bin ist derzeit leer.
SQL> select count(*) from user_recyclebin; COUNT(*) ---------- 0
Was passiert jetzt wenn ich die Tabelle lösche.
SQL> drop table exp_test; Table dropped.
Meine Objekte haben sich wie erwartet in den recycle bin verschoben.
SQL> select object_name,original_name,space from user_recyclebin; OBJECT_NAME ORIGINAL_NAME SPACE ------------------------------ -------------------------------- ---------- BIN$1uIwt6Cu9EbgQKjBaRlQTw==$0 EXP_TEST 34816 BIN$1uIwt6Ct9EbgQKjBaRlQTw==$0 EXP_TEST_IDX 3200
Oracle rechnet den Platz der Objekte automatisch in der dba_free_space hinzu.
TABLESPACE_NAME MB BLOCKS ------------------------------ ------- ---------- EXP_TEST 2 8 EXP_TEST 2 256 EXP_TEST 208 1024 EXP_TEST 87 128
Ebenfalls gut zu erkennen ist, das in der Tabespace Auswertung der Platz als frei angzeigt.
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT ------------------------------ ---------- --------------- ------------ EXP_TEST 128 38400 .333333333
Nur die user_segments zeigt mir den Platz noch als belegt an.
SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME MB ------------------------------ ---------- ------------------------------ ------- BIN$1uIwt6Cu9EbgQKjBaRlQTw==$0 TABLE EXP_TEST 272 BIN$1uIwt6Ct9EbgQKjBaRlQTw==$0 INDEX EXP_TEST 25
Was passiert jetzt wenn ich wieder ein Objekt in diesem Tablespace anlege. Für diesen Zweck nehme ich mir die DEPARTMENTS Tabelle des HR Benutzer und erzeuge ein Abbild von ihr in meinem EXP_TEST Tablespace.
create table EXP_PROD tablespace EXP_TEST as select * from departments;
Die Tabelle ist nun auch in der user_segments zu sehen, die grösse reicht aber nicht aus um ein „Space Pressure“ Ereignis auszulösen.
SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME MB ------------------------------ ---------- ------------------------------ ------- BIN$1uIwt6Cu9EbgQKjBaRlQTw==$0 TABLE EXP_TEST 272 BIN$1uIwt6Ct9EbgQKjBaRlQTw==$0 INDEX EXP_TEST 25 EXP_PROD TABLE EXP_TEST 0
Befüllen wir diese nun Schrittweise mit Daten, um den Tablespace an sein maximum zu befüllen.
insert into EXP_PROD select * from EXP_PROD;
Mein Tablespace hat nur eine maximale grösse von 300M, komme ich nun in einen Bereich wo der Platz im Tablespace ausgeht so löscht Oracle automatisch Objekte im recycle bin, wobei er zuerst mit Index Objekten angefangen wird um Benutzer Daten solang wie möglich aufzubewahren.
SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME MB ------------------------------ ---------- ------------------------------ ------- BIN$1uIwt6Cu9EbgQKjBaRlQTw==$0 TABLE EXP_TEST 272 BIN$1uIwt6Ct9EbgQKjBaRlQTw==$0 INDEX EXP_TEST 25 EXP_PROD TABLE EXP_TEST 2
Nach ein paar inserts sehen wir, das wir ein Objekt weniger haben und wie erwartet zuerst der Index aus dem recycle bin gelöscht worden ist.
SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME MB ------------------------------ ---------- ------------------------------ ------- BIN$1uIwt6Cu9EbgQKjBaRlQTw==$0 TABLE EXP_TEST 272 EXP_PROD TABLE EXP_TEST 25
Mache ich nun weiter, wird auch die Tabelle aus dem recycle bin entfernt.
SQL> r 1* insert into EXP_PROD select * from EXP_PROD 1769472 rows created. SQL> commit; Commit complete. SQL> @selseg SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME MB ------------------------------ ---------- ------------------------------ ------- EXP_PROD TABLE EXP_TEST 104
Wie sehen also das hinter diesem Feature etwas mehr steht als nur die Objekte in den recycle bin zu verschieben.
Wie immer Freue ich mich über Kommentare