Der Recycle Bin und der Automatische Purge


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

Hinterlasse einen Kommentar