【问题标题】:How to drop Oracle LOB如何删除 Oracle LOB
【发布时间】:2013-08-24 09:59:32
【问题描述】:

以下查询可用于列出用户的数据库对象:

select object_name, object_type from user_objects;

object_type 为 LOB 的条目有几个。

如何在 Oracle 中删除这些 LOB 对象?

【问题讨论】:

    标签: oracle lob


    【解决方案1】:

    您可以在 user_objects 中看到 LOB 但与 user_lobs 的联接找不到任何内容的一种情况是,如果表已被删除,但 is in the recycle bin

    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 中提到的行为有关。

    【讨论】:

    • 感谢您的详细解释和示例查询
    • +1。很不错。感谢您提供简洁(易读)的答案!
    【解决方案2】:

    当您删除包含关联 LOB 列的表或从该表中删除 LOB 列时,将删除 LOB 对象。您可以通过查询DBA_LOBSALL_LOBSUSER_LOBS 来查看特定 LOB 对象支持的列,具体取决于您的权限。

    例如

    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 对象支持的表和列。

    【讨论】:

    • 以上查询为我的用户返回了 0 行。
    • 查询 all_lobs(而不是 user_lobs)时也是 0 行。无法查询 dba_lobs:“ORA-00942:表或视图不存在”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2013-05-08
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多