Как бросить Oracle LOB

Следующий список может использоваться для отображения объектов базы данных пользователя:

select object_name, object_type from user_objects;

Есть пара записей, где object_type это LOB.

Как эти объекты больших объектов могут быть отброшены в Oracle?

2 ответа

Решение

Один сценарий, где вы можете увидеть LOB в user_objects но присоединиться к user_lobs ничего не находит, если таблица уже была удалена, но находится в корзине.

create table t42 (my_clob clob);

table T42 created.

Как и ожидалось, запрос Джастина показывает вам столбец:

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.

Теперь запрос Джастина ничего не находит:

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

Но это все еще в 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   

И вы можете увидеть это в корзине:

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 все еще существует на диске и использует хранилище, которое, я думаю, вас беспокоит. Итак, чтобы ответить на ваш вопрос, чтобы действительно удалить LOB и освободить его хранилище, вам нужно очистить всю таблицу:

purge table t42;

table purged.

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

no rows selected

Интересно, что вы не увидите этого эффекта, если назовете сегмент LOB:

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

Повторяя шаги выше, запись пошла от user_objects после 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 

Конечно, хранилище все еще используется, и вам все еще нужно его очистить, оно выглядит немного более согласованным в словаре данных. Так что это похоже на (очень незначительную) ошибку, может быть, самое большее. Это может быть связано с поведением, упомянутым в записке о поддержке 394442.1.

Объект LOB будет удален, если и когда вы удалите таблицу, содержащую связанный столбец LOB, или удалите столбец LOB из этой таблицы. Вы можете увидеть, какой столбец поддерживает конкретный объект LOB, выполнив запрос DBA_LOBS, ALL_LOBS, или же USER_LOBS в зависимости от ваших привилегий.

Например

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 )

покажет вам, какую таблицу и какой столбец каждый из LOB объекты в вашей схеме поддерживает.

Другие вопросы по тегам