ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 回滚段小记

回滚段小记

Linux操作系统 作者:chuan717 时间:2015-05-06 17:41:44 0 删除 编辑

回滚段
      回滚段是在磁盘上的一段空间,当一个事务开始的时候,会首先把变化前得数据和变化后的数据先写入日志缓冲区,然后把变化前得数据写入回滚段,最后才是在数据缓冲区修改数据。回滚段中最少有2个区,一个事务不能跨越2个回滚段,每个回滚段都有一个回滚段头,回滚段头是一个block,记录了事务表信息,当发生一个事务的时候,就在回滚段的事务表中记录一条信息,包括事务的标志,事务的状态,使用回滚段块数等信息,假如一个段有3个区,而事务使用这3个区是按顺序的,如果此时第一个区被占用,而第2个区是空着的,那也不能使用第2个区,因为就需要扩容了,比如1-2,直到下个能被使用的区是空着的为止。
例如:
update set object_id=0 where object_id=12344;
commit;
这时数据库首先把该语句的整个操作包括的0和12344写入日志缓冲区,然后把数据12344和一些相关信息写入回滚段,最后把0修改到数据缓冲区,当发生提交命令时,如果日志缓冲区内容还没有写入日志文件则必须写入日志文件,然后回滚段会把该事务标记为已经提交,数据缓冲区中快的这些事务也标记为已经提交,当然如果我们回退这个事务,则数据库将把回滚段中数据“12344”读出来写回数据库缓冲区,这个回退的变化本身也被写入日志,这就是回退的过程。如果事务很大,那么在没有提交之前也可能会写入磁盘了,所以如果此时我们回退,那oracle必须再从缓冲区中读出来,所以代价很大。

查询数据库中commit的事务和rollback的事务

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

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
user commits                                                          54873----此值是数据库创建以来累计的值
transaction rollbacks                                                    48
 如果是delete,那回滚段里就记录一行数据,如果是insert,那回滚段中就记录rowid。当事务提交以后,回滚段中就会标记事务已经提交,如果是回退,如果是delete,那回滚段就将整个行回退,如果是update,就将改变前的数据写回,如果是insert,那就在回滚段中将rowid清楚。
查看回滚段的个数和状态:
SQL> select usn,status from v$rollstat;

       USN STATUS
---------- ---------------
         0 ONLINE
         1 ONLINE
         2 ONLINE
         3 ONLINE
         4 ONLINE
         5 ONLINE
         6 ONLINE
         7 ONLINE
         8 ONLINE
         9 ONLINE
        10 ONLINE

已选择11行。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29773864/viewspace-1626282/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: RAC中一个小疑问
请登录后发表评论 登录
全部评论

注册时间:2015-04-23

  • 博文量
    8
  • 访问量
    21357