oracle学习篇:七、回滚与撤销

£可爱£侵袭症+ 提交于 2019-12-03 14:24:28

7.1 什么是回滚和撤销

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

如果用户提交了事务,oracle会在日志文件记录提交,并且写出日志,同时会在回滚段中把该事务标记为已提交;如果用户回滚事务,则oracle需要从回滚段中把前镜像数据读取出来,修改数据缓冲区,完成回滚,这个过程本身也要产生redo,所以回滚这个操作是很昂贵的。

7.2 回滚段存储的内容

redo中只会记录少量信息,这些信息足以重演事务;同样undo中也只记录精简信息,这些信息足以撤销事务。

对于insert操作,回滚段只需要记录插入记录的rowid,如果回退,只需将该记录根据rowid删除即可。

对于update操作,回滚段只需要记录被更新字段的旧值即可(前镜像),回退时通过旧值覆盖新值即可完成回退。

对于delete操作,oracle则必须记录整行的数据,在回退时,oracle通过一个反向操作恢复删除的数据。

 对于相同数据量的数据操作,通常insert产生最少的undo,update产生的undo居中,而delete操作失败或回滚,总是需要很长的时间,并且会有大量的redo生成。所以通常在进行大规模数据删除操作时,推荐通过分批删除分次提交,以较少对于回滚段的占用和冲击。

7.3 并发控制和一致性读

7.4 回滚段的前世今生

动态创建和释放,这也正是自动管理的undo表空间的优势之一。

7.5 回滚机制的深入研究

(1)从DML更新事务开始

先不提交事务,在另外一个窗口新开session,使用sys用户查询相关信息,进行进一步的分析研究。

(2)获得事务信息

select * from v$transaction;

(3)获得回滚段名称并转储段头信息

查询v$rollname视图获得回滚段名称,并转储回滚段头信息

select * from v$rollname;

alter system dump undo heaer '_SYSMU6$';

(4)获得跟踪文件信息

(5)转储前镜像信息

(6)转储数据块信息

事务的内部流程:

①首先当一个事务开始时,需要在回滚事务表上分配一个事务槽;

②在数据块头部获取一个ITL事务槽,该事务槽指向回滚段头的事务槽;

③在修改数据之前,需要记录前镜像信息,这个信息以undo record的形式存储在回滚段中,回滚段头事务槽指向该记录;

④锁定修改行,修改行锁定位指向ITL事务槽;

⑤数据修改可以进行。

(7)块消除

在事务需要修改数据时,必须分配ITL事务槽,必须锁定行,必须分配回滚段事务槽和回滚空间记录前镜像。当事务提交时,oracle需要将回滚段上的事务表信息标记为非活动,以便空间可以重用;那么还有ITL事务信息和锁定信息需要清楚,以记录提交。

由于oracle在数据块上存储了ITL事务信息和锁定等事务信息,所以oracle必须在事务提交之后清楚这些事务数据,这就是块清除。块清除主要清除的数据有行级锁、ITL信息(包括提交标志、SCN等)。

如果提交时修改的数据块仍然在buffer cache中,那么oracle可以清除ITL信息,这叫做快速块清除,快速块清除还有一个限制,当修改的块数量超过buffer cache的约10%,则对超过部分不再进行快速块清除。

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

(8)提交之后的undo信息

当提交事务后,回滚事务表标记该事务为非活动。虽然这个事务已经提交,不可以回滚了,但是在覆盖之前,这个前镜像信息仍然存在,,通过某种手段,应该仍然可以获得这个信息。

7.6 闪回查询新特性

闪回查询新特性,允许将回滚段中的数据进行闪回。

7.7 使用errorstack进行错误跟踪

errorstack是oracle提供的接口,用于诊断oracle的错误信息。诊断事件可以在session级设置,也可以在系统级设置,通常如果要诊断全局错误,最好在系统级设置。设置了errorstack事件之后,oracle会将出错时的信 息计入跟踪文件之中,用户就可以通过跟踪文件进行错误诊断和排查了。

7.8 闪回特性的增强

7.9 ORA-01555错误

7.10 AUM下如何重建undo表空间

同平台迁移时可以放弃undo表空间,这时启动会报错ora-01157。

startup

删除undo文件启动数据库:

alter database datafile '/undotbs01' offline drop;

alter database open;

create undo tablespace undotbs2 datafile '/undotbs02.dbf' size 10M;

alter system set undo_tablespace='UNDOTBS01';

7.11 诊断案例一:使用flashback query恢复误删除数据

闪回删除,没啥说的。

7.12 诊断案例二:释放过度扩展的undo表空间

undo表空间自动扩展,不能回缩。

sysaux表空间用尽,不能扩展,尝试手工扩展sysaux表空间。

采用以下步骤回收undo空间:

(1)确认文件

select * from dba_data_files;

(2)检查undo segment状态,发现有的回滚段大小已经扩展到了约3GB大小

select * from v$rollstat order by rssize;

(3)创建新的undo表空间

create undo tablespace undotbs02;

(4)切换undo表空间为新的undo表空间

alter system set undo_tablespace=undotbs02 scope=both;

确认原回滚段表空间所有回滚段都正常offline。

检查空间占用情况,可以使用asmcmd工具来查看占用情况

asmcmd   du exit

7.13 特殊情况的恢复

7.14 数值在oracle的内部存储

dump函数

第七章完

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!