ora-03297(表空间无法回收)问题的解决方法

在解决商函项目的磁盘空间满及表空间回收问题时,碰到ora-03297错误提示,现把解决方法总结如下:
在实际使用中我们经常会遇到oracle某个表空间占用了大量的空间而其中的数据量却只占用了少量空间,此时我们可以用ALTER DATABASE DATAFILE '***.dbf' RESIZE nnM的命令来收缩表空间,但在收缩的过程中会遇到ora-03297错误,表示在所定义的空间之后有数据存在,不能收缩。
方法一、 先估算该表空间内各个数据文件的空间使用情况:
a.SQL>select file#,name from v$datafile;

b.SQL>select max(block_id) from dba_extents where file_id=11;

MAX(BLOCK_ID)
-------------
2560000

SQL>show parameter db_block_size

NAME TYPE VALUE
----------------------------- ------- ----------- db_block_size integer 8192
c.SQL>select 2560000*8/1024 from dual;

2560000*8/1024
-----------
20000

这说明该文件中最大使用块位于20G的位置,正好位于数据文件的尾部。
d.找出块中的对象,删除后重建。
SQL>select t.owner,t.segment_name,t.segment_type from dba_extents t where t.tablespace_name='SHTD';
e.收缩表空间
SQL> alter database datafile '/data/shtd/USERS01.dbf' resize 1024M;

Database altered.
重复b--d步,直到最大块的位置与使用空间差不多为止。
总结:如果表空间中存在大量的数据库对象,此方法太慢,同时由于是删除后重建,对象的授权丢失,导致其它用户无法操作此对象。

方法二、找到块中的所有对象,然后删除重建

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

方法三、如果某些表占用了数据文件的最后一些块,则需要先将该表导出或移动到其他的表空间中,然后删除表,再进行收缩。不过如果是移动到其他的表空间,需要重建其索引。

SQL> alter table t_obj move tablespace t_tbs1;

缺点:移走了表后,表的索引没有一起移走,如果表上有主键或唯一索引将无法删除表空间,会出现ORA-02429错误。
解决方法:删除表的约束。alter table tablename drop constraint con_name;

方法四、用exp工具导出整个表空间,删除表空间再重建家空间,最后再导入。
[oracle@shtdtest shtd]$ exp username/password@shtd file=users.dmp tablespaces=users
连接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

将导出所选的表空间...
用于表空间 SHTD...
. 正在导出群集定义
. 正在导出表定义

. . 正在导出表                  TB_CHK_DETAIL          0 行被导出
. . 正在导出表                    TB_CHK_ITEM          0 行被导出
. . 正在导出表                  TB_CHK_RESULT          0 行被导出
. . 正在导出表                      TB_CONTACT          0 行被导出
. . 正在导出表                    TB_CONTRACT          0 行被导出
. . 正在导出表                    TB_CUST_BIZ          0 行被导出
. . 正在导出表                    TB_CUST_INFO          0 行被导出
. . 正在导出表                TB_CUST_PROFILE          0 行被导出
. . 正在导出表                    TB_CUST_REG          0 行被导出
.
.
.
. 正在导出引用完整性约束条件
. 正在导出触发器
在没有警告的情况下成功终止导出。

SQL>drop tablespace shtd including contents and datafiles;
SQL>create tablespace shtd datafile '/data/shtd/SHTD01.dbf' size1024M EXTENT  MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT  AUTO ;

[oracle@shtdtest shtd]$  imp

时间: 2024-11-03 21:45:24

ora-03297(表空间无法回收)问题的解决方法的相关文章

qq空间-【求助】 C#POST登陆QQ空间的【思路与解决方法】的疑问

问题描述 [求助] C#POST登陆QQ空间的[思路与解决方法]的疑问 10C 我的思路是:1.加载url 尝试获取Html2.分析Html 获取验证码参数3.提交验证码参数和密码 问题:分析时发现他所用的方法是Get,而我所用的方法是POST 然后我发现,参数是存在Cookie里面的. 那么POST提交我的账号和密码的时候,我有这些疑问: 1.建立的通道是不是"i.qq.com"? 2.如果[1]成立的话,那么我就有以下的疑问: 一.因为获取验证码参数的地址和i.qq.com不一样,

