关于回滚段的理解
1.检查数据库自启动以来的回退率,如果
transaction rollbacks/(transaction rollbacks+user commits)的值过高,应该引起注意
sql语句如下:
select name,value
from v$sysdate
where name in (‘user commits’,’transaction rollbacks’);
2.关于回滚段,如果是delete操作,回滚段会记录删除的整行的数据,如果是update操作,回滚段只会
记录修改的字段,如果是insert操作,回滚段会记录插入行的rowid。所以,如果事务最后提交,只需
在回滚段中标记事务已经提交。如果最后事务回滚,如果先前是delete操作,回退时将回滚段的数据写
回数据块,如果是删除操作,将修改前的数据再写回去,如果是insert操作,根据记录的rowid把这条
记录删除。
3.查询操作:
在进行查询操作时,先将数据库读取到数据缓冲区中,如果发现要读取的数据块得sdn大于查询时的sdn,
则需要从回滚段中读取改数据集,此时,会先将数据缓冲区中的改数据块做一个拷贝,在根据回滚段中
的数据对整个拷贝的数据块做回滚,回滚完成后,再读取改数据块得数据。
4.延迟回滚段:
当我们将表空间offline时,如果此时有事务使用该表空间,并且已经执行回滚操作。由于表空间不可用,
但回滚成功的信息还会显示给用户,但实际上,并没有回滚,这个时候数据库将回滚信息写入系统回滚段,
等到表空间再次online时,数据库从系统回滚段将信息回滚写入表空间。