ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oralce undo表空间管理与应用

Oralce undo表空间管理与应用

原创 Linux操作系统 作者:lzhtjbh 时间:2008-08-15 22:21:15 0 删除 编辑

      最近整理服务器磁盘空间,发现undo表空间分配了10G的空间,而实际使用的不到100M,无法resize该表空间,最后只好切换表空间,删除原来的undo表空间解决,顺便整理下关于undo表空间的资料。

      undo表空间用于存放 undo数据,当执行DML操作(INSERT,UPDATE和DELETE)时,oracle会将这些操作的旧数据写入到 undo段,在oracle9i之前,管理UNDO数据时使用(Rollback Segment)完成的。从oracle9i开始,管理 undo数据不仅可以使用回滚段,还可以使用 undo表空间。因为规划和管理回滚段比较复杂,所以oracle database 10g已经完全丢弃用回滚段,并且使用 undo表空间来管理 undo数据。 undo数据也称为回滚(ROLLBACK)数据,它用于确保数据的一致性。当执行DML操作时,事务操作前的数据被称为 undo记录。 undo段用于保存事务所修改数据的旧值,其中存储着被修改数据块的位置以及修改前数据,undo表空间作用主要是回退事务、保持读一致性、事务恢复、FlashBack Query。

        在oracle9i以前,回滚段全是手工管理与监控的,创建不好或管理不好的回滚段容易造成性能瓶颈。9i以后,oracle默认采用自动回滚段管理。oracle9i通过下面4个初始化参数来设置自动回滚段管理:
         SQL> show parameter undo;

         NAME                                              TYPE        VALUE
        ------------------------------------ ----------- ------------------------------
       undo_management                       string        AUTO
       undo_retention                                integer     900
       undo_suppress_errors           boolean   FALSE
       undo_tablespace                            string        UNDOTBS1

      undo_management 表示回滚段管理采用的方式,可以是AUTO或Manual,建议采用自动方式。

        undo retenion表示回滚信息在回滚段中保持的时间,默认为秒,但这是一个NO Guarangteed的限制,如果其他事务需要回滚空间,而空间不足时,这些信息仍然被覆盖。oracle10g开始,可以设置undo retenion为0,oracle将启用自动调整来满足最长时间查询的需要,同时,增加了Guarantee控制,可以指定undo表空间是否必须满足undo retenion的限制。

    sql>alter tablespace undotbs1 retention guarantee;
    sql>alter tablespace undotbs1 retention noguarantee;

       如果数据库事务量特别大,可以适当地减少该参数值,避免回滚表空间的过度膨胀,但是过小的值也将导致ora-01555错误的出现并出现Flashback功能的局限。

      undo_suppress_errors表示是否显示某些错误信息,如系统回滚段的操作。

     undo_tablespace表示使用了自动回滚的表空间。一般情况下,建议不要把undo表空间数据文件设置为无限制的自动扩展,主要是防止表空间的过度膨胀。如果undo表空间过度膨胀,而利用率又很低,就需要回收表空间以释放磁盘空间,可以尝试resize,不过大多数情况下应该是无法resize的,这时候就需要切换表空间了,即新建一定大小的undo表空间,删除原来旧的undo表空间。

     确定当前例程正在使用的UNDO表空间
     show parameter undo;

    显示数据库的所有UNDO表空间
    SELECT tablespace_name FROM dba_tablespaces WHERE contents=’UNDO’;

      创建新的undo表空间
      sql>create undo tablespace undotbs2   datafile '{oracle_home}/oradata/sid/undotbs2.dbf ' size 2048M;

     表空间切换
     sql>alter system set undo_tablespace =undotbs2;
     如果使用spfile,可以自动更新文件,如果是pfile,还需要修改参数文件undo_tablespace=‘ undotbs2 ’。

    删除原来的undo表空间
   drop tablespace undotbs1;
   最后直接从OS上删除数据文件,在删除之前需要检查原来的表空间是否还有活动的事务,通过查询dba_rollback_segs,并且v$transaction中没有在undotbs1上的活动事务,保证所有段的状态都是offline。

 

 

 
    

     

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15011739/viewspace-429479/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-29

  • 博文量
    19
  • 访问量
    109121