• ORA01555 快照太旧的问题


    一般导致ORA-01555的原因是:
    1. 回滚段数量不足,导致回滚段Transaction Slot被overwrite
    2. 回滚段剩余空间不足,导致回滚段被overwrite
    3. undo_retention(要大于执行运行时间最长的事务所需的时间)设置太小,导致expired回滚段被overwrite

    Oracle9i以后,rollback segment一般采用自动回滚段管理,涉及的参数有:
    undo_management                      string      AUTO
    undo_retention                            integer     3600
    undo_suppress_errors                 boolean     FALSE
    undo_tablespace                         string      undotbs1
    在自动回滚段管理中,回滚段的数量是由系统来决定的。
    回滚段的扩展则要取决于undo tablespace的设置
    undo_retention的实现是要取决于undo tablespace的大小,即使undo_retention设置很大,但是undo tablespace的大小不足以支持,还是会出现unexpired回滚段信息被overwrite,从而导致ORA-01555。
    回滚段一般有3种状态:active(未提交的事务),expired(已经提交的事务,超过undo_retention),unexpired(已经提交的事务,超过undo_retention)。expired回滚段有可能在后续的应用中被系统overwrite。

    undo tablespace的大小可以根据公式来计算:
    SELECT ((ur * (ups * dbs)) + (dbs * 24)) / 1024 / 1024 AS "Bytes"
      FROM (SELECT VALUE AS ur
              FROM v$parameter
             WHERE NAME = 'undo_retention'),
           (SELECT MAX (undoblks / ((end_time - begin_time) * 86400)) AS ups
              FROM v$undostat),
           (SELECT block_size AS dbs
              FROM dba_tablespaces
             WHERE tablespace_name = UPPER ((SELECT VALUE
                                               FROM v$parameter
                                              WHERE NAME = 'undo_tablespace')))

    可能的解决办法:
    1. 合理设置undo tablespace大小和undo_retention大小
    2. 对于涉及到大数据量的update/delete操作,要分批Commit,减少对回滚段的冲击。
    3. 对于查询SQL,要调整执行规划,增加合适的索引来缩短查询时间。
  • 相关阅读:
    CF351A Jeff and Rounding 思维
    CF352B Jeff and Periods 模拟
    CF352A Jeff and Digits
    小B的询问 莫队分块
    小凯的疑惑 数学
    BestCoder Round #80 待填坑
    [SDOI2009]HH的项链 树状数组 BZOJ 1878
    Blocks poj 区间dp
    [USACO5.4]奶牛的电信Telecowmunication 最小割
    数位dp
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/1289722.html
Copyright © 2020-2023  润新知