我们的一个常年使用的系统以Oracle 9i作为数据库。昨天,该系统显示“ORA-01653: Unable to extend table ARADMIN.B518C536870918 by 589824 in tablespace ARSYSTEM”,而所有用户都无法向系统加入任何数据。经检查,这个表空间ARSYSTEM有4个数据文件(arsys1-4.dbf)。每个datafile的设置均为预先分配7000MB而不可自动扩展。而报错时,其中一个datafile (arsys4.dbf)还有3200MB空余。这个系统在向ARSYSTEM增加了第5个预先分配7000MB而不可自动扩展的datafile (arsys5.dbf)后回复正常。而这个新增datafile的过程持续了大约15分钟,而新的datafile一下就用了4600MB。问题是系统报错时,用户只是向其中增添很少量(小于1MB)的数据。那么,
1. 为什么这么少量的数据会在第4个数据文件仍有3200MB空间时导致系统报错?
2. 为什么新的数据文件会一下写入了4600MB的数据?这些数据在此之前是保留在内存里吗?如果我们没有及时增加数据文件,而关闭数据库,这一部分数据会不会遗失?怎样可以救回?事实上,我们并不肯定这是数据库的问题还是该应用系统的问题。所以希望高手从Oracle的角度指点迷津。谢谢!

解决方案 »

  1.   

    1  而新的datafile一下就用了4600MB。说明不是你所说的用户只是向其中增添很少量(小于1MB)的数据引起的,而是ORACLE经过评估,发现写入的数据确实比现有空闲空间少。2 可能数据库触发写数据文件的必要事件,所以先前在data buffer里的脏数据,需要全部写入数据文件。
       如果此时你不增加空间,而关闭数据库。如果是正常关闭,ORACLE自动回滚事务。如果异常关闭,再次启动时,ORACLE自动执行实例恢复。当然,异常关闭还是存在丢失数据的可能。
      

  2.   

    学习。dba笔误了
    发现写入的数据确实比现有空闲空间少。-》发现需要写入的数据所需空间确实比现有空闲空间大。
      

  3.   

    1. 对于表空间的问题,个人建议是: 将表空间设为自增长的,增长的大小为100m。 但是要定期的添加表空间的数据文件,当表空间的使用率超过90%时就需要添加数据文件了, 设为自增长的原因就是防止表空间满了而导致数据文件无法写入。 手动添加数据文件是保证数据在磁盘上物理的连续性。 2. db buffer 中的数据无法写入数据文件会导致一连串的问题, 数据库会hang住。 当添加数据文件之后,之前存放在db buffer 中的数据会写道新的数据文件中,然后数据库恢复正常。 3. 而报错时,其中一个datafile (arsys4.dbf)还有3200MB空余。
       而这个新增datafile的过程持续了大约15分钟,而新的datafile一下就用了4600MB。   -- 这个问题我也很疑惑, alert log里有没有其他的信息, 分配一个新的数据文件不需要15分钟这么长时间,我分配一个5g的数据文件,都在1分钟之内,所以可以检查下磁盘有没有异常。  顺便用statspack 分析下数据库。 ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    Q Q 群:62697716 
      

  4.   

    找出那些next_extent比较大的对象
    可能是由于这些对象导致的
      

  5.   

    谢谢!也就是说,有可能该数据触发应用系统向数据库写入大量(>3200MB)数据,但这种情况对我们的系统而言机会似乎不大。有没有可能是数据库自身有什么问题?怎样检查?
      

  6.   

    先查查看,新数据文件上都写了哪些表。再查查这个(些)表的实际数据情况。SELECT segment_name,segment_type FROM dba_extents
    WHERE file_id=your_new_datafile_id;
      

  7.   

    我们见到新增的tablespace里只有一个表。这个表主要用来存文件,事实上,这几年不少的文件都在这张表里。我们不明白的是,既然绝大多数文件都很小(<1M),而每天新增的文件数也有限,为什么会有4600MB数据(表)一下写入新的数据文件的情况?在此之前,难道这张表一直都在内存里?另外,从周二新增数据文件到现在,虽然用户一直可以正常使用系统,但从oracle上看,所有数据文件都没有增大。似乎新的数据都在data buffer中,那我们怎样可以查看data buffer和现状,及其trigger写入的的设置?谢谢!