`

缩小数据文件尺寸报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等
如果我的做法有什么不足之处请执教,谁有更好的办法欢迎提供,本人水平有限。

分享到:
评论

相关推荐

    解决linux磁盘扩容出现Bad magic number in super-block while trying问题

    与EXT系列文件系统不同,XFS有其特定的扩容工具——`xfs_growfs`,它只支持增大已存在的XFS文件系统,而不能缩小。当我们尝试使用`resize2fs`命令去扩展XFS文件系统时,就会出现上述错误。 解决这个问题的步骤如下...

    Oracle 表空间 收缩

    直接尝试收缩表空间时,可能会遇到错误ORA-03297:“文件包含在请求的RESIZE值以外使用的数据”。这是因为Oracle数据文件在有数据的情况下能够自动扩展,但无法自动收缩。因此,如果直接尝试修改数据文件的大小,...

    Oracle9i的init.ora参数中文说明

    并确保在同一事务处理种对相同数据的两次查询看到的是相同的值。 值范围: TRUE | FALSE 默认值: FALSE row_locking: 说明: 指定在表已更新或正在更新时是否获取行锁。如果设置为 ALWAYS, 只有在表被更新后才获取...

    北京-ORACLE畅享互联科技

    调整数据文件大小通常有两种方式:增大或缩小。增大数据文件的大小可以通过以下命令完成:`ALTER DATABASE DATAFILE 'D:\oracle\users01.dbf' RESIZE 20M;`。而减小数据文件的大小则相对复杂,通常需要先将数据迁移...

    oracle优化资料.docx

    Oracle数据库优化是一个重要的主题,特别是在处理大数据量时。在Oracle中,大表的管理与空间回收是关键的优化策略,因为这直接影响到数据库的性能和效率。以下是对Oracle大表删除数据后,如何回收空间的一些详细说明...

    在ORACLE移动数据库文件

    在示例中,数据文件app1_data.ora被从/ora/oracle7/data1移动到/ora/oracle7/data2,并通过ALTER DATABASE命令更新了数据库的元数据。 2. ALTER TABLESPACE方法则适用于那些不属于SYSTEM表空间,且不包含活跃回滚段...

    Oracle表空间命令

    执行此命令后,Oracle会自动扩展或缩小指定数据文件的大小到1000MB。需要注意的是,在调整数据文件大小之前,最好先备份数据文件以防止意外丢失数据。 #### 三、查询表空间使用情况 查询表空间使用情况有助于监控...

    oracle初始化参数设置

    这种方式适用于扩展或缩小现有数据文件的大小。 ##### 2. 数据文件大小调整注意事项 - **备份**:在调整数据文件大小之前,最好先对数据库进行完整备份。 - **在线调整**:如果数据库处于打开状态,可以在线调整...

    Oracle数据库练习.pdf

    7. 错误,数据文件的大小可以调整,可以增大或缩小。 8. 正确,Oracle至少需要2个重做日志文件。 9. 正确,SMON在启动时可以进行自动恢复。 10. 错误,`STARTUP FORCE`会强制启动数据库到Open状态,而非Mount。 **...

    ORACLE9i_优化设计与系统调整

    §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1 数据文件 26 §1.2.2 控制文件 26 §1.2.3 重做日志文件 26 §1.2.4 其它支持文件 26 §1.3 数据块、区间和段 28 §...

    Oracle常用傻瓜问题1000问

    3. **表空间与数据文件**:表空间的用途,如何创建、扩展或缩小表空间,以及数据文件的管理。 4. **用户与权限管理**:创建和管理数据库用户,分配权限,理解系统、连接和对象权限的区别。 5. **SQL基础**:SQL...

    由重启引起的Oracle RAC节点宕机分析及追根溯源.docx

    根据Oracle文档中的描述,此错误与RAC中的“clsc_disc_orphans”功能有关,该功能用于处理会话断开连接时的线程管理。Oracle Bug ID 9132429(LNX64-10205-CRS: NODE CRASH AFTER 5 MINUTES OF HANG/RESUME ocssd....

    Oracle在unix和win2000中的区别

    首先,Oracle数据库的核心功能在Unix和Windows 2000上基本保持一致,它们都支持SQL语法、数据存储和事务处理。然而,由于操作系统底层机制的不同,Oracle在不同平台上表现出的性能和可扩展性可能有所差异。Unix以其...

    Oracle数据库10g独立软件供应商和客户的应用系统性能.pptx

    然而,随意修改 init.ora 文件将减慢系统速度,Oracle 建议仅在理由充分的情况下才修改参数。默认配置经过了全面测试和慎重权衡,将移植到 10g 以消除非标准化参数设置极好的特性源自优良的设计。 在实际应用中,...

    Oracle修改表空间大小的方法

    在Oracle数据库管理中,表空间(Tablespaces)是存储数据文件的逻辑结构,用于组织数据库对象,如表、索引等。随着数据库的使用,表空间可能会耗尽,需要进行扩展以满足存储需求。本篇文章将详细介绍如何通过Oracle...

    如何进行sql优化

    这样,能过滤掉最多记录的条件在最后执行,可以更快地缩小数据范围。 4. **避免在SELECT子句中使用'*'**:使用通配符'*'来获取所有列虽然方便,但效率低下。ORACLE需要通过查询数据字典来转换'*',这增加了额外的...

Global site tag (gtag.js) - Google Analytics