知识大全 如何移动表达到减小数据文件大小的目的
Posted 空间
篇首语:忧劳可以兴国,逸豫可以亡身。。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何移动表达到减小数据文件大小的目的相关的知识,希望对你有一定的参考价值。
通过move tablespace来完成resize datafile HWM的概念就不在此阐述了 测试环境为Oracle g for Linux 其它版本的一样 我们先创建两个表空间 分别为t_tbs和t_tbs 分别有一个数据文件 大小都是 M 再创建一个test_user用户 给这个用户上述两个表空间的无限限额 并且设置默认表空间是t_tbs [zhangleyi@as zhangleyi]$ sqlplus / as sysdba SQL*Plus: Release Production on Tue Apr : : Copyright (c) Oracle All rights reserved Connected to: Oracle Database g Enterprise Edition Release Production With the Partitioning OLAP and Data Mining options SYS at orcl >alter user test_user default tablespace t_tbs; User altered SYS at orcl >alter user test_user quota unlimited on t_tbs; User altered SYS at orcl >alter user test_user quota unlimited on t_tbs ; User altered 用test_user登录 创建表 TEST_USER at orcl >create table t_obj as select * from dba_objects where rownum< ; Table created TEST_USER at orcl >insert into t_obj select * from t_obj; rows created TEST_USER at orcl >/ rows created TEST_USER at orcl >/ insert into t_obj select * from t_obj * ERROR at line : ORA : unable to extend table TEST_USER T_OBJ by in tablespace T_TBS TEST_USER at orcl >mit; Commit plete TEST_USER at orcl >select sum(blocks) Total Blocks sum(bytes) Total Size from dba_extents where owner= TEST_USER and segment_name= T_OBJ ; Total Blocks Total Size 好 上面我们创建了一个表 并且插入了很多数据 通过dba_extents视图我们可以看到总共用的block数和总共的大小 下面我们用delete删除全部数据 并且插入新的 条数据 TEST_USER at orcl >delete from t_obj; rows deleted TEST_USER at orcl >insert into t_obj select * from dba_objects where rownum< ; rows created TEST_USER at orcl >mit; Commit plete TEST_USER at orcl >select sum(blocks) Total Blocks sum(bytes) Total Size from dba_extents where owner= TEST_USER and segment_name= T_OBJ ; Total Blocks Total Size 再次查看dba_extents视图 发现占用的空间并没有减少 我们尝试resize这个数据文件 file#为 的是t_tbs表空间下面的数据文件 SYS at orcl >alter database datafile resize M; alter database datafile resize M * ERROR at line : ORA : file contains used data beyond requested RESIZE value SYS at orcl >alter database datafile resize ; Database altered 我们发现想resize到 M不可以 但是resize到 就可以了 因为上面查看出来的Total Size是 这个值大于 M而小于 然后我们move这张表到t_tbs 表空间 这个表空间下面的数据文件file#是 EST_USER at orcl >alter table t_obj move tablespace t_tbs ; Table altered TEST_USER at orcl >select sum(blocks) Total Blocks sum(bytes) Total Size from dba_extents where owner= TEST_USER and segment_name= T_OBJ ; Total Blocks Total Size 我们检查dba_extents视图 发现Total Size已经变化了 此时已经可以说明move表是会重新进行block的整理的 同时也重置了HWM 下面我们resize这个数据文件 SYS at orcl >alter database datafile resize M; Database altered SYS at orcl >host [zhangleyi@as ORCL ]$ cd /oracle/oradata/ORCL /datafile/ [zhangleyi@as datafile]$ ls l 总用量 rw r zhangleyi dba 月 : cattbs dbf rw r zhangleyi dba 月 : o _mf_example_ p gpoj_ dbf rw r zhangleyi dba 月 : o _mf_sysaux_ p kny_ dbf rw r zhangleyi dba 月 : o _mf_system_ p kno_ dbf rw r zhangleyi dba 月 : o _mf_temp_ p fzsd_ tmp rw r zhangleyi dba 月 : o _mf_undotbs _ p kog_ dbf rw r zhangleyi dba 月 : o _mf_users_ p kqv_ dbf rw r zhangleyi dba 月 : TEST DBF rw r zhangleyi dba 月 : test dbf 可以看到我们的目的已经达到了 在真实应用中 我们可以将一个表空间中的所有object 全部move到一个新的表空间中 然后drop掉原来的表空间 再从磁盘上删除原来表空间中的数据文件 至于如何得知HWM 我们可以通过analyze之后的数据字典得到 那么如果不进行analyze的话 我们也可以运行下面这个脚本 这个脚本可以用于检查一个object占有的总共block数和处于HWM之上的block数 这当然也就知道了HWM是在什么位置 DECLARE v_total_blocks NUMBER; v_total_bytes NUMBER; v_unused_blocks NUMBER; v_unused_bytes NUMBER; v_last_used_extent_file_id NUMBER; v_last_used_extent_block_id NUMBER; v_last_used_block NUMBER; BEGIN dbms_space unused_space( SCOTT BIGEMP TABLE v_total_blocks v_total_bytes v_unused_blocks v_unused_bytes v_last_used_extent_file_id v_last_used_extent_block_id v_last_used_block); dbms_output put_line( Total Blocks: ||TO_CHAR(v_total_blocks)); dbms_output put_line( Blocks above HWM: ||TO_CHAR(v_unused_blocks)); END; / Total Blocks: Blocks above HWM: PL/SQL procedure successfully pleted Executed in seconds cha138/Article/program/Oracle/201311/18020相关参考