<< 返回文章列表

拨开迷雾:关于resize datafile理解的错误

2017年12月22日
黄廷忠
1811

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


数据库版本

image.png


查询表空间中对象的大小

image.png


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


image.png


然后看到表空间中总分配的空间远远大于271974400


查询需要MOVE的对象

查看表空间中的数据文件系统

image.png


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

image.png


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

image.png


创建表

image.png


MOVE对象

image.png


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

image.png


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

image.png


这里看到表空间分配的大小还是远远大于表空间中对象使用的大小


查询对表块的分布情况

image.png

通过上面信息得到,中间其它有很多块并没有使用,并且相隔还很大


dump数据文件位图块

image.png


通过上面的信息可以得到每一个位图块都对应数据文件中一段连续的空间,在分配空间的时候,并不是依次使用位图块,而是同时在多个位图块中使用位图块,估计是为了减少块的挣用,提高并发性。


MOVE到其它表空间

其实通过MOS文档可以发现,ORACLE官方并没有说通过MOVE方式,而是通过DROP方式来实现,下面我们通过MOVE到其它的表空间来使用。


image.png


RESIZE数据文件

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

image.png


这里看到已经除下面了

image.png


已经resize成功


将对象MOVE回来

image.png


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

image.png


再次通过操作系统查看

image.png


----the  end