暂无图片
可否对一个bigfile的大表空间resize让它释放空间
我来答
分享
Garry
2021-05-13
可否对一个bigfile的大表空间resize让它释放空间

各位好,请问可否对一个bigfile的大表空间resize让它释放空间,
表空间中有20t的空间是删除历史的表释放出来的,想着resize变小。然后让其他表空间用。

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
杨曾瑞

–首先不是你drop 表就能resize回收表空间,因为要看这个表在数据文件中块的位置,只有这个表后面都没有其它对象的块才能被resize
–如果不能直接resize就需要move 表空间中的表才能回收表空间的空间,相对还是比较麻烦
–最简单的回收表空间空间的方式是数据泵导入导出,但是这个得先确认当前生产环境可以这么做

–下面这个SQL可以查询一个表空间数据文件可以resize的最小大小 &tbs是表空间名称
select tablespace_name,
savings,
‘alter database datafile ‘’’ || file_name || ‘’’ resize ’ ||
smallest || ‘m;’ cmd,
‘alter database datafile ‘’’ || file_name || ‘’’ autoextend on;’ cmd2
from (select file_name,
a.tablespace_name,
a.file_id,
ceil((nvl(hwm, 1) * c.block_size) / 1024 / 1024) + 1000 smallest,
ceil(a.blocks * c.block_size / 1024 / 1024) currsize,
ceil(a.blocks * c.block_size / 1024 / 1024) -
ceil((nvl(hwm, 1) * c.block_size) / 1024 / 1024) savings
from dba_data_files a,
(select /*+ parallel(32) */
file_id, max(block_id + blocks - 1) hwm
from dba_extents
where TABLESPACE_NAME in (’&tbs’)
group by file_id) b,
V$DATAFILE c
where a.file_id = b.file_id(+)
and a.file_id = c.file#
and a.TABLESPACE_NAME in (’&tbs’))
–where savings > 100
order by 1, 2;

暂无图片 评论
暂无图片 有用 0
打赏 0
你好我是李白

可以,但是需要所有segment在你要收缩的size高水位以下。
可以通过附件中脚本查询位于你要收缩size之上的段,进行处理,可以的话,move到其他表空间,或进行其他降低hwm的操作。
脚本来自Mos How to Resolve ORA-03297 When Resizing a Datafile by Finding the Table Highwatermark (Doc ID 130866.1)

暂无图片 评论
暂无图片 有用 0
打赏 0
你好我是李白
暂无图片 评论
暂无图片 有用 1
打赏 0
吾喾

已使用状态,一般是不能

暂无图片 评论
暂无图片 有用 0
打赏 0
handhead

可否知道resize的速度快吗,可否给个量化的参照。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交