• oracle中的闪回


    项目中运用:

    首先说明:闪回方法有一个前提,就是需要尽早的发现问题,果断的采取行动。若误操作的记录已经在UNDO表空间中被清除,则此方法就不可行了,需要另寻他法。

    例如:

    SELECT * FROM tb_moko_info_basic AS OF TIMESTAMP TO_TIMESTAMP('2014-12-16 9:50:24', 'YYYY-MM-DD HH24:MI:SS') WHERE receipt_num = 'P14120100496';

    使用闪回功能快速恢复用户的误操作

    Oracle提供的闪回特性对于快速恢复误操作的数据起到了非常大的帮助。在没有这个特性的Oracle早期版本,如果需要恢复因用户错误导致的数据丢失,需要大量的时间和精力去做不完全恢复。 不过,这种用空间换时间的策略也存在限制,不可能无限地恢复任何时间点的误操作。针对那些“及时”发现的误操作,使用该方法进行恢复是非常有效的。

    简单演示一下这个方法,供参考。

    1.创建实验表T sec@ora10g> create table t (x int);

    Table created.

    2.初始化数据 sec@ora10g> insert into t values (1);

    1 row created.

    sec@ora10g> commit;

    Commit complete.

    sec@ora10g> insert into t values (2);

    1 row created.

    sec@ora10g> commit;

    Commit complete.

    3.查看表中的数据,之所以使用rowid字段是为了后面实验参考方便。 sec@ora10g> select rowid, x from t;

    ROWID                       X ------------------ ---------- AAASVaAAFAAAAAYAAA          1 AAASVaAAFAAAAAYAAB          2

    4.模拟误删除 sec@ora10g> delete from t;

    2 rows deleted.

    sec@ora10g> commit;

    Commit complete.

    5.看一看此时T表有哪些动作被记录在案? sec@ora10g> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;

    VERSIONS_STARTTIME    VERSIONS_ENDTIME      VERSIONS_XID     V          X --------------------- --------------------- ---------------- - ---------- 05-DEC-09 09.52.51 PM                       09002C004B250000 D          2 05-DEC-09 09.52.51 PM                       09002C004B250000 D          1 05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I          2 05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I          1

    因为前后的操作时间并不是很长,所以对于T表的所有操作都清晰的展示出来了。

    6.恢复方法一:使用UNDO SQL。 重点关注一下“VERSIONS_XID”的内容,每一个不同的值都对应了一个完整的操作动作。我们逐条看一下上面每个动作对应的恢复语句。 1)如果要恢复误删除的操作,可以使用下面的UNDO SQL。 sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='09002C004B250000';

    UNDO_SQL ---------------------------------------------------------------------- insert into "SEC"."T"("X") values ('2'); insert into "SEC"."T"("X") values ('1');

    2)向前一步回滚:回滚插入的“2”,即删除记录“2”对应的行。 sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='090018004B250000';

    UNDO_SQL ---------------------------------------------------------------------- delete from "SEC"."T" where ROWID = 'AAASVaAAFAAAAAYAAB';

    3)再向前回滚:回滚插入的“1”,即删除记录“1”对应的行。 sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='090008004B250000';

    UNDO_SQL ---------------------------------------------------------------------- delete from "SEC"."T" where ROWID = 'AAASVaAAFAAAAAYAAA';

    7.恢复方法二:使用SCN号进行便捷恢复 上面虽然已经列出了具体回滚的SQL语句,只要简单的执行即可,不过如果涉及的到的记录数非常多,那么使用具体的UNDO SQL就不是很方便了。 这里有一个比较简单的方法,我们可以通过XID的值在flashback_transaction_query视图中得到操作前的SCN号,然后根据SCN号进行闪回恢复。简单演示一下。 1)得到误删除之前的SCN号 sec@ora10g> col UNDO_SQL for a42 sec@ora10g> col OPERATION for a8 sec@ora10g> select undo_sql, operation, start_scn from flashback_transaction_query WHERE XID='09002C004B250000';

    UNDO_SQL                                   OPERATIO  START_SCN ------------------------------------------ -------- ---------- insert into "SEC"."T"("X") values ('2');   DELETE     31205010 insert into "SEC"."T"("X") values ('1');   DELETE     31205010                                            BEGIN      31205010 2)使用上面的SCN号“31205010”进行闪回 sec@ora10g> flashback table t to scn 31205010; flashback table t to scn 31205010                 * ERROR at line 1: ORA-08189: cannot flashback the table because row movement is not enabled

    3)上面报错提示信息很明确,需要启用“row movement”。 sec@ora10g> alter table t enable row movement;

    Table altered.

    4)再次尝试闪回,成功。 sec@ora10g> flashback table t to scn 31205010;

    Flashback complete.

    5)最后重新查看一下T表的操作记录 sec@ora10g> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;

    VERSIONS_STARTTIME    VERSIONS_ENDTIME      VERSIONS_XID     V          X --------------------- --------------------- ---------------- - ---------- 05-DEC-09 10.02.16 PM                       09000F004C250000 I          1 05-DEC-09 10.02.16 PM                       09000F004C250000 I          2 05-DEC-09 09.52.51 PM                       09002C004B250000 D          2 05-DEC-09 09.52.51 PM                       09002C004B250000 D          1 05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I          2 05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I          1

    6 rows selected.

    可见闪回的动作也被记录在案,因为使用的是真实的SQL来完成。

    6)使用这种基于SCN的恢复方法可以将表恢复到任何“可恢复”的时间点,比较灵活。 例如,我们可以使用下面的SQL恢复T表到仅插入记录“1”的状态。 sec@ora10g> flashback table t to scn 31204988;

    Flashback complete.

    sec@ora10g> select * from t;

             X ----------          1

  • 相关阅读:
    微信JSSDK使用指南
    安装eclipse中html/jsp/xml editor插件以及改动html页面的字体
    OpenLayers 3+Geoserver+PostGIS实现点击查询
    编程算法
    javascript闭包具体解释
    网络安全基本概念
    Android 5.1 Settings源代码简要分析
    Linq 使用注意
    父类引用指向子类对象
    CPU使用率
  • 原文地址:https://www.cnblogs.com/caogang/p/4449321.html
Copyright © 2020-2023  润新知