数据库迁移的两种方法 oracle数据库迁移方案对比( 四 )


在明确知道压缩段无法满足我的需求后,整理得到的碎片空间会如何利用又引起了我的兴趣,于是在另外一个表空间内我对两张表分别写入了几百万数据,然后使用delete删除了一部分数据并整理得到了一部分未使用的碎片空间,查询dba_free_space后,得到未使用的block_id范围 。在之前的两张表AB以及一个未整理过的C表内插入数据,发现碎片的block会按照使用者的顺序进行分配,也就代表在A表内整理得到的空间并不局限于只能A使用,其他的 B,C表也可以分配空白区域的block,其实到这里,我才明白了Extent存在的意义,段所代表的上层无需知道实际存储数据的地址,只需要知道区号即可,根据extent_id再去查找实际使用的block.
到这之后,无奈又得重新找方法,然后找到了 一泽涟漪 – Oracle收缩表空间这篇文章,博主的方法其实是将数据移到了新的表空间,然后将其指定为原用户的默认表空间 。看过之后,因为担心 lob 字段的数据会不会丢失,也不知道当前表空间下的SP,Function会怎么样,所以我并没有按照这种方法操作 。如果想使用move的方法,建议同时阅读一下这篇文章菜鸟程序员 – ORACLE修改表空间方法,这里面有对 lob的一些说明 。
进展到这其实陷入了一种僵局,直到我无意中看到dba_segments的 initial_extent字段,发现几个对象的初始值过大 。于是使用工具 rebuild 了这几张表,重建之后查询段信息发现多了几条段名称乱码的数据,该工具重建时没有释放表占用的空间,如果读者有重建表的需求,建议先保留表相关的定义及表数据,然后删除重建 。
delete、drop、truncate的区别可查看weixin_33871366 – oracle中delete drop truncate的用法和区别 。
对于未被释放的段,查找无果后,决定重新对该用户执行 exp/imp 的操作,操作后惊喜的发现,新的表空间内已经不存在那几个乱码的段信息,而且物理文件也缩小到了我可以接受的程度,至此,缩小表空间的物理文件终于是找到了一个合适的方法 。在此之后也想到了这和move tablespace其实本质上是一样的 。
4、Move Tablespace本节是对上面提到的两篇文章的一些记录,move tablespace的方法我并没有测试,另外我感觉move更有用的点应该是可以移动表到新的表空间(建表时搞错表空间的经历,不会只有我有吧 >_<)
移动数据段至新的表空间时,对表和索引的是一种处理方式,对lob字段是另一种处理方式系统会为 lob 字段分配一个segment 用于存放数据,关于两种处理方式可以看获取更多的说明 。上方两条说明是为了下面的操作步骤做准备,下面开始使用move 。新建一个表空间create tablespace TS_New Datafile ‘E:\TS_New.dbf’ size 200M autoextend on next 100M maxsize unlimited extent management local;生成 table 的move语句select ‘alter table ‘ || owner || ‘.’ || segment_name || ‘ move tablespace TS_New;’ sqltext from dba_segments where tablespace_name = ‘TS_HISTORY’ and segment_type=’TABLE’;生成 index 的move语句 select ‘alter index ‘ || owner || ‘.’ || segment_name || ‘ rebuild tablespace TS_New;’ sqltext from dba_segments where tablespace_name = ‘TS_HISTORY’ and segment_type=’INDEX’;生成 lob段的 move语句select ‘alter table ‘ || owner || ‘.’ || table_name || ‘ move lob(‘ || column_name || ‘) store as(tablespace TS_New);’ sqltext from dba_lobs where tablespace_name = ‘TS_HISTORY’; lob段数据的迁移建议查看菜鸟程序员 – ORACLE修改表空间方法,里面对语句及参数介绍的比较明白,而且还考虑了表,分区表的情况,这里我就不搬过来了 。5、回顾一下耗费了N多N多的时间,我得到了什么呢?最重要的其实倒不是缩小物理文件的方法,而是对表有了更深的理解 。以前是在数据存放容器的层次看待数据库中的表,我只知道数据放进去了,用的时候来拿就好 。现在倒是了解了数据表的一些更细节的知识点 。Segment,Extent,Block这三个概念以及相关的几个系统视图,这就是收获 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: