oracle的闪回

Posted 明月倾城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle的闪回相关的知识,希望对你有一定的参考价值。

本文前半部分是一个plsql程序,程序实现了对不同职位的员工加薪,更改了数据库的数据.并且commit了事务;后半分结合前面的例子介绍了对oracle中的数据恢复,即如何撤销这个已经commit过的操作.,也由于本人技术水平和表达能力有限,对于概念性的部分和总结引自摘自: http://www.cnblogs.com/chengxiao/p/5860823.html,如果想更详细的了解oracle中的闪回机制可以访问该地址的博文,本文是重点是实例演示

一、首先需求是在emp表中实现:

给员工涨工资,总裁涨1000 经理涨800 其他涨400

再没有执行该程序前先查询一下emp表中的数据如图所示:

Jobs为clerk的员工薪资是800

Jobs为President的员工薪资是5000

 

按照给员工涨工资,总裁涨1000 经理涨800 其他涨400的需求写如下plsql程序语句如下:

 

set serveroutput on

declare

  vjob emp.jobs%type;

  vmpno emp.empno%type;

--定义光标mysur

  cursor mysur is select jobs,empno from emp;

begin

  open mysur;

    loop

    fetch mysur into vjob,vmpno;

exit when mysur%notfound;

--循环换判断,给不同职位的员工加薪

     if vjob=\'PRESIDENT\' then update emp set sal=sal+1000 where empno=vmpno;

    elsif vjob=\'MANAGER\' then update emp set sal=sal+800 where empno=vmpno;

    else update emp set sal=sal+400 where empno=vmpno;

    end if;

    end loop;

  close mysur;

         --提交事务

   commit;

   dbms_output.put_line(\'执行完毕\');

end;

/

执行程序之后emp表中的数据为:

可以看到jobs为clerk的薪资是1200涨了400

jobs为president的薪资是6000涨了1000

 

 

二、以上是plsql程序这里不再累述下面通过以上emp表的数据具体演示oracle的数据恢复:

  基于作者技术水平有限,本小结暂时先讲一下闪回查询中的闪回表,对于闪回的其它类型可以在最后的ps内容部分下查看

  闪回表:是将某个数据表闪回到过去的某个时间点

                   一下步骤是结合上文中emp数据表进行操作的,根据上面的操作emp表的数据已

                   经被更改,并且commit了事务;这个时候我们考虑到使用oracle的闪回机制去撤销

                  已经提交事物的操作:

                  步骤

      首先需求是在emp表中实现,给员工涨工资,总裁涨1000 经理涨800 其他涨400

      还及得再没有执行该需求前emp表中的数据是怎样的吧这里再给大家看一下:

 

      :

 

   

 

 

 

 

 

 

 

 

(一)首先是先闪回到某个时间点去查询一下表中的数据确定是否要闪回到该时间点:

  (sql1:)select * from emp

  as of timestamp to_timestamp(\'2017-9-16 00:30:00\',\'yyyy-MM-dd hh24:mi:ss\');

  该语句将表闪回到了2017-9-16 00:30:00这个时间点然后看一下数据表中

  的数据是否是你想要的结果:

  可以看到在这个时间点emp表中的数据是没有被修改的状态

  (二)如果确定这个时间点查询到的表中的数据是你想要的结果就进行闪回表操作:

  但是首先要设置表支持行移动:

  (sql1:)alter table emp enable row movement;

  然后执行闪回操作:

  (sql2:) flashback table emp

  to timestamp to_timestamp(\'2017-9-15 08:00:00\',\'yyyy-MM-dd hh24:mi:ss\');

     这样对于emp表的撤销就完成了:

     以上两行语句执行结果为:

      table EMP已变更。

      table EMP 成功。

  查询一下emp表中的数据可以看到:

    Jobs为clerk的员工薪资是800

    Jobs为President的员工薪资是5000

    大功告成!

 

PS:介绍一下oracle的闪回机制:

闪回

概念:闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复.

撤销段

在讲闪回技术前,需要先了解Oracle中一个逻辑结构--撤销段。因为大部分闪回技术都需要依赖撤销段中的撤销数据。撤销数据是反转DML语句结果所需的信息,只要某个事务修改了数据,那么更新前的原有数据就会被写入一个撤销段。(事务回滚也会用到撤销段中的数据)。事务启动时,Oracle 会为其分配一个撤销段,事务和撤销段存在多对一的关系,即一个事务只能对应一个撤销段,多个事务可以共享一个撤销段(不过在数据库正常运行时一般不会发生这种情况)

闪回技术:

 Oracle提供了四种可供使用的闪回技术(闪回查询,闪回删除,闪回归档,闪回数据库),每种都有不同的底层体系结构支撑,但其实这四种不同的闪回技术部分功能是有重叠的,使用时也需要根据实际场景合理选择最合适的闪回功能。

PS内容摘自: http://www.cnblogs.com/chengxiao/p/5860823.html

 

 

                           

 

以上是关于oracle的闪回的主要内容,如果未能解决你的问题,请参考以下文章

Oracle的闪回技术--闪回错误的DML操作

ORACLE闪回技术

Oracle闪回机制

Oracle-闪回技术

oracle异机恢复测试

oracle 提交事务后为啥不能撤销或回滚,不是有撤销段吗