如何解决Oracle表空间resize ORA-03297错误问题

分类:编程技术 时间:2024-02-20 15:53 浏览:0 评论:0
0
本文将与大家分享如何解决Oracle调整表空间大小时出现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的数据是否有已经被移动过,所以移动所有数据更方便

4 , 以这种方式移动所有数据后,您可以调整数据文件的大小

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错误问题》的文章就分享到这里。希望以上内容能够对大家有所帮助。你可以学到更多的知识。如果您觉得文章不错,可以分享出去,让更多的人看到!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何解决Oracle表空间resize ORA-03297错误问题

用户评论