千家信息网

如何解决Oracle调整表空间大小ORA-03297错误问题

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章给大家分享的是有关如何解决Oracle调整表空间大小ORA-03297错误问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Oracle调整表空间大小-ORA-03
千家信息网最后更新 2026年10月31日如何解决Oracle调整表空间大小ORA-03297错误问题

这篇文章给大家分享的是有关如何解决Oracle调整表空间大小ORA-03297错误问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

Oracle调整表空间大小-ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据

将备份的一个大数据库还原到本机以后,删除里面的大表(比如文件表、日志表等),Oracle数据文件在有数据的情况下能自动扩展,却不能自动收缩,造成存储空间的浪费。
起源于我删除了database里的一个大表造成很多空间浪费,想回收空间
如果直接修改数据文件的大小,可能会遇到如下错误:ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据

转载网址:http://blog.sina.com.cn/s/blog_54eeb5d901000bvg.html

SQL> ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\ICAPP\IC_DATA6.ORA' RESIZE 300m;
ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\ICAPP\IC_DATA6.ORA' RESIZE 300m
*
ERROR 位于第 1 行:
ORA-03297:
文件包含在请求的 RESIZE 值以外使用的数据

但是

SQL>select d.file_name,d.file_id,d.bytes/1024/1024 as d_byte,sum(f.bytes/1024/1024) as free_byte

2 from dba_data_files d,dba_free_space f

3 where d.file_id=f.file_id and d.file_id=18

4 group by d.file_name,d.file_id,d.bytes/1024/1024;

FILE_NAME FILE_ID D_BYTE FREE_BYTE

--------------------------------- ---------- ---------- ----------

D:\ORACLE\ORADATA\ICAPP\IC_DATA6.ORA 18 1536 1482.0625

可以看到实际上ID=18的文件只使用了大概50M左右,只是数据分布在(按一定的顺序)50M甚至在300M以外的地方,所以这里虽然看到只使用了约50M空间,但是却不能resize datafile.

为此,要改小数据文件,我们先要对文件上的表和索引移动一下位置,具体做法如下:

1、移动表前先对表空间做整理

SQL>alter tablespace ic_data coalesce;

2、在dba_extents找到与ID=18的数据文件相关的表及索引

SQL>select segment_name,partition_name,segment_type

2 from dba_extents

3 where file_id=18;

3、对id=18的文件上的表和索引移动位置

SQL> set heading off
SQL> set echo off
SQL> set feedback off
SQL> set termout on
SQL> spool d:\aaa.sql

//移动表

SQL>select DISTINCT 'alter table '|| segment_name || ' move tablespace test_space;' from dba_extents where segment_type='TABLE' and file_id=18;

//移动索引

SQL>select DISTINCT 'alter index '|| segment_name || ' rebuild tablespace test_space;' from dba_extents where segment_type='INDEX' and file_id=18;

//移动分区表

SQL>select DISTINCT 'alter table '|| segment_name || ' move partition '|| partition_name || ' tablespace test_space;' from dba_extents where segment_type='TABLE PARTITION' and file_id=18;

//移动分区索引

SQL>select DISTINCT 'alter index '|| segment_name || ' rebuild partition '|| partition_name || ' tablespace test_space;' from dba_extents where segment_type='INDEX PARTITION' and file_id=18;

SQL>spool off

然后执行aaa.sql,注意保证test_space有足够的空间容纳这些数据,

先要新建test_space空间,把数据移动到新表空间中,缩小原表空间,将数据移动回原表空间,删除test_space空间

其实可以不移动所有的数据,但是总的测验是不是移动了300M以外的数据,所以还是移动所有数据的方便

4、这样移动了所有的数据以后就可以对datafile resize了

SQL> ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\ICAPP\IC_DATA6.ORA' RESIZE 300M
数据库已更改。

5、把原来表空间ic_data中的数据再移动回来,修改aaa.sql中的表空间名为ic_data再执行,然后drop tablespace test_space including contents and datafiles。

-----------------------分割线-----------------------------分割线-----------------------------分割线----------------------------

经过实践,以上方法可以处理ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据问题。

但是如果一个表空间被多个Oracle用户使用,在导出sql文件时要指定用户,否则在执行sql文件时会报错。

感谢各位的阅读!关于"如何解决Oracle调整表空间大小ORA-03297错误问题"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

数据 空间 文件 移动 索引 大小 调整表 错误 问题 调整 分割线 位置 内容 数据库 更多 用户 篇文章 不错 实用 为此 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖南永感互联网科技有限公司 中关村互联网科技集团 河南真二互联网科技有限公司 互联网扶贫科技 青岛互联网科技公司 居家互联网科技有限公司 太原新华互联网科技学校怎么样 温州喔噻互联网科技有限公司 创业天下互联网科技有限公司 昭通云南众福互联网科技有限公司 宁夏众和广鑫互联网科技有限公司 华中科技大学互联网的牛人 滨湖区互联网智能科技产品有哪些 深圳互联网科技的发展 互联网科技包装股份有限公司上市 版纳互联网科技选哪家 求路客互联网科技电话 现代互联网科技公司 每日互联网科技新闻 株洲百竞科技的互联网营销顾问 互联网科技工作委员会主任 嘟嘟瓜互联网科技 互联网科技论文 天扬科技互联网广告 深圳卡尔迅互联网科技有限公司怎么样 海南购全球互联网科技 互联网时代科技改变生活 南博望互联网科技有限公司 科技互联网海报 北京品多多互联网科技有限公司
0