zoukankan      html  css  js  c++  java
  • Oracle数据库 ORA-01555 快照过旧 (undo表空间:撤销表空间)

    UNDO表空间用于存放UNDO数据,当执行DML操作时,oracle会将这些操作的旧数据写入到UNDO段,以保证可以回滚或者一致读等,而临时表空间主要用来做查询和存放一些缓冲区数据。你听说UNDO也是临时表可能是因为这两个表空间都不会永久保存数据的原因。
    -------------------------------------------------------------------------
    oracle undo表空间

    undo表空间用于存放undo数据,当执行DML操作(insert、update、delete)时,oracle会将这些操作的旧数据写入到undo段。

    undo数据的作用

    1.回退事务

    当执行DML操作修改数据后,旧数据被存放在undo段中。只要数据为提交、回滚段未写满或者回滚段为超时的情况下,旧数据都能被回滚回来。

    2.读一致性

    通过DML操作后的数据没有提交之前,其他用户读取的数据都是回滚段里面的旧数据。

    使用undo参数

    1.undo_management

    该初始化参数用于指定undo数据的管理方式。如果要使用自动管理模式,必须设置为auto,如果使用手工管理模式必须设置该参数为manual,使用自动管理模式时,oracle会使用undo表空间管理,使用手工管理模式时,oracle会使用回滚段管理undo数据。需要注意,使用自动管理模式时,如果没有配置初始化参数UNDO_TABLESPACE,oracle会自动选择第一个可用的UNDO表空间存放UNDO数据,如果没有可用的UNDO表空间,oracle会使用SYSTEM回滚段存放UNDO记录,并在ALTER文件中记载警告。

    2,UNDO_TABLESPACE

    该初始化参数用于指定例程所要使用的UNDO表空间,使用自动UNDO管理模式时,通过配置该参数可以指定例程所要使用的UNDO表空间.

    在RAC(Real Application Cluster)结构中,因为一个UNDO表空间不能由多个例程同时使用,所有必须为每个例程配置一个独立的UNDO表空间.

    3,UNDO_RETENTION

    该初始化参数用于控制UNDO数据的最大保留时间,其默认值为900秒,从9i开始,通过配置该初始化参数,可以指定undo数据的保留时间,从而确定倒叙查询特征(Flashback Query)可以查看到的最早时间点.

    手工管理回滚段的规划:

    SQL> show parameter  undo;

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    undo_management                string      AUTO

    undo_retention                       integer    900

    undo_tablespace                    string      UNDOTBS1

    SQL> show parameter  transactions;

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    transactions                         integer     187             ----------系统准备支持的事务连接数量。

    transactions_per_rollback_segment    integer     5       --------------每个回滚段支持的事务连接数量。回滚段数=187/5

    SQL> show  parameter rollback;

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ----------

    fast_start_parallel_rollback         string      LOW

    rollback_segments                      string ----------------------设置回滚段的数量

    transactions_per_rollback_segment    integer     5

    SQL>

    当数据库启动的时候会判断私有回滚段是否满足我们事务的要求,如果满足则打开数据库;否则数据库会去找公有回滚段。

    解决办法:

    用户user1对表进行了更新操作,用户user2在user1还没有进行提交前读表中数据,而且是大批量的读取(打个比方:耗时3分钟)而在这3分钟内user1进行了提交操作,那又会产生什么影响呢?这个时候怎么保证读写一致性呢?这个时候DBMS就要保证有足够大的undo表空间来存放修改前的数值,,以保证user2读取的数据是修改前的一致数据.然后下次再读取时候就是更新后的数据了.
    ora-01555快照过旧就是因为undo空间不够大,其中一部分undo数据被覆盖了,用户无法获得修改前的数据。
    undo数据分为三种:
    活动的undo:未提交事务的undo数据,这些undo数据永远不能覆盖,用于回滚rollback事务。
    过期的undo:已提交事务的undo数据,这些undo数据可以覆盖。
    未过期的undo:事务已提交,但事务提交前,有些查询正在进行,它要读取的是提交前的数据,这部分数据就是未过期数据。如果这部分undo数据被覆盖了,就会发生ora-01555错误。

    一个解决方法是,指定undo表空间参数UNDO_TABLESPACE,并将undo空间管理方法设置成自动扩展:UNDO_MANAGEMENT=AUTO。
    这种方法可能产生的结果是:
    因为undo表空间装了太多未过期(unexpired)的undo数据,新的transaction无法向其中写入undo数据,这时transaction就会发生ORA-30036错误。

  • 相关阅读:
    Docker 使用Calico插件配置网络
    Fluentd插件rewrite-tag-filter介绍
    Fluentd Regexp patterns
    gdb 打印数据结构
    g++ -g
    《100-gdb-tips》——查看调用堆栈
    dbghelp.dll 定位异常奔溃信息
    debug skill:烫烫烫屯屯屯
    sizeof()和strlen()的区别
    指针和引用的区别
  • 原文地址:https://www.cnblogs.com/pangblog/p/3278473.html
Copyright © 2011-2022 走看看