环境 :10G,windows
客户的oracle数据库由于维护不规范,导致现在那几个datafile大小严重不一致,有的5G,有的500M,
客户想统一搞成2G大小的我目前见解:
500M的搞成2G容易,限制最大为2g就行,
但已经存在的5G的文件,是无法resize到2G的,因为里面没3G的空闲空间,请问应该怎么做啊?

解决方案 »

  1.   

    新建几个2g的表空间,然后把表create table as select到新表空间,然后删除老表,把新表rename成老表名.
      

  2.   

    我的办法可能和二楼有些类似,不过有一点区别:
    1、创建一个新的表空间即可,这个表空间的每一个数据文件都是最大2G,而不是创建多个最大值为2G的表空间,不过所有数据文件大小不得小于以前的最大大小。2、当前系统的表、索引通过DBA_TABLES、DBA_INDEXES等等信息(分区表和分区索引另当别论),根据这些信息自动生成表空间移动的脚本,其实这部分脚本都可以通过一些手段自动生成,比如我喜欢用:
    select 'ALTER TABLE '||t.table_name||' MOVE TABLESPACE DST_TABLESPACE;'
    FROM USER_TABLES t
    where t.temporary='N' and t.partitioned='NO';
    生成将当前用户下“非临时表、非分区表”的移植到指定的目标表空间的脚本,这些内容打印结果,将其拷贝到记事本内部,就直接引用执行了。移动单个表使用ALTER TABLE table_name MOVE TABLESPACE tablespace_name;而索引将其提取DDL进行重建即可,当然主要是表,其余都是比较好说,移植了表一定重编译索引,呵呵。
    分区表移动的语法:
    ALTER TABLE table_name MOVE PARTITION partition_name TABLESPACE tablespace_name;
    二级分区表的二级分区:
    ALTER TABLE table_name MOVE SUBPARTITION sub_partition_name TABLESPACE tablespace_name;