ORA-03297 的问题(无法收缩文件)

[复制链接]
查看11 | 回复8 | 2010-10-8 09:28:52 | 显示全部楼层 |阅读模式
今天发现一个数据文件物理空间超大,但是里面数据对象很少,而且都占据很小的空间,使用alter table move tablespace命令将几个HWM较高的对象移走后,执行如下sql:
SELECT file_name,
2CEIL( (NVL(hwm,1)*8192)/1024/1024 ) smallest,
3CEIL( blocks*8192/1024/1024) currsize,
4CEIL( blocks*8192/1024/1024) -
5CEIL( (NVL(hwm,1)*8192)/1024/1024 ) savings
6FROM DBA_DATA_FILES a,
7( SELECT file_id, MAX(block_id+blocks-1) hwm
8FROM DBA_EXTENTS
9GROUP BY file_id ) b
10WHERE a.file_id = b.file_id(+)
11AND A.TABLESPACE_NAME='&tbs_name'
12;
Enter value for tbs_name: USERS
old11: AND A.TABLESPACE_NAME='&tbs_name'
new11: AND A.TABLESPACE_NAME='USERS'
FILE_NAME
SMALLEST CURRSIZESAVINGS
-------------------------------------------------- ---------- ---------- ----------
/home/ora10g/oradata/db1/users01.dbf
19781433612358
/mnt/db/oradata/db1/STANDBY/datafile/o1_mf_users_953 1000 47
50n6h5ml_.dbf
此时,/home/ora10g/oradata/epay/users01.dbf按照正常逻辑应该可以resize 到2G左右,但实际执行时却发现:
alter database datafile '/home/ora10g/oradata/epay/users01.dbf' resize 3G;
alter database datafile '/home/ora10g/oradata/epay/users01.dbf' resize 3G
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value
又用如下sql查询了一下users表空间上的数据对象:
select owner,segment_name,MAX(block_id+blocks-1),sum(bytes/1024/1024/1024) tatal_size
2from dba_extents
3where tablespace_name='USERS'
4group by owner,segment_name;
OWNER
SEGMENT_NAME
MAX(BLOCK_ID+BLOCKS-1) TATAL_SIZE
------------------------------ ------------------------------ ---------------------- ----------
USER1
TEST
120 .000061035
SYS
I_AUD1
212104.109375
SCOTT
PK_DEPT
24 .000061035
SYS
AUD$
253064 2.75
SYS
SYS_IOT_TOP_58889
72 .000061035
SCOTT
BONUS
48 .000061035
SCOTT
SALGRADE
56 .000061035
SCOTT
EMP
32 .000061035
SCOTT
PK_EMP
40 .000061035
SCOTT
DEPT
16 .000061035
显然,HWM为253064,乘以块大小8192后约为1.93G,为什么resize不了呢?
回复

使用道具 举报

千问 | 2010-10-8 09:28:52 | 显示全部楼层
你只是移了几个高hwm的对象,数据文件上还有其他对象可能正好在数据文件尾部,所以不能resize。
回复

使用道具 举报

千问 | 2010-10-8 09:28:52 | 显示全部楼层
怎么那么多99.9,99.7的,你全部手动增大看看
回复

使用道具 举报

千问 | 2010-10-8 09:28:52 | 显示全部楼层
所有对象应该都列出来了吧?
我也怀疑数据文件尾部会有对象,但改怎么查啊?
回复

使用道具 举报

千问 | 2010-10-8 09:28:52 | 显示全部楼层
select max(block_id) from dba_extents;
用这个数值乘以db_block_size
回复

使用道具 举报

千问 | 2010-10-8 09:28:52 | 显示全部楼层
为什么要select max(block_id) from dba_extents?
应该要加上要收缩的file_id才对吧,
select max(block_id) from dba_extents where file_id=4;
MAX(BLOCK_ID)
-------------
244873
乘以8192也就是不到2G啊
回复

使用道具 举报

千问 | 2010-10-8 09:28:52 | 显示全部楼层
你把这个文件涉及的对象都收缩一下呢?
alter table 表名 enable row movement;
alter table 表名 shrink space;
alter table 表名 disable row movement;
回复

使用道具 举报

千问 | 2010-10-8 09:28:52 | 显示全部楼层
还有index 吧
回复

使用道具 举报

千问 | 2010-10-8 09:28:52 | 显示全部楼层
alter table 表名 shrink space cascade;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行