您的位置:首页 > 数据库 > Oracle

Oracle--缩小表空间

2016-08-16 21:57 218 查看
昨天刚到一个ssd硬盘,就准备整理一下硬盘,然后发现开发的时候有几个表空间放的非常大。现在ssd当然没有那么大的空间,而且这些都是旧系统,并不会在继续占用很大的空间,所以就想办法把表空间变小一些。

首先当然是常规方法。

然后就是稍微智能一点,但是效果不是那么好的办法。

最后就只能重建表空间了。

常规方法

select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space --表空间最大值
,(SELECT MAX(block_id)*8/1024 FROM dba_extents WHERE tablespace_name = 'TS_DATA') max_space --已使用表空间的最大值
from dba_data_files f
order by tablespace_name;

这个sql初始执行执行的非常慢,需要耐心。
好,看结果。



这里面有几个明显不正常的数据,我可以保证我没有用到2G和10G (倒数第三条和倒数第一条)。
先放着这2个数据,其他的先改掉。
alter database datafile 'dddd/ddddd/xxxxxxx.DBF' resize 500M;
这个语句可以帮我们缩小表空间,这个值就是我们的max_space。如果小于max_space那么就会出现ORA-03297的错误。

整理表空间

常规办法可以帮我们快速的缩小表空间,那么上面2个异常数据是什么情况呢。
这里max_space只是数据使用的最大地址(并非最大空间),也就是说,哪怕这个表空间只用了2B的空间如果这个数据卡在了表空间的最大地址,那么表空间也是没办法直接缩小的。
好吧,那么就整理下表空间好了,这样或许能减小最大地址。
主要语句如下
--查询表空间被使用
select owner from dba_tables where tablespace_name='TS_DATA' group by owner;
--row movement 开启整理功能
select 'alter table '||table_name||' enable row movement;' from dba_tables where tablespace_name='TS_DATA';
--整理表在表空间中的数据
select 'alter table '||table_name||' shrink space;' from dba_tables where tablespace_name='TS_DATA';
--row movement 关闭整理功能
select 'alter table '||table_name||' disable row movement;' from dba_tables where tablespace_name='TS_DATA';
第一个语句主要是看表空间被那些用户使用了,然后登陆那些用户,执行后面3个语句生成的结果。

我这里成功使用这个方法缩小了一个表空间,但是另外一个10G的仍然是没有变小的迹象。我也没有研究出来原因(我猜是我使用用户过多的原因,也可能是索引的原因),所以我只能重建表空间了。

重建表空间

我重建表空间的方法非常暴力,不推荐,大家有好办法可以告诉我。
上个步骤中不是已经有了表空间被那些用户使用么。
找到这些用户,导出,导入到新的表空间中。 打完收工。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: