初见undo段

长平狐 发布于 2012/09/19 13:56
阅读 161
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

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系统启动后使用rollback segment方式存储undo信息。如果系统没有指定undo_management,那么系统默认以manual方式启动,即使设置了auto方式的参数,这些参数将被忽略。

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

 

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

Undo数据使用extent 1的第二个

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

Set transaction use rollback segment段名

找出有哪些段:

SQL> select segment_id,segment_name from dba_rollback_segs;

 

一个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一般避免死锁的办法就是使用虚假更新。


原文链接: http://blog.csdn.net/linwaterbin/article/details/7651192
加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部