成都创新互联网站制作重庆分公司

如何中断oracle回滚 oracle回滚段的作用

oracle中数据是怎样前滚和回滚的

保持数据一致性和完整性,是每一款成功商业数据库软件都必须要做到的基本要求。从故障中恢复,保证ACID原则,保证事务完整性,一直是Oracle数据库核心功能组成部分。本篇主要介绍Oracle实例意外终止(断电或者强制关闭)之后,重新启动时发生的恢复过程,也可以称作“前滚和回滚”。

网站制作、成都网站建设介绍好的网站是理念、设计和技术的结合。创新互联建站拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。

基础知识说明

为了更明确的说明问题,笔者首先介绍一下本文涉及到的一些重要知识。

数据库实例失败

我们经常说的数据库服务器failure是有多层含义的。Oracle数据库是一个由多进程组件共同构成的结构体系。最重要的部分包括监听器、Oracle数据库实例两个部分,当然还包括各类文件,更广义的还有硬件和操作系统OS。不同部分的Failure现象和处理方法都有所不同。本文所阐述的过程是Oracle实例失败后的自动恢复过程。

在实例失败的时候,往往是突然性的终止。此时Oracle数据库可能在进行一系列完成或者未完成的事务。实例失败恢复,就是要将这些状态进行还原,恢复到数据完整性的状态。

写日志(RedoLog)在先机制

Oracle数据库是采用“日志在先”机制的。当我们对数据库数据进行修改时,并不是立即将修改写入到文件中,而是写入到共享内存SGA空间中的BufferCache里。同时,将修改的日志不断的写入到SGA中另一块Log Buffer缓存中。有一个后台进程LGWR不断的将LogBuffer缓存中的日志内容写入到online redo log文件中。

写入LogBuffer缓存和LGWR写入文件的过程是异步进行的。那么LGWR会在哪些情况下将日志缓冲区(全部内容)转储到日志文件呢?如下:--参考OCA认证考试指南(1Z0-052,P40)ü 用户进行直接的commit操作;

ü RedoBuffer数据超过1/3;

ü DBWn启动,将BufferCache中的脏数据写入到文件中;ü 距离上次LGWR写入操作超过三秒(三秒超时,DBWn每三秒钟会对一些缓冲区清理一次,这个时候,刚好符合触发LGWR的第三点);而数据文件写入进程DBWn工作的触发点(此处注意:DBWn会将高速缓冲区的脏缓冲区,即脏数据块写入数据文件,而不是缓冲区里头的全部内容---参考OCA认证考试指南(1Z0-052,P38))。

因为考虑到磁盘I/O会降低性能,DBWn采用的是极懒算法执行写入。如果对于经常变脏的缓冲区,即这边缓冲区处于十分忙碌的状态,那么DBWn不会将缓冲区写入磁盘的。反而一段时间来,任何会话都未曾关注的一些缓冲区,DBWn会将其写入到磁盘。因此DBWn写脏缓冲区比较平缓和低频率。但如果出现检查点的情况例外:DBWn会将所有脏缓冲区全部写入磁盘。---参考OCA认证考试指南(1Z0-052,P38中,P39)。

ü 当BufferCache中没有任何可用缓冲区;ü 脏缓冲区过多;

ü 遇到三秒超时(DBWn每三秒钟会对一些缓冲区清理一次)ü 遇到检查点

综合DBWn和LGWR工作的特点,我们可以得到日志文件的几个特点:

首先,日志文件的写入是很频繁的。LGWR会不断将日志信息从LogBuffer中写入Online Redo Log;其次,在日志文件上,可以有三个类型的事务事件。

1、事务结束,已经被commit,之后打过checkpoint检查点。这种事务记录在LogFile上,但是变化信息已经被DBWn写入进数据文件;2、事务结束,已经被commit,之后没有打入checkpint检查点。这种情况下,LogFile已经写入了日志项目,数据文件可能包括脏数据,也可能没有写入脏数据;3、事务未结束,没有commit。这种时候,数据块DirtyBlock上面是有事务槽信息,表示未结束事务,是不会将数据写入到数据文件中。但是,日志LogBuffer可能将部分未提交的DML操作项目写入到Log File中;检查点Checkpoint

