programing

Oracle LOB를 삭제하는 방법

powerit 2023. 11. 4. 13:20
반응형

Oracle LOB를 삭제하는 방법

다음 쿼리를 사용하여 사용자의 데이터베이스 개체를 나열할 수 있습니다.

select object_name, object_type from user_objects;

object_type이 LOB인 항목이 몇 개 있습니다.

Oracle에서는 이러한 LOB 개체를 어떻게 삭제할 수 있습니까?

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스키마에서 지원하는 개체입니다.

언급URL : https://stackoverflow.com/questions/18367444/how-to-drop-oracle-lob

반응형