深入解析Oracle学习笔记(第八章)

本章看得太粗略,后续继续研究。


9i开始,AUM。

事务开始时,首先要在回滚表空间获得一个事务槽,分配空间,然后创建前镜像,此后事务的修改才能进行,oracle必须以此来保证事务是可以回滚的。

用户回滚事务,oracle需要从回滚段中把前镜像读取出来,修改数据缓冲区,完成回滚,这个过程本身也要产生redo。


insert,只记录插入记录的rowid,如果回退,只需要将该记录根据rowid删除即可。undo最少。

update,只需要记录被更新字段的旧值。

delete,必须记录整行的数据。undo最多。


oracle通过锁定机制实现数据库的并发控制,通过多版本模型来进行数据的并发访问。

通过多版本架构,实现的读写分离,读不阻塞写,写不阻塞读。

多版本模型通过一致性读实现,一致性读是回滚表空间主要作用之一。


每个数据块头部都会记录一个提交SCN,数据更改后,提交SCN同时被修改。

如果提交SCN大于查询开始时SCN,或者数据被锁定修改尚未记录commit  SCN,则通过回滚段构造前镜像返回结果。


9i之前,创建回滚表空间后,oracle随后创建回滚段供数据库使用,也可以手工创建或者删除回滚段进行维护。dba_rollback_segs。

9i开始引入自动管理undo表空间。用户不能创建或删除回滚段,也不能为事务指定回滚段。oracle自动维护。

undo_management 参数  AUTO / MANUAL


自动管理表空间下,回滚段个数是oracle根据数据库繁忙程度自动分配或者回收。缺省初始化10个回滚段。v$rollname

动态创建和释放


undo_retention

guarantee  /   noguarantee

如果打开了guarantee,但是undo表空间不自动扩展,那么当空间不足时,报错ORA-30036.


undo_retention实现机制:在undo segment header上创建了retention table记录相关undo存储的提交时间从而实现保留策略。


oracle 10g In Memory Undo新特性(IMU)

在shared pool开辟独立的内存区域用于存储undo信息,避免undo以前在buffer cache中的读写,从而进一步减少redo生成,同时大大减少以前的undo segment读写操作。IMU中数据通过暂存,整理,收缩之后可以写出到回滚段,这样的写出有序,批量,提升了性能。


IMU和上一章提到的PVRS紧密相关。由于每个IMU buffer很小,只有64--128k,所以仅有特定的小事务可以使用(PVRS也是只有特定的小事务可以使用),每个事务会被绑定一个独立空闲的IMU buffer,同时相关的redo信息会写入PVRS中。同样每个IMU buffer会由一个独立的 IMU latch保护。当IMU BUFFER或者PVRS写满之后,数据库需要写出IMU中的信息。


RAC中IMU不支持(同样的PVRS也不支持)


经过不同版本oracle技术不断演进,现在oracle内存管理和以前已经大不相同,现在buffer cache,shared pool,log buffer的内容正在不断交换渗透,redo  undo数据都可以部分的存储在shared pool,oracle 11g的 result cache也被记录在shared pool中。


11g undo表空间备份增强:  一旦事务提交,事物的前镜像就被标记为inactive,其中的信息在恢复时就不会被用到,RMAN就不会备份该部分数据,undo表空间备份效率大大提高。


v$transaction 视图,查询事务使用了几号回滚段,该事务位于第几个事务槽。同时还有undo数据块(就是前镜像)所在的数据文件位置和块位置。

回滚段头记录了该事务使用了第几个事务槽,前镜像信息在哪。irb:如果要回滚,这是起始的搜索点。


块清除:当事务提交,oracle需要把数据块上存储的ITL和锁定等信息清除。

快速块清除:如果提交时修改过的数据块仍然在buffer cache中,那么oralce可以清除ITL信息。但是快速块清除有限制,不超过buffer cache 10%。超出部分不在进行快速块清除。

延迟快清除:如果提交事务时,修改过的数据块已经被写回到数据文件上(或大量修改超出10%部分),如果再次读取数据块进行修改,则成本过于高昂。对于这种情况,oracle选择延迟快清除,等到下一次访问该block时再来清除ITL锁定信息。提高了数据库性能。


闪回查询

闪回版本查询

闪回事务处理


ORA-01555

1.回滚段被覆盖    

2.延迟块清除:当一个查询触发延迟块清除时,oracle需要去查询回滚段获得该事务的提交SCN,如果事务的前镜像信息已经被覆盖,并且查询SCN也小于回滚段中记录的最小提交SCN,那么oracle将无从判断查询SCN和事务提交SCN的大小,此时出现延迟块清除。

另外,sqlldr直接方式加载(sqlldr direct=true)不产生重做和回滚信息有时候也会产生ORA-01555


闪回数据归档(oracle 11g) flashback archive

新增的后台进程FBDA(flashback data archiver process)负责记录undo的历史状态。

对部分表进行闪回数据归档

闪回数据需要独立的存储,需要创建独立的ASSM表空间。

user_flashback_archive_tables



案例:释放过度扩展的undo表空间

1.检查数据库表空间的空间占用情况

select tablespace_name,sum(bytes)/1024/1024 GB from dba_data_files group by tablespace_name

union all 

select tablespace_name,sum(bytes)/1024/1024 GB from dba_temp_files group by tablespace_name  order by GB;

发现undo表空间占用太多空间。

2.检查undo segment状态,空间占用情况。

select usn, xacts, rssize/1024/1024/1024 , HWMSIZE/1024/1024/1024, SHRINKS

from v$rollstat order by rssize;

发现有的undo segment已经占用了3个G。

3.创建新的undo表空间

4.切换undo表空间为新建的undo表空间

5.等待原undo表空间所有undo segment offline。

v$rollstat   status字段

6.删除原undo表空间

7.检查空间占用情况


 











你可能感兴趣的:(深入解析Oracle学习笔记(第八章))