缩小数据文件尺寸报ORA-03297的处理办法
【转自】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的处理办法相关推荐
- linux ora 01157,案例:Oracle报错ORA-01157 ORA-01110 数据启动报错RMAN恢复数据库思路
天萃荷净 rman从多份备份中还原操作,运维DBA工程师反映数据库在进行恢复时报错ORA-01157 ORA-01110,分析原因为11号数据文件需要recover 1.数据恢复ORA错误 RMAN& ...
- mysql 1455_关于Oracle 11g导出数据时 报 ORA-1455错误的处理
关于Oracle 11g导出数据时 报 ORA-1455错误的处理,由于导出的该用户的表可能存在空数据表,那么可能就会出现此其异常. 关于Oracle 11g导出数据时 报 ORA-1455错误的处理 ...
- 数据导入报错:Got a packet bigger than‘max_allowed_packet’bytes的问题
2019独角兽企业重金招聘Python工程师标准>>> 数据导入报错:Got a packet bigger than'max_allowed_packet'bytes的问题 2个解 ...
- jmeter发送json数据,报405、400错误解决方案
jmeter发送json数据,报405.400错误解决方案 参考文章: (1)jmeter发送json数据,报405.400错误解决方案 (2)https://www.cnblogs.com/sunn ...
- Flask 数据迁移 报错 Table 'xxx' is already defined for this MetaData instance
Flask 数据迁移 报错 Table 'xxx' is already defined for this MetaData instance 原因是已经存在 db.Model应该会熟悉一些, db. ...
- pl/sql查询表数据,报错ORA-03115:不支持的网络数据类型或表示法
今天测试人员遇到一个问题:pl/sql查询表数据,报错ORA-03115:不支持的网络数据类型或表示法 我在plsql上查询这张表是没有问题的,去看了那张表,发现有个字段类型是binary_doubl ...
- 10g数据库入门与实践 oracle_修改oracle数据文件大小 报错:ORA-03297
修改oracle数据文件大小 报错:ORA-03297 数据库中SXSJ的表空间SXS文件在创建的时候由于达到最大块空间,增加了一个SXSJ1的数据文件,但是增加时直接给的文件大小是30G,过于占用空 ...
- plsql 连接oralce数据库,报ora 12557 tns 协议适配器不可加载错误
使用plsql 连接oracle 数据库报ora 12557 错误: 解决方案: 1:首先确保服务中的service以及监听器都开启 2:F:\app\Administrator\product\11 ...
- Streamset数据同步报错问题
Streamset数据同步报错问题 1.postgresql cdc使用数据库链接报错 JDBC_00 - Cannot connect to specified database: com.stre ...
最新文章
- 知识图谱中传统关系抽取方法
- spring boot 的常用注解使用 总结
- linux shell 通过 第三方 网站 网页 得到 外网 公网 ip
- 安装python及web.py
- 如何查看 JSP 和 Servlet 的版本
- HTML元素title里面如何换行
- php smtp发送附件,PHP:如何使用smtp设置发送带附件的电子邮件?
- Java多线程编程:变量共享分析(Thread)
- mysql timdir_MYSQL学习笔记——数据类型
- vue组件穿方法_vue组件间通信六种方式(完整版)
- mongodb系列~mongodb的副本集搭建和原理
- 工商行政许可信息爬取及展示系统的设计与实现
- JAVA实现PDF合并、拆分代码工具类
- 菜鸟日志:ADL(C++参数依赖查找)、
- 小乐乐与进制转换-c++(六进制转换函数)
- 感谢这一年的尚不如愿,这是下一年必须努力的理由
- vs 2019修改C#语言版本
- 【C#8.0 and .NET Core 3.0 高级编程学习笔记】
- 【excel】几个公式任意增减提取单元格内容
- 使用iptables进行sta 与 ap之间的路由