由于在最初建立数据库时知识有限,数据库设计不合理,所有的用户表都放在了system表空间下,其中有3个带有blob或者longraw字段的表,主要用来存放文件。总空间超过了80G,每天的增长量约200M.
system原来共有3个数据文件,现在空间已经超过了80G,最近出现表空间不可扩展错误。给System表空间增加数据文件也没有用,好像根本不往新增的数据文件中写。
由于对系统的认识有限,请教高人指点,在Oracle中,system表空间的大小有什么特殊的约定么?
我现在想把重新建立新的表空间,把现在system表空间里面的用户表都导入到新的表空间中,这种做法可不可行?非得重新建立数据库么?由于现在数据库的容量已经很庞大了,而且只有一台服务器在运转,我担心会出问题。有没有哪位大哥遇到过类似的问题,有没有好的解决方案?

解决方案 »

  1.   

    1.自由范围的碎片整理 
    表空间的pctincrease值为非0 
    可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如: 
        alter tablespace temp
          default storage(pctincrease 1);这样SMON便会将自由范围自动合并。也可以手工合并自由范围: 
          alter tablespace temp coalesce;2.段的碎片整理 
     段由范围组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典dba_segments,范围的信息可查看数据字典dba_extents。如果段的碎片过多, 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用Import/Export(输入/输出)工具来完成。 
    Export()命令有一个(压缩)标志,这个标志在读表时会引发Export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数--等于全部所分配空间。若这个表关闭, 则使用Import()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:
    exp user/password file=exp.dmp compress=Y grants=Y indexes=Y
           tables=(table1,table2);
           
    若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表: 
    imp user/password file=exp.dmp commit=Y buffer=64000 full=Y这种方法可用于整个数据库。
      

  2.   

    谢谢楼上二位。现在我要动的单表已经有40G以上了,由于没有第二台服务器,所以导出、删除、导入的方法不敢尝试:)
    我想的重新建立表空间的想法是:
    先建立一个新的表空间,然后在新的表空间中建立一个与要导的表同构的表,然后将原表数据逐条导入新表,测试新表数据,删除原表,重命名新表。整理System表空间。
    不知道这个想法能不能很好地实现。大家有没有好的建议?
      

  3.   

    操作系统?32bit或者64bit?
    给System表空间增加数据文件也没有用,好像根本不往新增的数据文件中写。
    查看数据库的alertlog文件看看有什么错?
    或许你的数据库已经很危险了,80G数据在3个数据文件中,如果你是windows 32bit的操作系统,那么很可能连exp都无法导出数据了。
    你需要作的是,立刻创建一个新的表空间,每个数据文件给2G,然后
    create new_table tablespace new_tbs as select * from old_table;
    然后创建主键,索引