如何解决Oracle表空间resize ORA-03297错误问题
Oracle调整表空间大小 — ORA-03297:请求的 RESIZE 中包含文件值外使用的数据
恢复备份到本地计算机的大数据库,删除大数据库里面的表(比如文件表、日志表等)。 Oracle数据文件有数据时可以自动扩展,但不能自动收缩,造成存储空间的浪费。
起源于我删除了数据库中的一张大表,造成大量的空间浪费,想要回收空间
如果直接修改数据文件的大小,可能会遇到以下错误:ORA-03297: 该文件包含在 request 使用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
*
1 行出现错误:
ORA-03297:文件包含在请求的 RESIZE 数据使用了值以外的数据
但是
SQL>selectd 。 file_name,d.file_id,d.bytes/1024/1024 as d_byte,sum(f.bytes/1024/1024) asfree_byte
2 来自 dba_data_files d,dba_free_space f
3 其中 d.file_id=f.file_id 和 d.file_id= 18
4 按 d.file_name、d.file_id、d.bytes/ 分组1024/1024;
FILE_NAME FILE_ID D_BYTE FREE_BYTE
4 p>
------- --------------------------- ------- --- ---------- ----------< /p>
D:\ORACLE\ORADATA\ICAPP\IC_DATA6.ORA 18 1536 1482.0625
可以看到带有ID=18仅使用了约约50M,但数据分布在(< /span> 按一定顺序 ) 50M 甚至在 0M 以外的 30 个地方,所以虽然我们可以看到这里只使用了大约50M空间,但是却不能调整数据文件大小。
因此,要更改小数据文件,必须首先更改移动表和索引。具体步骤如下:
1。在移动表之前整理表空间
SQL>alter tablespace ic_datacoalesce;
2。查找dba_extents中ID=18的数据文件相关的表和索引
SQL>selectsegment_name,partition_name,segment_type
2 from dba_extents
3 其中 file_id=18 ;
3。移动 id=18 文件上的表和索引
SQL> 设置标题关闭
SQL> 设置回显关闭
SQL> 设置反馈关闭
SQL> set termout on
SQL> spool d:\aaa.sql
//移动表
SQL>selectDISTINCT '改变表'||段名称 || ' 移动表空间 test_space;' fromdba_extents where segment_type='TABLE' and file_id=18;
//移动索引
SQL>selectDISTINCT 'alter index'| |段名称 || '重建表空间test_space;' from dba_extents where segment_type='INDEX' and file_id=18;
//移动分区表
SQL>selectDISTINCT 'al三表'||段名称 || '移动分区'||分区名称|| ' 表空间 test_space;' from dba_extents where segment_type='TABLEPARTITION' and file_id=18;
//移动分区索引
SQL>selectDISTINCT 'alter index '| |段名称 || '重建分区'||partition_name || ' 表空间 test_space;' from dba_extents wheresegment_type=' INDEX PARTITION' and file_id=18;
SQL>spooloff
然后执行 aaa.sql,确保 test_space 有有足够的空间容纳这些数据,
首先创建一个新的test_space空间,将数据移动到新的表空间,收缩原表空间,将数据移回到原来的表空间原来的表空间,并删除test_space空间
其实不需要把所有数据都搬走,但总体测试的是超过300M的数据是否有已经被移动过,所以移动所有数据更方便
SQL> ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\ ICAPP\IC_DATA6.ORA' RESIZE 300M
数据库已更改。
5、将原表空间ic_data中的数据移回,并修改aaa.sql中的表空间名称执行再次 ic_data,然后删除表空间 test_space,包括内容和数据文件。
------------------------< strong>分隔线---------------------------- --- 分隔线----------------- --------- ----------分隔线- ---------- ------------------
练习后,上述方法可以处理ORA-03297: file contains Problem使用超出请求的 RESIZE 值的数据。
但是如果一个表空间被多个Oracle用户使用,则在导出sql文件时必须指定用户,否则执行sql文件时会报错。
>感谢您的阅读!这篇关于《如何解决Oracle表空间resize ORA-03297错误问题》的文章就分享到这里。希望以上内容能够对大家有所帮助。你可以学到更多的知识。如果您觉得文章不错,可以分享出去,让更多的人看到!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何解决Oracle表空间resize ORA-03297错误问题