您现在的位置: IT培训 > OCP培训 > 成都OCP培训 > 正文

【网络类教师陆克思原创】UNDO原理

发布时间:2017-03-02 10:32:59

 

UNDO原理

 

当某个进程更改了数据库中的数据时,Oracle DB会保存旧值(还原数据),按数据修改前的原样存储数据,通过捕获还原数据可以回退未提交的数据,还原数据用于支持读取一致性和闪回查询,还原还可用于倒回闪回事务处理和表。

读取一致性查询提供与查询开始时的数据一致的结果.如果要成功完成读取一致性查询,原始信息必须仍作为还原信息存在.如果原始数据不再可用,则会收到快照太旧错误ORA-01555.只要保留了还原信息,OracleDB 就能通过重建数据来满足读取一致性查询的要求。

 

 

闪回查询有目的的查找过去某个时间存在的某个版本的数据.只要过去那个时间的还原信息仍存在,闪回查询就能成功完成.Oracle闪回事务处理使用还原功能来创建补偿事务处理,以便回退事务处理以及相关事务处理.使用Oracle闪回表功能可将表恢复到特定的时间点。

 

还原数据也可用于从失败的事务处理中进行恢复.如果在用户决定提交或回退事务处理之前用户会话异常结束(可能因为网络错误或客户机故障),就会导致事务处理失败.当实例崩溃或你发生shutdown abort命令时,事务处理也可能会失败。

 

如果事务处理失败,则选择最安全的行为,即让Oracle DB撤销用户做出的所有更改,从而还原原始数据。

 

所有事务处理的还原信息将至少保留到事务处理结束,即使用以下方法之一结束事务处理时:

1) 用户还原事务处理(回退事务处理).

2) 用户结束事务处理(提交事务处理).

3) 用户执行DDL语句,如CREATE、DROP、RENAME或ALTER语句.如果当前事务处理包括任何DML语句,则数据库首先提交该事务处理,然后在新的事务处理中执行并提交DDL.

4) 用户会话异常终止(回退事务处理).

5) 用户会话正常终止并推出.

保留的还原数据量及其保留时间取决于数据库活动量以及数据库配置.

Oracle闪回事务处理利用联机重做日志来挖掘用于执行的相应还原SQL.如果闪回事务处理调用中未提供事务处理开始时间,则只使用还原数据作为人为的时间边界,以此确定目标事务处理的重做挖掘开始时间。

 

事务处理开始时,为其分配还原段.在事务处理的整个生命期内,更改数据时,原始(更改之前)的值会复制到还原段.通过查看v$transaction动态性能视图,可以了解哪些事务处理分配到那些还原段。

 

还原段是由实例根据需要自动创建的专用段,用于支持事务处理.向所有段一样,还原段由区组成,区又由数据块组成.还原段可根据需要自动增长和收缩,它充当一个用于所分配的事务处理的循环存储缓冲区。

 

事务处理后填充其还原段中的区,直至完成了事务处理或占用了所有空间为止.如果填充完区之后还需要更多的空间,则事务处理将获取段中下一个区的空间.占用了所有区之后,事务处理会转回到第一个区或请求为还原段分配新区。

 

还原段只存在于特定形式的表空间,这种形式的表空间称为还原表空间(在还原表空间中无法创建其它段类型)。

 

DBCA可以自动创建小文件还原表空间.用户还可以创建大文件还原表空间.但是,在同时执行大量短事务处理的大容量连接事务处理OLTP环境中,会在文件头上发生争用.存储于多个数据文件中的还原表空间可以解决这种潜在的问题。

 

尽管数据库可能有许多还原表空间,但是对于数据库中的任一实例,一次只能将一个还原表空间指定为当前还原表空间。

 

还原段由SYS自动创建并始终归其所有.由于还原段充当循环缓冲区,因此每个段最小包含两个区.默认的最大区数取决于数据库大小,但是此值非常大(块大小为8KB 时区为32765)。

 

还原表空间是永久的、本地管理的表空间(具有自动区分配).它们由数据库自动进行管理。

 

还原数据和重做数据初看很像似,但是两者的作用却截然不同.如果需要还原更改,则需要还原数据,而且为了保持读取一致性和执行回退,也需要还原数据.在因某种原因而丢失所做更改时,如果需要再次执行更改,则需要用到重做数据.还原块更改也写入重做日志。

 

提交过程需要验证在事务处理中所做的更改是否已写入重做日志文件.此重做日志文件会永久保存在磁盘上.而不是保存在内存中.此外,重做日志文件通常是多路复用的.因此磁盘上有重做数据的多个副本.虽然更改可能尚未写入实际存储表块的数据文件,但只要写入到持久重做日志.就足以确保数据库的一致性。

 

假设在已提交的更改反映到数据文件之前刚好发生断电.因为事务处理已提交,所以这种情况不会导致问题.当系统再次启动时,就能够前滚断电时尚未反映到数据文件中的任何重做记录。