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

初见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

    Oracle_Undo与Redo的通俗

    UNDO数据的作用是当用户执行DML操作修改数据时,UNDO数据被存放在UNDO段,而新数据则被存放到数据段中,如果事务操作存在问题,就需要回退事务,以取消事物变化。例如,执行完UPDATE语句后,发现应该修改雇员的工资...

    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的代码

    oracle_redo_undo

    尽管 Undo 信息存储在 Undo 表空间或 Undo 段中,但也会受到 Redo 的保护。换句话说,会把 Undo 数据当成是表数据或索引数据一样,对 Undo 的修改会生成一些 Redo,这些 Redo 将计入日志。 COMMIT 操作 COMMIT ...

    专题之Undo工作原理剖析

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

Global site tag (gtag.js) - Google Analytics