2013-08-21 11 views
7

La seguente query può essere utilizzato per elencare gli oggetti di database degli utenti:Come cadere Oracle LOB

select object_name, object_type from user_objects; 

Ci sono un paio di voci dove il tipo_oggetto è LOB.

In che modo questi oggetti LOB possono essere rilasciati in Oracle?

risposta

16

Uno scenario in cui è possibile vedere un LOB in user_objects ma il join in user_lobs non trova nulla se la tabella è già stata rilasciata, ma is in the recycle bin.

create table t42 (my_clob clob); 

table T42 created. 

Come previsto, la query di Justin si mostra la colonna:

select l.table_name, 
     l.column_name, 
     l.segment_name lob_name 
    from user_lobs l 
     join user_objects o 
     on(o.object_name = l.segment_name); 

TABLE_NAME COLUMN_NAME LOB_NAME      
----------- ----------- ------------------------------ 
T42   MY_CLOB  SYS_LOB0000133310C00001$$  

drop table t42; 

table T42 dropped. 

Ora interrogazione di Justin non trova nulla:

select l.table_name, 
     l.column_name, 
     l.segment_name lob_name 
    from user_lobs l 
     join user_objects o 
     on(o.object_name = l.segment_name); 

no rows selected 

ma è ancora in user_objects:

select object_name, object_type, status from user_objects 
where object_type like 'LOB%'; 

OBJECT_NAME     OBJECT_TYPE   STATUS 
------------------------------ ------------------- ------- 
SYS_LOB0000133328C00001$$  LOB     VALID 

A ND si può vedere nel cestino:

select * from user_recyclebin; 

OBJECT_NAME     ORIGINAL_NAME     OPERATION TYPE      TS_NAME      CREATETIME   DROPTIME    DROPSCN PARTITION_NAME     CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT  SPACE 
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ---------- 
SYS_IL0000133310C00001$$  SYS_IL0000133310C00001$$   DROP  LOB INDEX     USERS       2013-08-22:08:33:21 2013-08-22:08:33:21 1.0E+13         NO   NO   133310  133310  133310   0 
SYS_LOB0000133310C00001$$  SYS_LOB0000133310C00001$$  DROP  LOB      USERS       2013-08-22:08:33:21 2013-08-22:08:33:21 1.0E+13         NO   NO   133310  133310  133310   0 
BIN$5IUNXtWkUXLgQwEAAH9TlQ==$0 T42        DROP  TABLE      USERS       2013-08-22:08:33:21 2013-08-22:08:33:21 1.0E+13         YES  YES   133310  133310  133310   0 

Il LOB esiste ancora sul disco e sta usando lo stoccaggio, che credo sia quello che siete preoccupati. Quindi, per una sorta di rispondere alla tua domanda, a cadere davvero il LOB e rilasciare il suo stoccaggio è necessario per eliminare l'intera tabella:

purge table t42; 

table purged. 

select object_name, object_type, status from user_objects 
where object_type like 'LOB%'; 

no rows selected 

È interessante notare che non si vede questo effetto se il nome del segmento LOB:

create table t42 (my_clob clob) 
lob (my_clob) store as my_clob_segment; 

Ripetendo i passaggi precedenti, la voce è passata da user_objects dopo la drop.

drop table t42; 

table T42 dropped. 

select object_name, object_type, status from user_objects 
where object_type like 'LOB%'; 

no rows selected 

select * from user_recyclebin; 

OBJECT_NAME     ORIGINAL_NAME     OPERATION TYPE      TS_NAME      CREATETIME   DROPTIME    DROPSCN PARTITION_NAME     CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT  SPACE 
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ---------- 
BIN$5IUNXtWnUXLgQwEAAH9TlQ==$0 MY_CLOB_SEGMENT     DROP  LOB      USERS       2013-08-22:08:36:41 2013-08-22:08:36:41 1.0E+13         NO   NO   133316  133316  133316   0 
BIN$5IUNXtWoUXLgQwEAAH9TlQ==$0 T42        DROP  TABLE      USERS       2013-08-22:08:36:41 2013-08-22:08:36:41 1.0E+13         YES  YES   133316  133316  133316   0 
SYS_IL0000133316C00001$$  SYS_IL0000133316C00001$$   DROP  LOB INDEX     USERS       2013-08-22:08:36:41 2013-08-22:08:36:41 1.0E+13         NO   NO   133316  133316  133316   0 

Lo stoccaggio è ancora in uso, naturalmente, e si ancora bisogno di eliminare per liberarlo, l'aspetto è un po 'più consistente nel dizionario dei dati. Quindi questo sembra un bug (molto piccolo), forse, al massimo. Potrebbe essere correlato al comportamento indicato nella nota di supporto 394442.1.

+0

Grazie per la spiegazione dettagliata e le query di esempio – byneri

+1

+1. Molto bella. Grazie per la risposta concisa (e leggibile)! – spencer7593

3

L'oggetto LOB verrà eliminato se e quando si rilascia la tabella che contiene la colonna LOB associata o si rilascia la colonna LOB da quella tabella. Puoi vedere quale colonna supporta un particolare oggetto LOB interrogando DBA_LOBS, ALL_LOBS o USER_LOBS a seconda dei tuoi privilegi.

Per esempio

SELECT l.table_name, 
     l.column_name, 
     l.segment_name lob_name 
    FROM user_lobs l 
     JOIN user_objects o 
     ON(o.object_name = l.segment_name) 

vi mostrerà che cosa tavolo e quale colonna ciascuno dei LOB oggetti nei vostri supporti di schema.

+1

La query precedente ha restituito 0 righe per il mio utente. – byneri

+1

Anche 0 righe quando si esegue una query su all_lobs (anziché user_lobs). Non è possibile interrogare dba_lobs: "ORA-00942: tabella o vista non esiste" – byneri

Problemi correlati