web-dev-qa-db-ja.com

Oracle LOBを削除する方法

次のクエリを使用して、ユーザーのデータベースオブジェクトを一覧表示できます。

select object_name, object_type from user_objects;

Object_typeがLOBであるエントリーがいくつかあります。

OracleでこれらのLOBオブジェクトをどのように削除できますか?

8
byneri

LOBをuser_objectsに表示できるが、user_lobsへの結合で何も検出されない場合の1つのシナリオは、テーブルが既に削除されているが、 ごみ箱にある の場合です。 。

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;

上記の手順を繰り返すと、エントリはdropの後にuser_objectsから移動しています。

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で言及されている動作に関連している可能性があります。

18
Alex Poole

関連するLOB列を含むテーブルを削除するか、そのテーブルからLOB列を削除すると、LOBオブジェクトが削除されます。特定のLOBオブジェクトがサポートする列を確認するには、DBA_LOBSALL_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オブジェクトがサポートするテーブルと列を示します。

3
Justin Cave