学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.Oracle用SCN来作为相对时间点的判断。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语句为开始,包括DDL和DML,以commit或rollback命令结束。事务具备原子性,不是完全提交,就是完全回退。
11每个事务处理只分配一个还原段;一个还原段可以同时服务多个事务处理。如果事务填充完区后还需要更多的空间,事务处理则获取段中下一个区的空间。占用了所有区之后,事务处理会自动回转到第一个区或者请求还原段分配新区。
并行DML实际上会导致事务处理使用多个还原段。
至于undo segment,AUM采用的是事务绑定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表空间通常有两个错误:
1)unable
to extend rollback segment
2)snapshot
too old
15还原段仅用于auto模式,manual模式下,undo段也叫rollback
segment;
16 oracle建议,与还原表空间相关联的数据文件不应启动自动扩展,避免用户因忘了提交事务处理而占有大量的磁盘空间。
17数据库的操作是使用事务来管理的。事务是一个或多个sql语句组成的逻辑操作单位。一个成功执行的sql语句和一个提交的事务是有区别的。
18当事务(transaction)被提交之后,Oracle进行以下操作:
- 撤销表空间(undo tablespace)内部的事务表(transaction table)将记录此次提交(commit),Oracle为此事务分配一个唯一的系统变化编号(system
change number,SCN),并将其记录在事务表中。
- 重做日志写进程(The log writer process,LGWR)将 SGA内重做日志缓冲区(redo
log buffer)中的重做日志条目(redo log entry)写入重做日志文件(redo log file)。同时还将此事务的 SCN也写入重做日志文件。由以上两个操作构成的原子事件(atomic event)标志着一个事务成功地提交。
-
Oracle释放加于表或数据行上的锁(lock)。
-
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段。 作为高级别的DBA是需要知道ORACLE如何使用UNDO段的。 1 Undo表空间及管理方式 ORACLE开始一个事务的时候,会用到表空间。将修改前的数据保存在UNDO段里。 ...
本文用图形化直观的方式形像的描述出ORACLE UNDO段里的事务槽、SCN号、事务控制、事务锁的真正原理。将深奥难懂的锁、事务、一致性形像的展示出来。本文还借供了大量的查询、优化UNDO段相关的SQL语句。非常有价值一...
Undo
UNDO数据的作用是当用户执行DML操作修改数据时,UNDO数据被存放在UNDO段,而新数据则被存放到数据段中,如果事务操作存在问题,就需要回退事务,以取消事物变化。例如,执行完UPDATE语句后,发现应该修改雇员的工资...
undo表空间恢复
这个是做实验时,简单基本的Undo、Redo的操作、在一个winForm中实现,并且可以设置Undo的最大次数。包中除了项目外,还附有报告.
redo undo framework source code redo undo framework source code
c# undo/redo例子 支持文字的样式,颜色修改 动态进度条
oracle版本的undolog建表语句。 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地...
介绍12c新特性Temporary Undo
实现redo,undo操作,来源于网络分享下。
Undo/Redo framework for editing controls in a Windows application 在Windows应用程序中编辑控件的撤销/重做框架。
cpp文件 undo redo 原型设计 部分代码 class Command { public: virtual BOOL UnDo() = 0; virtual BOOL ReDo() = 0; };
针对一个window窗体实现了undo/redo功能,包括textBox,checkBox, listBox, comboBox, radioButton以及按钮焦点变化的实现。可能有些小bug思路仅供参考。完整的工程文件,VS打开即可运行,欢迎评论~ 详细说明参见...
比较深入浅出的描述了基于oracle10g/11g的UNDO表空间的管理
Undo_Redo机制在CAD中的应用, 摘要:为了增强CAD系统的灵活性,提高设计的效率,本文引入设计模式概念,通过对数据对象的持久化.设计出一套支 持无限Undo/Redo和批量化操作的CAD图形绘制系统,文章介绍了各模块的...
在qt下实现了undo的代码
尽管 Undo 信息存储在 Undo 表空间或 Undo 段中,但也会受到 Redo 的保护。换句话说,会把 Undo 数据当成是表数据或索引数据一样,对 Undo 的修改会生成一些 Redo,这些 Redo 将计入日志。 COMMIT 操作 COMMIT ...
专题之Undo工作原理剖析 相当专业的深入剖析 关于oracle 10g中Undo表空间的原理解析 值得看下