ITPub博客

首页 > 数据库 > Oracle > 闪回表技术

闪回表技术

原创 Oracle 作者:skyin_1603 时间:2016-09-29 23:51:20 0 删除 编辑
有时候,我们插入更新数据,已经成功插入部分数据并提交commit了,发现有些数据插入错误或者不想插入,
我们想返回某个时间点(timestamp)或者scn的数据状态,这时候,我们可以通过闪回表技术帮忙解决这个问题。

此处,我们只通过时间来做一次闪回表:
进入scoot用户创建的test1表,并显示时间,查看此时状态的数据,
conn scott/tiger0520

SQL> set time on

22:12:25 SQL>

22:12:25 SQL>  select * from test1;

no rows selected

插入一条数据,提交并插叙此时的数据,

22:19:50 SQL> insert into test1 values(10,'ACCOUNTING','NEW YORK');

1 row created.

22:19:55 SQL> commit;

Commit complete.

 

22:20:01 SQL> select * from test1;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

再插入一条数据,提交并查询此时的数据,

22:20:21 SQL> insert into test1 values(20,'RESEARCH','DALLAS');

1 row created.

22:20:37 SQL> commit;

Commit complete.

22:20:45 SQL> select * from test1;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS
此时,发现插入数据错误,只想插入上述的第一条数据,这时马上闪回,
22:20:56 SQL> flashback table test1 to timestamp

22:28:33   2  to_timestamp('2016-09-29 22:20:37','yyyy-mm-dd hh24:mi:ss');

flashback table test1 to timestamp

                *

ERROR at line 1:

ORA-08189: cannot flashback the table because row movement is not enabled

此时发现报错。
因为闪回表时,数据的rowid已经发生了改变,一般情况下,数据库不允许随意改变表数据的rowid,
这时候,我们已改用
alter table  test1 enable row movement,允许改动rowid,
alter table  test1 enable row movement;
再次执行闪回表,发现,数据恢复到时间为22:20:37的数据

22:31:09 SQL> flashback table test1 to timestamp

22:31:23   2  to_timestamp('2016-09-29 22:20:37','yyyy-mm-dd hh24:mi:ss');

Flashback complete.

22:31:40 SQL> select * from test1;                                        

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK


闪回表成功。





















来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31392094/viewspace-2125774/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 闪回删除技术:
请登录后发表评论 登录
全部评论

注册时间:2016-09-06

  • 博文量
    231
  • 访问量
    215103