「oracle 实验」用Shrink Space收缩Oracle数据段|原理解析
一、表的增长方式
当表被创建后,随着记录的不断插入,组成表的区间会被填满,如果启用了自动扩展,则当区间填满后,会分配新的区间。假定高水
位线随着记录的增加从最左端往右端来移动,当到底部区间的尾端时,则新的区间将会被分配。
二、表可收缩的原理
随着记录的增加高水位线不断的右移,记录的删除不会导致高水位线往回(左)移动
删除记录后的空闲空间(高水位线左侧)尽管可以使用,但其稀疏性导致空间空闲
在oracle中可以使用alter table table_name shrink space收缩表,使用shrink有两个前提条件:
1、表必须启用row movement
2、表段所在表空间的段空间管理(segment space management)必须为auto
三、Shrink Space实验
--建立一个segment space management auto表空间
SQL> create tablespace ts_auto datafile '/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/ts_auto.dbf' size 100m extent management local segment space management auto; Tablespace created
--建议测试表同时指定表空间
SQL> create table t_auto tablespace ts_auto as select * from dba_objects ; Table created
--查看shrink前的块数量
SQL> select blocks from dba_segments where segment_name='T_AUTO'; BLOCKS ---------- 1280
--delete数据后,空间占用没有变化
SQL> delete from t_auto; 83791 rows deleted SQL> commit; Commit complete SQL> select blocks from dba_segments where segment_name='TS_AUTO'; BLOCKS ---------- 1280
--直接收缩,提示必须启动row movement选项
SQL> alter table t_auto shrink space; alter table t_auto shrink space ORA-10636: ROW MOVEMENT is not enabled SQL> alter table t_auto enable row movement; Table altered
--收缩成功,空间已经释放
SQL> alter table t_auto shrink space; Table altered SQL> select blocks from dba_segments where segment_name='T_AUTO'; BLOCKS ---------- 8
--shrink不能在segment space management manaual的表空间的段上执行
SQL> create tablespace ts_manual datafile '/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/ts_mannel.dbf' size 100m 2 extent management local segment space management manual; Tablespace created SQL> select tablespace_name,segment_space_management from dba_tablespaces; TABLESPACE_NAME SEGMENT_SPACE_MANAGEMENT ------------------------------ ------------------------ SYSTEM MANUAL SYSAUX AUTO UNDOTBS1 MANUAL TEMP MANUAL USERS AUTO GZCSS_GZBH AUTO OGG AUTO NWPP AUTO TS_AUTO AUTO TS_MANUAL MANUAL 10 rows selected SQL> create table tb_manual tablespace ts_manual as select * from dba_objects; Table created SQL> alter table tb_manual shrink space; alter table tb_manual shrink space ORA-10635: Invalid segment or tablespace type
今天抽空测试的一个实验,还可以,总结如下:
Shrink Space实质上构造一个新表(在内部表现为一系列的DML操作,即将副本插入新位置,删除原来位置的记录) ,靠近末尾处(右端)数据块中的记录往开始处(左端)的空闲空间处移动(DML操作),不会引起DML触发器。当所有可能的移动被完成,高水位线将会往左端移动(DDL操作),新的高水位线右边的空闲空间被释放(DDL操作)
觉得有用的帮忙转发哦~
后面会分享更多关于运维DBA内容,感兴趣的朋友可以关注下,也会介绍多一些实验给大家测试。