Win8磁盘已用空间和文件大小不符的解决方法

  一般来说可以通过右键属性来查看Win8系统磁盘空间使用情况,而且其显示的已用空间也会和实际情况相同.但是有时候也会出现两者不相符的情况,这是怎么回事?这个时候应该怎么办呢? 解决方法: 第一.需要开启显示隐藏文件和系统文件; 第二.在磁盘中包含了类似"System Volume Information"的文件夹,就算我们开启显示隐藏,查看体积也不会将容量计算进去的,不信的话大家可以右键点击System Volume Information文件夹查看属性,一般体积为0字节, 是由于这

win7注册表打不开 注册表编辑器打不开的解决方法

  Windows7注册表编辑器打不开怎么办?很多时候我们在进行一些操作的时候都会使用到注册表,Windows的注册表(Registry)实质上是一个庞大的数据库,它存储这下面这些内容:软.硬件的有关配置和状态信息,计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件的描述.状态和属性;计算机性能纪录和底层的系统状态信息,以及各类其他数据.在win7系统中,我们一般是点击"开始"按钮,再点击"运行...",然后输入regret即可打开注册表编辑器,但是

WinXP系统注册表被禁用的6种解决方法

  今天,我们将要跟大家分享的是,WinXP系统注册表被禁用的6种解决方法.那么,可能会有电脑用户会问:WinXP系统的注册表被禁用了会造成什么后果,严重吗?我们知道注册表是Windows系统里的重要区域,很容易遭受到各种病毒,恶意网站的攻击,让你的注册表被禁用,当你的WinXP注册表被禁用后,你的系统也就变得薄弱,此时相当的危险,因此尽快解禁还需要使用一些手段.下面就告诉大家几招解禁WinXP注册表的方法. 注册表 1.使用工具软件(适用于WinXP及以上系统) 如优化大师.超级兔子等,都有个

网站空间流量超出原因及解决方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 是真的很忙,还是我阿光越来越懒了,想想自己都不知道什么时候写过东西了.今天也是在工作中碰到了一个之前从来都没有碰到过的问题--网站空间流量超了,因于在这么晚的深夜给大家分享下"网站空间流量超出原因及解决方法?" 很多人可能都没有碰到过这个问题,那是因为你的网站没有什么比较耗流量的东西,或者是你们用是二.三线的服务商的网站空

Mybatis动态调用表名和字段名的解决方法_java

一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这种情况下,就需要构建sql来动态传入表名.字段名了.现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助. 动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理.下面让我们先

java表单提交中文乱码的解决方法_java

本文实例为大家分享了java表单提交中文乱码的解决方法,供大家参考,具体内容如下 主页index.xml <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>servlet演示</title> </head> <body> <h2&

Ajax提交表单页面刷新很快的解决方法

注:使用ajax 提交表单时 type类型最好不用submit 用button合适 <form> <div class="col-md-9 col-sm-9 col-xs-12 col-md-offset-3"> <input type="button" class="btn btn-info" value="重置" onclick="return resetaa()">

ThinkPHP表单令牌错误的相关解决方法分析

本文分析了ThinkPHP表单令牌错误的相关解决方法.分享给大家供大家参考,具体如下: 今天在用ThinkPHP做程序的时候,以前用create创建数据的时候,出现了错误提示"表单令牌错误",然后各种百度各种谷歌,得到的网上解答给出了以下的建议 1.清缓存: 用了,我把所有的Cache下的文件都删掉了,并将~app.php和~runtime.php两个文件同时都删掉了,但是没有效果. 2.将TOKEN_ON参数设置为FALSE: 试过了,但是也不行,虽然不提示表单令牌错误了,但是添加到