学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,系统启动后使用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;
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进行以下操作:
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一般避免死锁的办法就是使用虚假更新。