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


? dba_free_space 可以查看当前表空间文件的未使用区间,如果查询到了过多的结果,其实也是当前表空间内碎片过多
几个查询语句--查询表空间及其物理文件位置select t1.name,t2.name from v$tablespace t1,v$datafile t2where t1.ts# = t2.ts#;--查询数据库的 block_sizeselect value from v$parameter where name='db_block_size';--查看指定表空间内指定段的分区信息select * from dba_extents t where t.FILE_ID = 00 and t.segment_name = 'XXX';整理段的语句--需要先打开行移动,否则有 ORA-10636 ROW MoVEMENT is not enabled的报错alter table history.TB_FT_BALANCE enable row movement;alter table history.TB_FT_BALANCE shrink space;--shrink segment的操作会改变数据的rowid--另外看到有人说执行shrink space时之前的游标会失效,生产上还是要慎重一点alter table history.TB_FT_BALANCE deallocate unused; alter table history.TB_FT_BALANCE disable row movement;关于 Row Movement,可以看这里:Enmotech – 深入解析 Row Movement 的原理和性能影响与关联
上面说了,oracle一般会为表分配一个段,所以可以只操作曾经有过大量数据后来又被删除的表,压缩表段其实也就是整理表碎片
改变表空间物理文件大小的语句如下alter database datafile '/u01/test01/t11.dbf' resize 5m;--参数自行修改,另外如果指定的空间大小无法存放已有的数据,此处会报错--至于具体应该指定的数值可使用如下语句获取--获取表空间文件编号 select file#,name from v$datafile;--此处取出表空间文件的file#编号 --通过最大块确定指定文件占用的空间select (max(block_id) + blocks)*8/1024 from dba_extents where file_id={$file#}; --单位为 M,块大小采用默认值 8K 。-- alter时resize的参数必须要大过查询结果如果表空间已经被占用过,即使将表数据删除,上面的语句查询出来的结果也并不会差太多,因为被占用的空间并没有被释放 。
3、个人操作需要声明的是在进行此处的操作时,我并不知道加入 compress 参数的做法,此时的物理文件也有30多G 。
先使用下方语句查看了一下占用空间较大的segment
--指定file编号,获取当前文件内的段信息select t.owner,t.segment_name,t.partition_name,--分区名,一个段可能有多个分区t.segment_type,--段类型t.tablespace_name,t.BYTES/(1024*1024) as MB, --段大小,单位是MBt.BYTES,--段的大小,单位是 bytet.initial_extent--初始化时分配的大小from dba_segments t where t.relative_fno = {$file#} order by t.BYTES desc;找到了一个占用达1G,但实际没有数据的的表段,使用如下语句进行表段的整理:
alter table history.XXXX enable row movement;alter table history.XXXX shrink space;--shrink segment的操作会改变数据的rowid,使已打开的游标失效alter table history.XXXX deallocate unused;alter table history.XXXX disable row movement;操作后可再次执行段信息查询语句,会发现该段占用空间明显缩小 。
发现上述操作确实可以使得表段占用空间减少后,我并没有去怀疑网上直接resize文件的做法是否可行,反而是在查看了dba_segements 的查询结果后,发现需要执行该套操作的表段实在有点多,出于偷懒的想法,才重新进行百度,并找到了加入 compress 参数的建议 。在实操验证后,发现物理文件缩小到了15G,只是这个大小仍然远远超过我的承受范围,所以我还是准备采用上面说到的方法进行操作 。
在一张几十万数据的测试表内删除了数据后,对该表段执行了压缩操作,此时,有些文章就会告诉你可以进行alter database datafile ‘xxx’ resize 0m 的操作,利用sql查询到当前实际占用的空间后,实操进行验证,过称中触发了ORA-03297的错误,当时猜测是因为释放出来的空间仍以碎片形式存在,数据库系统并不会将数据依次前移去填充空白碎片区间,于是自己分两种情况进行了验证,得出了这种方法并不通用的结论,验证时区分的两种情况以及对 shrink space 的说明请查看本节开篇的总结了解 。


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

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