Oracle数据库用户执行DML类SQL语句操作数据时,第一条成功执行的DML语句标志一个事务的开始,事务最终以提交或全部回滚作为结束。
事务处理开始时,Oracle在Undo表空间内为其分配Undo(还原)段,Oracle为每个事务只分配一个Undo段,但为一个事务所分配的Undo段可以同时服务多个事务。
在整个事务处理期间更改数据时,原始(更改之前)数据被复制到还原段,这些就是Undo(还原)数据。这样用户就可以在改变主意时调用ROLLBACK语句,利用Undo数据回滚事务(也就是还原对数据库所作的修改)。查询动态性能视图v$transaction可以查看Oracle为各个事务处理所分配Undo段信息。
Undo段是为了支持事务处理,由实例在Undo表空间内自动创建的专用段。像所有段一样,Undo段由区组成,区又由数据块组成。事务处理会填充其Undo段中的区,直至完成了事务处理或占用了所有空间为止。如果填充完区之后还需要更多的空间,事务处理则获取段中下一个区的空间。占用了所有区之后,事务处理会自动转回到第一个区或请求为还原段分配新区。
Undo数据主要用于以下几个方面。
①回滚事务
用户执行ROLLBACK语句或者用户会话异常中止而回退事务时,Oracle使用Undo数据恢复对数据库所作的修改。
②恢复事务
如果事务处理过程中实例崩溃,事务对数据库所作的修改可能已经写入数据库,但事务还没有提交,再次打开数据库时,未提交的事务必须回滚才能使数据库达到一致状态,这种回滚操作是实例恢复的一部分。要使事务恢复成为可能,Undo数据必须受到Redo日志的保护。
③提供读一致性
Oracle数据库中的查询能够从某个时间点返回一致的结果,即使在查询执行期间所读取数据块中的数据已经被修改或删除,查询使用的每个块中的数据仍全部是那个时间点开始之前的状态。
④闪回查询、闪回事务处理和闪回表
闪回查询是有目的地查找过去某个时间存在的某个版本的数据。只有过去那个时间的还原信息存在,才能成功完成闪回查询。闪回事务处理是用Undo信息来创建补偿事务处理,以便回退事务及相关事务处理。闪回表可将表恢复到特定的时间点。
(1)恢复事务
下面以一个例子演示Oracle数据库在实例恢复过程中利用Undo数据恢复事务。Oracle数据库中的动态性能视图v$fast_start_transactions记录事务的恢复进度。下面使用该视图查看Oracle数据库打开过程中对未提交事务的恢复处理。v$fast_start_transactions视图中的列比较多,在这里需要用到的列见表6.2。
表6.2 V$fast_start_transactions部分列
这个例子的设计思想是:首先创建一个表,向其中插入大量的数据,然后在事务未提交的情况下异常关闭数据库。由于在这个事务中插入的数据量巨大,导致实例SGA中的数据缓冲区无法容纳它们而将其写入了数据文件。在下次实例启动时就需要回滚这些数据,才能把数据库恢复到一致状态。
这个例子需要打开两个SQL∗Plus窗口,第l个窗口(执行下面代码中背景为浅灰色部分)执行命令打开数据库过程中做实例恢复,第2个窗口(执行下面代码中背景为深灰色部分)在数据库做实例恢复期间查询事务恢复进度。
首先启动第一个SQL∗Plus,并以sysdba身份连接Oracle数据库。打开时间显示,以帮助用户了解两个会话中SQL语句执行的先后顺序。之后创建表,执行PL/SQL语句块插入数据,再异常关闭数据库。(www.daowen.com)
因为在数据库打开过程中,实例恢复是在从MOUNT到OPEN阶段实现的,所以先把数据库启动到MOUNT状态,等待打开第2个SQL∗Plus窗口,连接数据库,并输入查询命令:
回到第一个SQL∗Plus窗口,执行下面语句打开数据库:
在第2个SQL∗Plus窗口内不断执行刚输入的查询语句,从其执行结果可以看出事务恢复的进展情况。
从上面两个窗口内语句执行的完成时间可以看出,当第二个窗口内事务恢复完成之后,第一个窗口内才显示“数据库已更改”,这时数据库才成功打开。
这个例子说明了Oracle数据库是如何利用Undo数据恢复用户未提交事务的。
(2)读一致性
在Oracle数据库中,只要更改数据,就会产生该事务的Undo数据。这样Oracle数据库内的同一数据在不同时间点会有多个版本(称为多版本模型)。所以在执行查询时,Oracle不需要对查询的表或数据加任何锁(即读不会阻塞写),它也不关心所要查询的数据当前是否被其他事务锁定(写不会阻塞读),它只看数据是否改变,如果改变,就利用Undo段中在不同时间点建立的数据快照实现查询的读一致性。
(3)Undo与Redo的比较
每当更改Oracle数据库中的数据时,就会产生该事务的Redo数据和Undo数据。从字面看,Undo和Redo很相似,但是二者的作用却截然不同。如果需要还原更改和实现读一致性,则需要Undo数据。如果由于某种原因而丢失了更改,需要再次执行更改,这时需要用到Redo数据。为了能够恢复失败的事务,Undo数据必须受Redo日志的保护。表6.3从记录内容、作用等方面比较了Undo数据和Redo数据之间的异同。
表6.3 Undo与Redo的比较
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。