mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-US">1.引言
营销数据库中的数据文件近2.5T,针对于用户想回收数据空间的碎片来解决表空间的问题,本文给你出一参考建议,供用户选择。
Calibri" lang="EN-US">2.表空间产生碎片的原因_Toc277967935">
表空间产生碎片的原因主要来自己三个方面:表空间的碎片、表的碎片、索引的碎片。
Calibri" lang="EN-US">2.1.大量的DML操作
大量的DML操作会使数据库的数据块产生很多小间隙,而且这些间隙不能被在次利用,这样就产生的碎片。
Calibri" lang="EN-US">2.2.没有回收高水位回收_Toc277967939">
高水位的问题主要来自于表的数据量变化很大,insert很多数据,也有可能数据用完后,直接被DELETE。这样的表依然占用然表最大时所占有的空间。
Calibri" lang="EN-US">2.3.数据量变化的索引_Toc277967941">
索引在DML操作也是很浪费空间,而且他DML后的空间,几乎不可能被重用,也是碎片的主要来源
Calibri" lang="EN-US">3.表空间处理碎片的方法_Toc277967943">
Calibri" lang="EN-US">3.1.重新建表法_Toc277967944">
这种方法是安全可靠的方法。12.0pt" lang="EN-US">
12.0pt;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-US">a)首先找到碎片严重的表,exp/imp导出。12.0pt" lang="EN-US">
Calibri" lang="EN-US">b)Truncate去该表的数据12.0pt" lang="EN-US">
Calibri" lang="EN-US">c)重新导入数据
Calibri" lang="EN-US">d)影响业务的交易,不推荐。
Calibri" lang="EN-US">3.2.收回表高水位_Toc277967947">
Oracle 10g 提供的新技术,可以在线收回高水位。
Calibri" lang="EN-US">a)首先找到碎片严重的表。禁用rowid的触发器
12.0pt" lang="EN-US">Alter table table_name enable row movement
Calibri" lang="EN-US">b)重组现有的行
12.0pt" lang="EN-US">Alter table table_name shrink space
c)总的来说分为两个过程:第一步,数据的compact过程,这部分用来重排数据(把数据尽量排到段前),并且只在移动的数据行家rx锁,所以这个对业务影响较小,可以先完成。第二部,就是回收高水位线,释放空闲空间。这部分操作加x锁,会阻塞表的dml,所以一般不在业务繁忙的时候进行。
Calibri" lang="EN-US">3.3.索引的处理方法_Toc277967948">
Calibri" lang="EN-US">a)删除索引,重新建立索引
Calibri" lang="EN-US">b)Rebuild 索引
Calibri" lang="EN-US">4.表空间处理实施方案_Toc277967949">
mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-US">4.1.找出碎片表
mso-bidi-font-family:Calibri" lang="EN-US">a)建立临时表
10.5pt" lang="EN-US">create table sw1(
10.5pt" lang="EN-US">owner varchar2(30),
10.5pt" lang="EN-US">table_name varchar2(30),
10.5pt" lang="EN-US">total number(20),
10.5pt" lang="EN-US">used number(20),
10.5pt" lang="EN-US">free number(20));
mso-bidi-font-family:Calibri" lang="EN-US">b)收集表的使用信息,存入临时表中
10.5pt" lang="EN-US">insert into sw1
10.5pt" lang="EN-US">select owner, table_name,blocks total ,round(avg_row_len*num_rows/1024/8)used , trunc((blocks*8*1024 - avg_row_len*num_rows)/1024/8)free
10.5pt" lang="EN-US">from dba_tables ;
mso-bidi-font-family:Calibri" lang="EN-US">c)过滤出碎片表
10.5pt" lang="EN-US">delete sw1 where total=5 or total=NULL or used=NULL or free=NULL;
10.5pt" lang="EN-US">delete sw1 where owner in (‘SYS’,’SYSTEM’,’DBSNMP’);
10.5pt" lang="EN-US">update sw1 set free=free-5;
mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-US">4.2.建立挖掘脚本
Calibri" lang="EN-US">a)看数据库的基本情况如,共用多少存储,已经用了多少,剩余多少。
12.0pt" lang="EN-US">select sum(total) total_M,sum(used) used_M,sum(free) free_M FROM SW1;
Calibri" lang="EN-US">b)看表剩余空间大于20%的文件。
12.0pt" lang="EN-US">select owner,table_name,free from sw1 where free_d>0.2 and free>16;
Calibri" lang="EN-US">c)看应该回收的表。(个人认为表空闲率大于30%或blocks大于1000)
12.0pt" lang="EN-US">select owner,table_name,free from sw1 where free_d>0.3 and free>1000;
Calibri" lang="EN-US">d)看需要回收表能回收多少空间。
12.0pt" lang="EN-US">select sum(free)*16/1024 total_m from sw1 where free_d>0.3 and free>1000;
Calibri" lang="EN-US">5.表空间处理建议_Toc277967950">
只建议收集问题严重的表、及相关索引的空间,其于空间不严重的不收集。并且收集索引的方法,只使用ORACLE官方建议的方法,并且提前做好备份。
Calibri" lang="EN-US">6.表空间处理风险_Toc277967951">
对于大表,如果问题不严重,不建议收回高水位,回收失败会要求恢复数据文件。
对于少量的BLOCKS,不建议回收。回收时,会阻塞交易,少量的空间得不偿失。