检查点Checkpoint是数据库一致性检查的一个标记。简单的说,就是在这个点上,Oracle保证各个文件(数据、控制、日志等)是一致的。检查点的作用就是在进行实例恢复的时候,告诉SMON进程,这个点之前的内容不需要进行恢复。

前滚和回滚介绍

“前滚和回滚”是Oracle数据库实例发生意外崩溃,重新启动的时候,由SMON进行的自动恢复过程。下面通过模拟实例和讲解介绍这个过程。

失败前场景说明

日志中记录过程如下:

1、事务A进行之后,结束commit。之后系统进行了一次checkpointA;2、Checkpoint之后,进行事务B,结束commit;3、进行事务C,C事务量较大,其中进行了一定量的RedoLog文件写入。之后系统断电;--按照LGWR的工作机制,C事务量比较大,所以应用程序将在几分之一秒内的时间里生成足以填充1/3秒的重做内容,因此这会触发LGWR将日志缓冲区的内容转储到日志文件,但始终得不到针对C事务的提交记录,这是需要回滚的。

4、还有种可能,事务B和D,事务D所用的缓冲区处于高速缓冲区不活跃的位置,而且事务B已提交,但其所用的缓冲区处于高速缓冲区活跃的位置。因此DBWn会将D事务缓冲区数据写入数据文件,而没将B事务的数据写入。此种情况需要回滚D事务,保留B事务。---参考OCP认证考试指南全册(P358下半部分内容).

1、系统启动过程,进入实例恢复阶段

当实例意外中断的时候,各类型文件,包括控制文件、数据文件和日志文件上,会存在不一致的问题。这种不一致主要体现在SCN值的差异上。

实例在启动的时候,经过三阶段(nomount、mount和open)。在open之前,会进行这种不一致现象的检查,如果出现不一致,要启动SMON进程的恢复流程。

SMON是Oracle实例的一个后台进程,主要负责进行系统监控恢复。进行恢复的依据主要是RedoLog记录。

2、前滚进程

SMON首先找到最后SCN记录的Redo LogFile。寻找最后一个打入的Checkpoint。

顺序找到CheckPointA之后,表示A之前的所有事务都是完全写入到数据文件中,不存在不一致性问题。恢复过程从CheckpointA开始,Oracle开始依据重做日志Redo Log的系列条目,进行推进。

首先遇到了事务B信息,由于事务B已经commit,所以事务B所有相关的Redo Log条目已经全都写入到Redo LogFile中。所以,按照日志继续条目推进,完全可以重演replay,并且应用apply事务B的全部过程。

这样,事务B全部实现,最终将通过DBWn完全写入到数据文件中。所以,实例失败之前提交commit的事务B,完全恢复。

进入事务C的范畴,由于一部分事务C的RedoLog条目已经进入Redo LogFile中(根据LGWR和DBWn的工作机制,事务C有可能将部分数据块写入日志文件和数据文件,但这时候C事务始终没提交,这是比较严重的讹误,所以需要回滚),所以在进行前滚的时候,一定会replay到这部分的内容。不过,这部分内容中不可能出现commit的标记。所以,前滚的结果一定是遇到实例突然中断的那个时点。此时replay的结果是,事务C没有提交。这样结束了前滚过程,进入回滚阶段。

3、回滚过程(与普通的回滚一样(当事务执行失败后自动回滚或者命令:ROLLBACK.)---参考OCP认证考试指南全册)对事务C(针对DML的update,当然其他同理),要进行回滚过程,释放所有相关资源。在前滚中,利用日志填充了的撤销块和表数据块的值,然后在回滚的时候,会将撤销块的值复制回表数据块中(因为此事务没提交记录),以此来进行SGA中BufferCache数据块恢复。

4、说说恢复过程的损耗

很多时候,由于我们事务规模较大,当出现实例崩溃的时候,重启所需要的时间很多。有一种经验说法是,事务有多长,前滚和回滚所消耗的时间有多长×2。而且,如果不能完成SMON恢复过程,数据库是不能算作正常的Open的。

SMON的恢复过程是Oracle强制进行的一个过程,即使恢复中发生断电或者其他中断失败事件。Oracle在下一次启动的时候,还是会继续这个过程,只有耐心等待。

通过检查一些内部视图(X$视图),可以观察到恢复进程和速度,但是丝毫不能影响到最终恢复的过程。

