知识大全 如何移动表达到减小数据文件大小的目的

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

相关参考