2013-08-21 7 views
7

Następująca kwerenda może być stosowany do listy obiektów bazy danych użytkownika:Jak spadać Oracle LOB

select object_name, object_type from user_objects; 

Istnieje kilka wpisów, gdzie typ_obiektu jest LOB.

Jak te obiekty LOB można upuścić w Oracle?

Odpowiedz

16

Jeden scenariusz, w którym można zobaczyć LOB w user_objects, ale dołączenie do user_lobs niczego nie znajduje, jeśli tabela została już upuszczona, ale is in the recycle bin.

create table t42 (my_clob clob); 

table T42 created. 

Zgodnie z oczekiwaniami, zapytanie Justin pokazuje kolumnę:

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. 

Teraz zapytanie Justina nie znaleźć niczego:

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 

Ale to jeszcze w 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 można zobaczyć go w koszu:

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 

lob nadal istnieje i jest na dysku przy użyciu pamięci masowej, które myślę, że to, co jesteś zaniepokojony. Tak jakby odpowiedzieć na to pytanie, naprawdę upuść LOB i zwolnić jego przechowywanie trzeba oczyścić całą tabelę:

purge table t42; 

table purged. 

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

no rows selected 

Co ciekawe nie widać tego efektu, jeśli nazwać segment LOB:

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

Powtarzając powyższe czynności, wpis upadł z user_objects po 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 

składowanie jest nadal używany i oczywiście trzeba jeszcze oczyścić, aby go uwolnić, to po prostu wygląda nieco bardziej spójne w słowniku danych. Wygląda to jak (bardzo niewielki) błąd, może, co najwyżej. Może to być związane z zachowaniem, o którym mowa w uwadze pomocniczej 394442.1.

+0

Dzięki za szczegółowe wyjaśnienia i przykładowe zapytania – byneri

+1

+1. Bardzo dobrze. Dziękuję za zwięzłą (i czytelną) odpowiedź! – spencer7593

3

Obiekt LOB zostanie usunięty, jeśli i po upuszczeniu tabeli zawierającej powiązaną kolumnę LOB lub upuszczeniu kolumny LOB z tej tabeli. Możesz zobaczyć, która kolumna obsługuje konkretny obiekt LOB, wyszukując DBA_LOBS, ALL_LOBS lub USER_LOBS w zależności od twoich uprawnień.

Na przykład

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) 

pokaże, co kolumna tabeli i co każdy z LOB obiektów na podporach schematu.

+1

Powyższe zapytanie zwróciło 0 wierszy dla mojego użytkownika. – byneri

+1

Również 0 wierszy podczas sprawdzania all_lobs (zamiast user_lobs). Nie można wysłać zapytania do dba_lobs: "ORA-00942: tabela lub widok nie istnieje" – byneri

Powiązane problemy