这个过程虽然可以保证数据一致性,但是也带来了系统不能启动,影响生产环境的问题。我们可以通过两个方式进行缓解:

首先,我们在设计开发系统时,要保证事务规模的可控性,不要让事务规模在技术层面上过大。避免一旦发生崩溃,大规模强制回滚的发生;其次,一旦出现了这个强制回滚,要注意对生产环境的影响。可以采用备库standby进行顶替,让主库安静的慢慢恢复;

oracle 提交之后怎么回滚

execute执行后

可以回滚

commit提交后

不可以回滚

其实Oracle提交数据是分两步操作的,第一步execute执行,第二步commit提交。对应的PL\SQL也是要先点execute执行,执行后再点commit提交。

但是

commit提交后

可以用闪回查询恢复原来的数据

因为oracle会将近期的数据保存到快照中

如:

SELECT

*

FROM

TABLE_1

AS

OF

TIMESTAMP

TO_TIMESTAMP('20080606

20:00:00','YYYYMMDD

HH24:MI:SS');

这里'20080606

20:00:00'就是你想恢复数据到哪个时间状态

TABLE_1是数据库的表名

这样查询到的数据就是执行更新操作之前的数据

如何在ORACLE 存储过程中设置回滚断点

学习存储过程中使用断点回滚事务时,发现目前网络上存在一个问题,那就是使用断点回滚后,都忘记了一个很重要的事情,提交事务。虽然使用了断点回滚,但是断点回滚不像rollBack或commit一样结束当前事务,而使用断点回滚只会回滚到声明断点的地方,之前的产生的事务仍需要提交的,如果不提交,事务一直在数据库中缓存.

Demo:

procedure doSomeThing(p_number out number) as

begin

insert into t_test_user_mingming(id,loginname,password,realname,type)

values(se_test_user_mingming_id.nextval,'xiaoming','1234','小明',1);

p_number := 1;

savepoint ps;--- 设置断点 ps

insert into t_test_info_mingming(id,pal,type,create_time,note)

values(se_test_info_id.nextval,'我想买台thinkPad 可以俺莫有钱',1,sysdate,'ceshi');

p_number := 2;

savepoint sp;----设置断点 sp

insert into t_test_agent(agent_id) values(1);---我这里此行会抛出异常 ORA-01400 可以替换为下句 手动抛出一个异常

-----RAISE_APPLICATION_ERROR (-20004,'抛出的异常玩玩');

commit;

exception --捕获异常

when others then

rollback to ps; ---- 如果产生异常,回滚到断点 ps

p_number :=0;

commit; --- 提交事务

end doSomeThing;

这里本人做了实验,如果在异常中不加 commit 语句,使用PL/SQL测试时,异常在缓存,t_test_user_mingming 表中没有数据记录。

存储过程里的事务操作:

create or replace procedure pr_mypro2(p_a in varchar2,p_b in varchar2,p_count out number)

temp varchar2(1000); /*定义临时变量*/

is

begin

select code into p_count from table1 where a=p_a; /*查询并返回值*/

temp := p_count; /*将返回值赋给临时变量*/

savepoint point1; /*保存点*/

insert into table2(a,b)values(temp,p_b); /*将临时变量值添加到新表的字段*/

savepoint point2;

insert into

exception

when others then

rollback to savepoint point1; /*异常处理,保存点下面的操作都不会被执行*/

return;

end;

保存点(SAVEPOINT)是事务处理过程中的一个标志,与回滚命令(ROLLBACK)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务。

如果定义了多个savepoint,当指定回滚到某个savepoint时,那么回滚操作将回滚这个savepoint后面的所有操作(即使后面可能标记了N个savepoint)。

例如,在一段处理中定义了五个savepoint,从第三个savepoint回滚,后面的第四、第五个标记的操作都将被回滚,如果不使用ROLLBACK TO savepoint_name而使用ROLLBACK,将会滚整个事务处理。

oracle已提交的数据怎么回滚

1、首先oracle已提交的数据是可以使用闪回功能来找回数据的。

2、其次要先确定提交的数据的大体时间。

3、最后点击闪回按键,选择重新执行,就可以选择提交的数据信息进行闪回了。


网站栏目:如何中断oracle回滚 oracle回滚段的作用
文章位置:http://cxhlcq.com/article/hpspji.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部