[原创]xx公司数据库表空间解决方案_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2833 | 回复: 0   主题: [原创]xx公司数据库表空间解决方案        下一篇 
jie.liang
注册用户
等级:少校
经验:1003
发帖:77
精华:0
注册:2013-10-11
状态:离线
发送短消息息给jie.liang 加好友    发送短消息息给jie.liang 发消息
发表于: IP:您无权察看 2014-4-1 16:18:25 | [全部帖] [楼主帖] 楼主

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,不建议回收。回收时,会阻塞交易,少量的空间得不偿失。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论