RECYCLE BIN

Il Recycle Bin è una tabella del Dizionario Dati ed ogni user ha un proprio Recycle Bin, pertanto gli oggetti droppati continuano ad occupare spazio all'interno del tablespace in cui sono definiti diminuendo quindi la quota associata a ciascuno user.
E' un contenitore logico non fisico. Non ha un tablespace o datafile.
Quando viene effettuata una "drop table" la tabella e tutti i sui oggetti associati rimangono nel datafiles di riferimento ma cambia il nome in "BIN$unique_id$version".
Se invece si effettua il comando "drop table...purge" la tabelle e i suoi oggetti associati vengono cancellati dal datafile e quindi non c'è più un riferimento nel Recycle Bin.
Gli oggetti nel recycleBin rimangono nel tablespace fino a quando non viene effettuata una PURGE dall'utente o viene automaticamente effettuato da Oracle per superamento della quota dell'user nel tablespace se:
- crea una nuova tabella o inserisce dati 
- il tablespace deve estendere le dimensioni del file per adattarsi alle operazioni di creazione / inserimento.


Per vedere se è abiltato

SQL> show parameter recy
buffer_pool_recycle                  string   
db_recycle_cache_size                integer  0

recyclebin                           string   on

Per visualizzare gli oggetti nel cestino eseguire una delle due query:

select * from USER_RECYCLEBIN;
oppure
select * from RECYCLEBIN;

RECYCLEBIN è un sinonimo di USER_RECYCLEBIN.

Le utenze con privilegi da DBA possono vedere il cestino di tutti interrogando la vista DAB_RECYCLEBIN.

ATTENZIONE
Quando viene eseguito il drop Tablespace tutti gli oggetti del tablespace non vengono messi nel cestino ma direttamente cancellati (purge) e tutti gli oggetti presenti nei cestini vengono cancellati.
Quando viene eseguito drop user tutti i suoi oggetti non sono posti nel recycle bin e il recycle bin è svuotato.

Le tabelle droppate vengono identificate all'interno del Recycle Bin  da un nome univoco. Ciò permette di individuare tabelle con lo stesso nome e create in momenti diversi (dallo stesso user) all'interno cestino. 
Ad esempio se viene droppata una tabella, poi ricreata e successivamente dopprata nel recyvce bin abbiamo due righe con due id univoci.

Step 1
Drop Table HR.EMP_1;

Step 2 
Create Table EMP_1 as select * from HR.DEPARTMENTS;

Step 3
Drop Table EMP_1;

Step 4
select * from RECYCLEBIN where original_name ='EMP_1'




La naming convention è la seguente BIN$unique_id$version dove unique_id è un identificativo di 26 caratteri univo all'interno del database e version è una versione assegnata dal database.

Per visualizzare il contenuto di una tabella presente nel Recycle Bin basta eseguire una query sul nome dell'oggetto.

select * from "BIN$HWUbLsqMRhSJjgSErzcT3A==$0";

Il Recycle Bin è abilitato di defualt e può essere disabilitato a livello di sessione o su tutto il db. Se disabilitato e si esegue un drop table, le tabelle droppate e i suoi oggetti andranno persi e per recuperarli occorrerà usare altri metodi come il recovery da backup. Inoltre i dati presenti nel cestino prima di essere disabilitato non saranno cancellati.  

SQL> alter session set recyclebin=on|off;

Per un database che utilizza spfile è possibile abilitarlo o disabilitalo con la seguente istruzione.
SQL> ALTER SYSTEM SET RECYCLEBIN=OFF|ON SCOPE=SPFILE;

Per un database che utilizza INIT.ORA aggiungere il parametro di inizializzazione
RECYCLEBIN=ON|OFF

La modifica del parametro è immediata.
Il parametro recyclebin è un parametro di inizializzazione e pertanto è definito all'interno del file testo INT.ORA.
I parametri sono visibili col comando seguente.
SQL> show parameter file; 

Se si vuole svuotare l'intero cestino di uno user e quindi recuperare spazio eseguire il comando.
SQL > PURGE RECYCLEBIN;

Se si vuole cancellare una sola tabella:
SQL> PURGE TABLE <nome_tabella>;
oppure
SQL> PURGE TABLE BIN$unique_id$version;

Se volessimo invece svuotare tutti i cestini de database occorre avere i privilegi di SYSDBA ed eseguire il comando.
SQL>PURGE dba_recyclebin;

Per svuotare tutti gli oggetti di un tablespace
SQL> PURGE TABLESPACE <nome_tablespace>;

Supponiamo di avere droppato più volte una tabella e che non sia più presente nel db

select original_NAME ,DROPTIME , DROPSCN
from user_recyclebin


ORIGINAL_NAME                    DROPTIME               DROPSCN
-------------------------------- ------------------- -------------------------------
DOPO_SNAPSHOT                    2019-04-01:17:12:58   17179691
DOPO_SNAPSHOT                    2019-04-01:17:12:39   17179649
DOPO_SNAPSHOT                    2019-04-01:17:12:22   17179590
DOPO_SNAPSHOT                    2019-03-14:17:52:00   16235729


SQL> purge table DOPO_SNAPSHOT;

Questo comando cancella dal recyclebin la riga che ha il valore della colonna DROPSCN più vecchio.

ORIGINAL_NAME                    DROPTIME               DROPSCN
-------------------------------- ------------------- -------------------------------
DOPO_SNAPSHOT                    2019-04-01:17:12:58   17179691
DOPO_SNAPSHOT                    2019-04-01:17:12:39   17179649
DOPO_SNAPSHOT                    2019-04-01:17:12:22   17179590

Post popolari in questo blog

Create e Drop Pluggable Database

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione