【转自】http://space.itpub.net/48361/viewspace-253106

最近历史数据库磁盘空间不足,而有一个表空间有50个G容量,但是实际只占100m的空间,
使用ALTER TABLE table SHRINK SPACE CASCAD后大部分数据文件可以调整,当试图调整其中一个数据文件尺寸的时候报
RA-03297: file contains used data beyond requested RESIZE value
说明这个文件不能通过降低hwm来释放空间了。

数据库版本:oracle 10.2.1
--找到数据文件对应的文件号
SQL>select file#,name from v$datafile where name like '%BASEINFO.dbf';
5                  /data/eucpdb/eucpdb/BASEINFO.dbf

找到文件中最大的块号
SQL>select max(block_id) from dba_extents where file_id=5 ;

1213833

--查看数据库块大小
SQL>show parameter db_block_size

db_block_size integer 8192

计算一下文件中最大使用块占用的位置
SQL>select 1213833*8/1024 from dual;

9483.0703125 M

--为了验证上面做法的准确性,下面做一个试验

--调整前数据文件大小为10000M
--现在调整数据库文件为9500M
SQL>ALTER DATABASE DATAFILE '/data/eucpdb/eucpdb/BASEINFO.dbf' RESIZE 9500M
  2  /

数据库已更改

--调整文件为 9400m

SQL>ALTER DATABASE DATAFILE '/data/eucpdb/eucpdb/BASEINFO.dbf' RESIZE 9400M
  2  /

SQL> ALTER DATABASE DATAFILE '/data/eucpdb/eucpdb/BASEINFO.dbf' RESIZE 9400M;
ALTER DATABASE DATAFILE '/data/eucpdb/eucpdb/BASEINFO.dbf' RESIZE 9400M
*
第 1 行出现错误:
ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据

--看来了上面的计算是准确的

SQL> col segment_name format a30
SQL> SET LIN 200  
SQL> select segment_name,segment_type,tablespace_name,extent_id,bytes,blocks from dba_extents where file_id=5 and   block_id='1213833';

SEGMENT_NAME                   SEGMENT_TYPE       TABLESPACE_NAME                 EXTENT_ID      BYTES     BLOCKS
------------------------------ ------------------ ------------------------------ ---------- ---------- ----------
REGISTRYINFO                   TABLE              BASEINFO                               25     524288         64

SQL>

SQL>  ALTER TABLE eucpmanager.REGISTRYINFO SHRINK SPACE CASCADE;

表已更改。

创建一个新的表空间,把block_id比较高的几个表移出表空间

SQL> CREATE SMALLFILE TABLESPACE "BASEINFO_BAK" DATAFILE '/data/eucpdb/eucpdb/baseinfo_bak.dbf' SIZE 100M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
  2  /

表空间已创建。

SQL> alter user eucpmanager quota unlimited on BASEINFO_BAK;

用户已更改。

把block_id比较高的几个表移动到新的表空间

SELECT DISTINCT SEGMENT_NAME FROM DBA_EXTENTS WHERE TABLESPACE_NAME='BASEINFO' AND FILE_ID=5 and block_id>1159985 and segment_type='TABLE' ;

SQL> SELECT distinct  'alter table '|| SEGMENT_NAME||' move tablespace baseinfo_bak; ' FROM DBA_EXTENTS WHERE TABLESPACE_NAME='BASEINFO' AND FILE_ID=5 and block_id>1159985 and segment_type='TABLE' ;

'ALTERTABLE'||SEGMENT_NAME||'MOVETABLESPACEBASEINFO_BAK;'
----------------------------------------------------------------------------------------------------------------------------
alter table ENTERPRISESERVICEINFO move tablespace baseinfo_bak;
alter table REGISTRYFEEDETAILEX move tablespace baseinfo_bak;
alter table ENTERPRISEROUTE move tablespace baseinfo_bak;
alter table REGISTRYAUTHINFO move tablespace baseinfo_bak;
alter table ENTERPRISEBASEINFO move tablespace baseinfo_bak;

SQL> alter table ENTERPRISESERVICEINFO move tablespace baseinfo_bak;
alter table REGISTRYFEEDETAILEX move tablespace baseinfo_bak;
alter table ENTERPRISEROUTE move tablespace baseinfo_bak;
alter table REGISTRYAUTHINFO move tablespace baseinfo_bak;
alter table ENTERPRISEBASEINFO move tablespace baseinfo_bak;
表已更改。

SQL>
表已更改。

SQL>
表已更改。

SQL>
表已更改。

告警日志中会出现下面的内容,索引需要重建
Thu Apr 24 14:20:21 2008
Some indexes or index [sub]partitions of table EUCPMANAGER.ENTERPRISEBASEINFO have been marked unusable

把下面的执行结果的语句执行所有重建
 SELECT distinct  'alter INDEX '|| SEGMENT_NAME||' REBUILD TABLESPACE BASEINFO_BAK; ' FROM DBA_EXTENTS WHERE TABLESPACE_NAME='BASEINFO' AND FILE_ID=5 and block_id>1159985 and segment_type='INDEX' ;
 
 
 alter INDEX PK_ENTERPRISEBASEINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX PK_REGISTRYINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX PK_REGISTRYFEEDETAILEX REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;

再次修改数据文件大小

SQL>  select max(block_id) from dba_extents where file_id=5 ;

MAX(BLOCK_ID)
-------------
         3209

SQL> ALTER DATABASE DATAFILE '/data/eucpdb/eucpdb/BASEINFO.dbf' RESIZE 1000m;

数据库已更改。

数据库文件的空间已经调整成功了

SQL>

--把挪走的表在挪回来

SQL> alter table ENTERPRISESERVICEINFO move tablespace baseinfo;
alter table REGISTRYFEEDETAILEX move tablespace baseinfo;
alter table ENTERPRISEROUTE move tablespace baseinfo;
alter table REGISTRYAUTHINFO move tablespace baseinfo;
alter table ENTERPRISEBASEINFO move tablespace baseinfo;
alter table registryinfo move tablespace baseinfo;
表已更改。

SQL>
表已更改。

--重建索引
SQL>
SQL>
SQL> ALTER INDEX PK_REGISTRYINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX AK_REGISTRYCODE_REGISTRYINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX PK_ENTERPRISEBASEINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX PK_ENTERPRISESERVICEINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX PK_REGISTRYFEEDETAILEX REBUILD TABLESPACE BASEINFO;

索引已更改。

SQL> SELECT COUNT(*) FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='BASEINFO_BAK' ;

COUNT(*)
----------
         0

已经没有对象在新建的这个表空间了。现在删除掉

SQL> drop tablespace baseinfo_bak;

表空间已删除。

到此调整已经结束了。
其实调整方法有很多,如用imp/exp等
如果我的做法有什么不足之处请执教,谁有更好的办法欢迎提供,本人水平有限。

缩小数据文件尺寸报ORA-03297的处理办法相关推荐

  1. linux ora 01157,案例:Oracle报错ORA-01157 ORA-01110 数据启动报错RMAN恢复数据库思路

    天萃荷净 rman从多份备份中还原操作,运维DBA工程师反映数据库在进行恢复时报错ORA-01157 ORA-01110,分析原因为11号数据文件需要recover 1.数据恢复ORA错误 RMAN& ...

  2. mysql 1455_关于Oracle 11g导出数据时 报 ORA-1455错误的处理

    关于Oracle 11g导出数据时 报 ORA-1455错误的处理,由于导出的该用户的表可能存在空数据表,那么可能就会出现此其异常. 关于Oracle 11g导出数据时 报 ORA-1455错误的处理 ...

  3. 数据导入报错:Got a packet bigger than‘max_allowed_packet’bytes的问题

    2019独角兽企业重金招聘Python工程师标准>>> 数据导入报错:Got a packet bigger than'max_allowed_packet'bytes的问题 2个解 ...

  4. jmeter发送json数据,报405、400错误解决方案

    jmeter发送json数据,报405.400错误解决方案 参考文章: (1)jmeter发送json数据,报405.400错误解决方案 (2)https://www.cnblogs.com/sunn ...

  5. Flask 数据迁移 报错 Table 'xxx' is already defined for this MetaData instance

    Flask 数据迁移 报错 Table 'xxx' is already defined for this MetaData instance 原因是已经存在 db.Model应该会熟悉一些, db. ...

  6. pl/sql查询表数据,报错ORA-03115:不支持的网络数据类型或表示法

    今天测试人员遇到一个问题:pl/sql查询表数据,报错ORA-03115:不支持的网络数据类型或表示法 我在plsql上查询这张表是没有问题的,去看了那张表,发现有个字段类型是binary_doubl ...

  7. 10g数据库入门与实践 oracle_修改oracle数据文件大小 报错:ORA-03297

    修改oracle数据文件大小 报错:ORA-03297 数据库中SXSJ的表空间SXS文件在创建的时候由于达到最大块空间,增加了一个SXSJ1的数据文件,但是增加时直接给的文件大小是30G,过于占用空 ...

  8. plsql 连接oralce数据库,报ora 12557 tns 协议适配器不可加载错误

    使用plsql 连接oracle 数据库报ora 12557 错误: 解决方案: 1:首先确保服务中的service以及监听器都开启 2:F:\app\Administrator\product\11 ...

  9. Streamset数据同步报错问题

    Streamset数据同步报错问题 1.postgresql cdc使用数据库链接报错 JDBC_00 - Cannot connect to specified database: com.stre ...

最新文章

  1. 知识图谱中传统关系抽取方法
  2. spring boot 的常用注解使用 总结
  3. linux shell 通过 第三方 网站 网页 得到 外网 公网 ip
  4. 安装python及web.py
  5. 如何查看 JSP 和 Servlet 的版本
  6. HTML元素title里面如何换行
  7. php smtp发送附件,PHP:如何使用smtp设置发送带附件的电子邮件?
  8. Java多线程编程:变量共享分析(Thread)
  9. mysql timdir_MYSQL学习笔记——数据类型
  10. vue组件穿方法_vue组件间通信六种方式(完整版)
  11. mongodb系列~mongodb的副本集搭建和原理
  12. 工商行政许可信息爬取及展示系统的设计与实现
  13. JAVA实现PDF合并、拆分代码工具类
  14. 菜鸟日志:ADL(C++参数依赖查找)、
  15. 小乐乐与进制转换-c++(六进制转换函数)
  16. 感谢这一年的尚不如愿,这是下一年必须努力的理由
  17. vs 2019修改C#语言版本
  18. 【C#8.0 and .NET Core 3.0 高级编程学习笔记】
  19. 【excel】几个公式任意增减提取单元格内容
  20. 使用iptables进行sta 与 ap之间的路由

热门文章

  1. fastadmin的基本用法 自动生成crud模块
  2. 数据结构——线性表之链式存储结构
  3. Oracle中常用的命令,随着学习进度总结
  4. Django form表单
  5. 解决nginx负载均衡高可用keepalived只针对物理机的问题
  6. [ZJOI2008]生日聚会Party
  7. MongoDB windows解压缩版安装
  8. JavaScript instanceof 运算符深入剖析
  9. Shell脚本编程剖析(更新完毕)
  10. RFID系统集成公司