拨开迷雾:关于resize datafile理解的错误
resize数据文件的时候,常常会报ORA-03297错误,也许很多人会认为通过在相同表空间move一下对象,就会自动使用最小的未使用的空间,其实并不是这样的,在MOS文件中遇到ORA-03297错误是直接给出的DROP对象,那么为什么不能使用move,表空间的对象究竟是如何存储的呢?今天我们通过实验一起来认识。
数据库版本

查询表空间中对象的大小

这里可以看到对象总的大小为271974400

然后看到表空间中总分配的空间远远大于271974400
查询需要MOVE的对象
查看表空间中的数据文件系统

原来以为表空间中使用数据文件是均匀的使用,但是后面的测试并不是这样的,下面这样的SQL是之前以后均匀的使用数据文件而写的

由于查询dba_extents需要消耗大量的时间,特别是数据库越大的时候,所以这里我们通过一次性查询出来,并生成一个表来实现只查询一次dba_extents。

创建表

MOVE对象

多次MOVE后,查看当前表空间使用情况

这里看到两个数据文件中分配给对象的最大块的BLOCK_ID相差太多了,也说明数据文件中并不是平均使用数据文件的

这里看到表空间分配的大小还是远远大于表空间中对象使用的大小
查询对表块的分布情况

通过上面信息得到,中间其它有很多块并没有使用,并且相隔还很大
dump数据文件位图块

通过上面的信息可以得到每一个位图块都对应数据文件中一段连续的空间,在分配空间的时候,并不是依次使用位图块,而是同时在多个位图块中使用位图块,估计是为了减少块的挣用,提高并发性。
MOVE到其它表空间
其实通过MOS文档可以发现,ORACLE官方并没有说通过MOVE方式,而是通过DROP方式来实现,下面我们通过MOVE到其它的表空间来使用。

RESIZE数据文件
查询数据分配给对象的最大块的位置

这里看到已经除下面了

已经resize成功
将对象MOVE回来

查看当前数据文件分配的大小

再次通过操作系统查看

----the end