`

回收lob占用的空间

阅读更多

感谢:

http://halisway.blogspot.com/2007/06/reclaiming-lob-space-in-oracle.html

http://stackoverflow.com/questions/18367444/how-to-drop-oracle-lob

 

LOB字段是单独存储的,而且用delete是无法回收lob占用的空间。

SQL>  create table lob_test (id number, data blob);

 

Table created.

 

-- 向lob_test中导入数据

SQL> @lobload

PL/SQL procedure successfully completed.

 

SQL> select segment_name, segment_type, bytes from user_segments;

 

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

LOB_TEST                       TABLE                                       131072

SYS_IL0000316067C00002$$       LOBINDEX                   131072

SYS_LOB0000316067C00002$$      LOBSEGMENT          134217728

 

-- 现在可以看到LOB是单独存储的

 

SQL> delete from lob_test;

 

500 rows deleted.

 

SQL> commit;

 

Commit complete.

 

SQL> select segment_name, segment_type, bytes from user_segments;

 

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

LOB_TEST                       TABLE                                       131072

SYS_IL0000316067C00002$$       LOBINDEX                    327680

SYS_LOB0000316067C00002$$      LOBSEGMENT          134217728

-- delete后,lob占用的空间没有释放

-- 再次导入

SQL> @lobload

SQL> select segment_name, segment_type, bytes from user_segments;

 

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

LOB_TEST                       TABLE                                       131072

SYS_IL0000316067C00002$$       LOBINDEX                    393216

SYS_LOB0000316067C00002$$      LOBSEGMENT          260046848

-- lob对应的segment 继续增长

-- 再次删除

 

SQL> delete from lob_test;

500 rows deleted.

 

SQL> commit;

Commit complete.

 

SQL> select segment_name, segment_type,   bytes from user_segments;

 

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

LOB_TEST                       TABLE                                       131072

SYS_IL0000316067C00002$$       LOBINDEX                    655360

SYS_LOB0000316067C00002$$      LOBSEGMENT          260046848

 

 

SQL> alter table lob_test modify lob(data) (shrink space);

 

Table altered.

 

SQL> select segment_name, segment_type, bytes from user_segments;

 

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

LOB_TEST                       TABLE                  131072

SYS_IL0000316067C00002$$       LOBINDEX               655360

SYS_LOB0000316067C00002$$      LOBSEGMENT              65536

 

SQL> alter table lob_test modify lob(data) (shrink space);

 

Table altered.

 

SQL> select segment_name, segment_type, bytes from user_segments;

 

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

LOB_TEST                       TABLE                                           131072

SYS_IL0000316067C00002$$       LOBINDEX                       655360

SYS_LOB0000316067C00002$$      LOBSEGMENT              65536

 

--使用alter后 lob占用的空间被回收。

 

注意一

:在drop表的时候,如果不加purge ,lob segment一样不会被删除

 

删除lob_test前:

SQL> select segment_name, segment_type, bytes from user_segments;

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

LOB_TEST                       TABLE                                       131072

SYS_IL0000316067C00002$$       LOBINDEX                   655360

SYS_LOB0000316067C00002$$      LOBSEGMENT          134217728

 

SQL> drop table lob_test;

Table dropped.

 

SQL> select segment_name, segment_type, bytes from user_segments;

 

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

BIN$+oFtu0VUcIzgQH+HqwZhEw==$0 TABLE                    131072

SYS_IL0000316067C00002$$       LOBINDEX                    655360

SYS_LOB0000316067C00002$$      LOBSEGMENT          134217728

 

依然可以看到lob字段,证明不加purge是不法释放lob segment的

 

在回收站中,清理lob_test表

SQL> purge table lob_test;

Table purged.

 

SQL> select segment_name, segment_type, bytes from user_segments;

no rows selected

 

证明使用purge可以释放lob segment。

 

注意二:

一开始的建表语句是:

 create table lob_test (id number, data blob);

如果,建表时指定lob的segment,在drop不加purge时,lob的segment可以直接被删除,放入回收站中。

create table lob_test22(id number, data blob)

lob (data) store as data_blob_segment; 

 

 

SQL> select segment_name, segment_type, bytes from user_segments;

 

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

LOB_TEST22                     TABLE                                131072

SYS_IL0000316073C00002$$       LOBINDEX               131072

DATA_BLOB_SEGMENT              LOBSEGMENT          134217728

 

SQL> drop table lob_test22;

 

Table dropped.

 

SQL> select segment_name, segment_type, bytes from user_segments;

 

SEGMENT_NAME                   SEGMENT_TYPE            BYTES

------------------------------ ------------------ ----------

BIN$+oFtu0VWcIzgQH+HqwZhEw==$0 TABLE                     131072

SYS_IL0000316073C00002$$       LOBINDEX                      131072

BIN$+oFtu0VVcIzgQH+HqwZhEw==$0 LOBSEGMENT          134217728

 

SQL> select object_name, ORIGINAL_NAME from user_recyclebin;

 

OBJECT_NAME                    ORIGINAL_NAME

------------------------------ --------------------------------

SYS_IL0000316073C00002$$            SYS_IL0000316073C00002$$

BIN$+oFtu0VVcIzgQH+HqwZhEw==$0 DATA_BLOB_SEGMENT

BIN$+oFtu0VWcIzgQH+HqwZhEw==$0 LOB_TEST22

 

附:

-bash-3.2$ cat lobload.sql 

DECLARE

  src_file      BFILE := bfilename('MY_DIR', 'data.dat');

  dst_file      BLOB;

  lgh_file      BINARY_INTEGER;

  cur_id        NUMBER(10);

BEGIN

  FOR i IN 1..500

  LOOP

  if (mod (i,10) = 0) then

   dbms_output.put_line(i);

  end if;

    INSERT INTO lob_test22(id,data) VALUES(lob_test_seq.nextval,empty_blob()) 

          RETURNING id into cur_id;

    commit;

    -- lock record

    SELECT data INTO dst_file FROM lob_test22 WHERE id=cur_id FOR UPDATE;

 

    dbms_lob.fileopen(src_file, dbms_lob.file_readonly);

    lgh_file := dbms_lob.getlength(src_file);

    dbms_lob.loadfromfile(dst_file, src_file, lgh_file);

    dbms_lob.fileclose(src_file);

  END LOOP;

END;

/

 

--这里的MY_DIR 是指数据库中的directory。如果使用create directory my_dir as '/tmp'; 那么这里就要求必须使用大写的MY_DIR。

 

移动LOB字段的哦其他表空间:

ALTER TABLE CENTER_ADMIN.NWS_NEWS 
MOVE LOB(ABSTRACT) 
STORE AS (TABLESPACE lob_test);

分享到:
评论

相关推荐

    ORACLE LOB大对象处理

    - 空间回收:使用`DBMS_SPACE`或`DBMS_RECYCLEBIN`管理已删除LOB占用的空间。 6. **LOB与索引** 对LOB字段建立索引需要特别注意,因为它们的大小可能导致性能问题。可以选择使用位图索引或快速全扫描索引。 7. *...

    释放硬盘空间

    段空间管理涉及对特定类型数据(如表、索引、LOB等)的空间分配和回收;而表空间管理则是在更高层面上进行,涉及整个数据库内不同表空间的分配和使用策略。 ### 二、TRUNCATE语句:快速释放空间 当需要释放Oracle...

    oracle删除哪些内容可以减少USERS01.DBF数据文件的大小

    这种方法直接减少了数据文件所占用的空间。 - **清空表:** 使用`TRUNCATE TABLE`命令可以快速清空表中的所有数据,但不会改变表本身的结构。这有助于回收已分配但未使用的空间。 - **删除段:** 在某些情况下,可能...

    ORACLE 10G 学习资源

    自由空间区域是未被占用的空间,用于未来的更新和插入操作。 初始化事务槽(INITRANS)指定了在创建表或索引时预先分配的事务槽数量,而最大事务槽(MAXTRANS)则定义了块中可以分配的最大事务槽数量。PCTFREE参数...

    CHAP08.rar_SQL_Server_SQL_

    - 当数据被删除,其占用的空间不会立即回收,而是标记为“已删除”,形成所谓的“空洞”。边界标志法帮助跟踪这些空洞的范围,便于后续插入操作使用。 - 边界标志法还涉及到分配单元(Allocation Units),这是SQL...

    oracle优化笔记

    反向键索引用于减少索引的空间占用,并且在某些情况下能提高性能。 ```sql create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k next 200k pctincrease 0 maxextents 50) tablespace...

    Oracle数据库管理员指南-管理表-中文版.pdf Administrator's Guide Oracle Managing Tables

    虚拟列通过计算表达式来存储值,它们并不占用存储空间,因为不能显式写入虚拟列。此外,还需要考虑表的存储位置和是否使用并行创建表、NOLOGGING、表压缩等选项。 创建表之后,可以使用SQL语句或Oracle大容量装载...

    收缩数据库不变小的解决方法

    如果存在未删除的临时表或者长时间运行的事务,它们占用的空间可能无法被收缩。确保所有临时对象已清除,且没有阻塞的事务。 5. **大对象(LOB)数据**: TEXT、IMAGE、NVARCHAR(MAX)、VARBINARY(MAX)等大对象...

    oracle动态性能表

     你也可以使用v$sysstat数据通过查询v$system_event视图来检查资源消耗和资源回收。 V$SYSSTAT中的常用统计  V$SYSSTAT中包含多个统计项,这部分介绍了一些关键的v$sysstat统计项,在调优方面相当有用。下列按...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    mssql 微软 只能能运行在windows平台,体积比较庞大,占用许多系统资源, 但使用很方便,支持命令和图形化管理,收费。 中型企业 Mysql 甲骨文 是个开源的数据库server,可运行在多种平台, 特点是响应速度特别快,...

    最全的oracle常用命令大全.txt

    2、查看表空间物理文件的名称及大小 select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; 3、查看回滚段名称及大小 ...

Global site tag (gtag.js) - Google Analytics