重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4751|回复: 0
打印 上一主题 下一主题

[Oracle] oracle回收表空间

[复制链接]
跳转到指定楼层
楼主
发表于 2017-6-30 15:53:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有时可能我们会有这样一个需求,客户说某个表空间基本不用了,让我们对其进行空间回收。我们查询到表空间使用率确实很低,只有百分之几。
那么我们应该怎么样去把其他的那些空间回收回来呢?
这时,如果我们直接对数据文件进行resize,可能会报错。
ALTER DATABASE DATAFILE 'D:\ora_tablespace\GCOMM2.dbf' RESIZE 5000M;
ORA-03297: file contains used data beyond requested RESIZE value
分析原因:
数据库最大块的block_id较大:
SELECT MAX(block_id)
  FROM dba_extents
WHERE tablespace_name = 'GCOMM2';
MAX(BLOCK_ID)
-------------
       994816



也就是说,目前我们能回收表空间到当前最大块之后,db_block_size=8192
SELECT 994816*8192/1024/1024 FROM dual;
994816*8192/1024/1024
---------------------
                 7772

即我们当前resize最多只能resize到7772M左右。
1.此时,我们可以将该表空间中的数据通过expdp导出来tablespace=GCOMM2,然后在数据库中删除该表空间includ content,再重建较小的表空间,再把数据impdp导入进去。
2.找到block最大的对象,将其移动到其他表空间,再次进行resize。
比如我要reisize到50M,则需要将block_id>6400的所有对象移动到其他表空间。然后再次进行resize操作。
SELECT distinct owner,segment_name
  FROM dba_extents
WHERE tablespace_name = 'GCOMM2'
   AND segment_type = 'TABLE'
   AND file_id = 11
   AND block_id > 6400;




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-5-10 18:38 , Processed in 0.107318 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表