本讲内容主要包括:
1.段收缩和表空间使用量监控
2.进行段收缩,回退高水位线
3.由于空间问题,设置会话暂停
4.传输表空间
一:段收缩,段收缩分row chaining和row migrate
1.模拟row chaining 行链接情况
当第一次插入行时,由于行太长而不能容纳在一个数据块中时,就会发生行链接。在这种情况下,oracle会使用与该块链接的一块或多块数据块来容纳该行的数据。行连接经常在插入比较大的行时才会发生,如包含long, long row, lob等类型的数据。在这些情况下行链接是不可避免的。
[root@rhel6 ~]# su - oracle
[oracle@rhel6 ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Aug 3 09:28:11 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn /as sysdba
Connected.
SQL> @ /rdbms/admin/utlchain.sql
Table created
SQL> create table hr.tocp11_long(a varchar2(2000), b varchar2(2000), c varchar2(2000),
2 d varchar2(2000), e varchar2(2000),f varchar2(2000) ,g varchar2(2000), h varchar2(2000),
3 i varchar2(2000), j varchar2(2000) );
Table created.
SQL> insert into tocp11_long(a) values('此处为2000个A');
1 row created.
SQL> update tocp11_long set b=('此处为2000个A');
1 row created.
SQL> update tocp11_long set c=('此处为2000个A');
1 row created.
SQL> commit;
Commit complete.
SQL> analyze table hr.tocp11_long list chained rows;
Table analyzed.
SQL> select * from chained_rows;
no rows selected
SQL> update tocp11_long set d=('此处为2000个A');
1 row created.
SQL> commit;
Commit complete.
SQL> analyze table hr.tocp11_long list chained rows;
Table analyzed
SQL> select owner_name,table_name,head_rowid from chained_rows;
OWNER_NAME TABLE_NAME HEAD_ROWID
---------- --------------- ------------------
HR TOCP11_LONG AAAQxUAAEAAAHL9AAA
2.模拟row migrate行迁移情况
当修改不是行链接的行时,当修改后的行长度大于修改前的行长度,并且该数据块中的空闲空间已经比较小而不能完全容纳该行的数据时,就会发生行迁移。在这种情况下,Oracle会将整行的数据迁移到一个新的数据块上,而将该行原先的空间只放一个指针,指向该行的新的位置,并且该行原先空间的剩余空间不再被数据库使用。
SQL> create table hr.t04311_migrate (a varchar2(2000)) pctfree 0;
Table created.
SQL> begin
2 for i in 1..2000
3 loop
4 insert into hr.t04311_migrate values ('A');
5 end loop;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
SQL> update hr.t04311_migrate set a='AAAAAAAAAAAAAAAAAAAAAAAAA';
2000 rows updated.
SQL> commit;
Commit complete.
SQL> analyze table hr.t04311_migrate list chained rows;
Table analyzed.
SQL> select owner_name,table_name,head_rowid from chained_rows where rownum <= 5;
OWNER_NAME TABLE_NAME HEAD_ROWID
---------- --------------- ------------------
HR TOCP11_LONG AAAQxUAAEAAAHL9AAA
HR T04311_MIGRATE AAAQxWAAEAAAHMFAAA
HR T04311_MIGRATE AAAQxWAAEAAAHMFAAB
HR T04311_MIGRATE AAAQxWAAEAAAHMFAAC
HR T04311_MIGRATE AAAQxWAAEAAAHMFAAD
3.使用dbconsole监控表空间的使用量

二.进行段收缩,回退高水位线,进行段收缩后,将无法进行闪回,同时必须开启行移动,对于非ASSM管理的表空间,无法进行段收缩
SQL> create table hr.t04311_big as select * from dba_source;
Table created.
SQL> select count(*) from dba_extents e where e.owner='HR' and e.segment_name='T04311_BIG';
COUNT(*)
----------
67
SQL> delete from hr.t04311_big;
323191 rows deleted.
SQL> select count(*) from dba_extents e where e.owner='HR' and e.segment_name='T04311_BIG';
COUNT(*)
----------
67
SQL> alter table hr.t04311_big enable row movement;
Table altered.
SQL> alter table hr.t04311_big shrink space compact;
Table altered.
SQL> select coun