`
java-mans
  • 浏览: 11454532 次
文章分类
社区版块
存档分类
最新评论

初见undo段

 
阅读更多

rollback segment目标:概念上清晰,原理上了解,使用上熟悉

1 undo段的定义:磁盘上的一段空间。

2当一个事务开始时,先把变化前的数据和变化后的数据写入log buffer中,然后把变化前的数据写入回滚段,最后才在database buffer cache中修改数据。

例如:

Update emp set sal=4000 where ename=SCOTT’;

首先,LGWR会把4000和旧值3000写入log buffer

然后,把3000和一些相关信息写入rollback segment

最后,把4000修改到database buffer cache

3查看事务回退率:

SQL> select name,value from v$sysstat where name in ('user commits','transaction rollbacks');

事务回退率=transaction rollbacks/transaction rollbacks+user commits

如果事务回退率过高,则要引起重视!

回退:把rollback segment中的数据读出写入database buffer cache中,而且回退的变化本身也要写入log buffer中。

4任何对数据库的改变都会产生SCN.OracleSCN来作为相对时间点的判断。Oracle查询的结果集是根据时间点来判断的。

5通过回滚段获取数据的本质是把database buffer cache中的数据块做一份拷贝,然后将回滚段记录内容恢复到该块中,然后查询使用该块来读取。

6回滚段的块存在于database buffer cache中,回滚段所占的块的数量可以通过:

SQL> select count(*) from x$bh where state=3;

7当事务产生时,数据库会给事务分配一个回滚段。回滚段分为系统回滚段和非系统回滚段。同一个事务不能跨越回滚段,即使需要拓展,即使其他回滚段还很空闲。我们通过undo_management参数来控制使用哪种方式,如果设为auto就使用UNDO表空间,这时必须要指定一个UNDO表空间。如果设为manual系统启动后使用rollbacksegment方式存储undo信息。如果系统没有指定undo_management,那么系统默认以manual方式启动,即使设置了auto方式的参数,这些参数将被忽略。

当实例启动的时候,系统自动选择第一个有效的undo表空间或者是rollbacksegment如果没有有效的可用的undo表空间或者是回滚段,系统使用systemrollbacksegment这种情况是不被推荐的,当系统运行在没有undo的情况下,系统会在alert.log中记录一条警告信息。

8一个回滚段至少包含2个区。每个回滚段有一个回滚段头,段头是个block,里面记录了事务表信息,当产生一个事务时,就在段头的事务表中记录一条信息。

Undo数据使用extent 1的第二个

可以自行指定使用哪个回滚段:

Set transaction use rollback segment段名

找出有哪些段:

SQL> select segment_id,segment_name from dba_rollback_segs;

9一个database中可以没有undo tablespace,此时事务会使用system rollback segment;也可以有多个undo tablespace,但是每个instance有且仅会使用其中的一个undo tablespace

10事务处理以首个可执行的sql语句为开始,包括DDLDML,以commitrollback命令结束。事务具备原子性,不是完全提交,就是完全回退。

11每个事务处理只分配一个还原段;一个还原段可以同时服务多个事务处理。如果事务填充完区后还需要更多的空间,事务处理则获取段中下一个区的空间。占用了所有区之后,事务处理会自动回转到第一个区或者请求还原段分配新区。

并行DML实际上会导致事务处理使用多个还原段。

至于undo segmentAUM采用的是事务绑定segment的算法。(尽量一个事务一个undo segment)
首先尝试每个undo segment绑定一个事务,每个undo segment只被一个事务使用。
如果发现undo segment都用了,则会尝试使脱机的undo segment联机以使用。
如果发现没有可用的undo segment联机,则会尝试创建一个新的undo segment
如果都不成功,比如没有可用空间了,这种情况下,不同的事务才会在一个undo segment里同时运行。

既然有undo segment的扩张,就有undo segment的收缩
SMON
负责
12小时收缩一次,删除那些idle状态的extents
DML需要用到UNDO时,发现不够空间,会唤醒SMON进行一次收缩,也就是说将其他undo segment里暂时没被使用的extents拿来用。

12通过v$transaction查看,哪些事务处理被分配到哪些还原段。

13 undo表空间:

仅存放旧值;

只能与单个实例相关联。

任何给定的时间,任何给定的实例只能有一个是当前可写undo表空间

【尽管数据库可能有多个undo表空间,但是一次只能有一个undo表空间被指定为可写入旧值的当前undo表空间】

14 undo表空间通常有两个错误:

1unable to extend rollback segment

2snapshot too old

15还原段仅用于auto模式,manual模式下,undo段也叫rollback segment

16 oracle建议,与还原表空间相关联的数据文件不应启动自动扩展,避免用户因忘了提交事务处理而占有大量的磁盘空间。

17数据库的操作是使用事务来管理的。事务是一个或多个sql语句组成的逻辑操作单位。一个成功执行的sql语句和一个提交的事务是有区别的。

18当事务(transaction)被提交之后,Oracle进行以下操作:

  1. 撤销表空间(undo tablespace)内部的事务表(transaction table)将记录此次提交(commit),Oracle为此事务分配一个唯一的系统变化编号(system change numberSCN),并将其记录在事务表中。
  2. 重做日志写进程(The log writer processLGWR)将 SGA内重做日志缓冲区(redo log buffer)中的重做日志条目(redo log entry)写入重做日志文件(redo log file)。同时还将此事务的 SCN也写入重做日志文件。由以上两个操作构成的原子事件(atomic event)标志着一个事务成功地提交。
  3. Oracle释放加于表或数据行上的锁(lock)。
  4. Oracle将事务标记为完成。

19正常来说,在整个undo块链表上,从第一块到最后一块,SCN呈递减,CR读取时,只要找到ITL事务槽的SCN号小于或等于查询SCN便ok。但是,ORA-01555,便是当前的undo块里记录的ITL事务槽的SCN号比上一个undo块里记录的SCN号还要大,当前要查找的undo块被被其他数据块覆盖。

20如果不指定某个UNDO表空间做默认的undo表空间,则系统会查找第一个undo表空间。

21 ora-01555出现的前提:

1)查询的结果在查询阶段被更改;

2)undo块被覆盖。

22

在开始处理数据时 给 指定记录加锁。
所谓加锁就是 update table1 set no = no where no = 1
这样的语句,作用是除了你别人不能修改这条记录。

23一般避免死锁的办法就是使用虚假更新。

分享到:
评论

相关推荐

    相克军 ORACLE 讲座 深度剖析UNDO段 笔记.doc

    里面也有段区块,ORACLE自动建立生成、自动使用UNDO段。 作为高级别的DBA是需要知道ORACLE如何使用UNDO段的。 1 Undo表空间及管理方式 ORACLE开始一个事务的时候,会用到表空间。将修改前的数据保存在UNDO段里。 ...

    相克军 ORACLE 讲座 深度剖析UNDO段 笔记

    本文用图形化直观的方式形像的描述出ORACLE UNDO段里的事务槽、SCN号、事务控制、事务锁的真正原理。将深奥难懂的锁、事务、一致性形像的展示出来。本文还借供了大量的查询、优化UNDO段相关的SQL语句。非常有价值一...

    Undo

    Undo

    undo表空间恢复

    undo表空间恢复

    C#做的简单的Undo、Redo功能的实现

    这个是做实验时,简单基本的Undo、Redo的操作、在一个winForm中实现,并且可以设置Undo的最大次数。包中除了项目外,还附有报告.

    redo undo framework source code

    redo undo framework source code redo undo framework source code

    c# undo/redo例子

    c# undo/redo例子 支持文字的样式,颜色修改 动态进度条

    seata-oracle版undolog.sql

    oracle版本的undolog建表语句。 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地...

    12c 新特性-Temporary Undo

    介绍12c新特性Temporary Undo

    mfc support redo/undo

    实现redo,undo操作,来源于网络分享下。

    C# undo\redo框架

    Undo/Redo framework for editing controls in a Windows application 在Windows应用程序中编辑控件的撤销/重做框架。

    undo redo 原型设计

    cpp文件 undo redo 原型设计 部分代码 class Command { public: virtual BOOL UnDo() = 0; virtual BOOL ReDo() = 0; };

    C#实现的undo/redo的window窗体

    针对一个window窗体实现了undo/redo功能,包括textBox,checkBox, listBox, comboBox, radioButton以及按钮焦点变化的实现。可能有些小bug思路仅供参考。完整的工程文件,VS打开即可运行,欢迎评论~ 详细说明参见...

    UNDO表空间管理

    比较深入浅出的描述了基于oracle10g/11g的UNDO表空间的管理

    Undo_Redo机制在CAD中的应用

    Undo_Redo机制在CAD中的应用, 摘要:为了增强CAD系统的灵活性,提高设计的效率,本文引入设计模式概念,通过对数据对象的持久化.设计出一套支 持无限Undo/Redo和批量化操作的CAD图形绘制系统,文章介绍了各模块的...

    在qt下实现了undo的代码

    在qt下实现了undo的代码

    专题之Undo工作原理剖析

    专题之Undo工作原理剖析 相当专业的深入剖析 关于oracle 10g中Undo表空间的原理解析 值得看下

    oracle 收缩undo表空间

    oracle 收缩undo表空间,需要收缩Undo表空间时特别有用。

    收缩Oracle数据库的undo表空间

    演示如何收缩Oracle数据库的undo表空间

Global site tag (gtag.js) - Google Analytics