加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

通过闪回恢复误删除的数据

发布时间:2020-12-15 17:38:22 所属栏目:百科 来源:网络整理
导读:Flashback 是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。Flashback Query分Flashba
Flashback 是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。Flashback Query分Flashback Query,Flashback Version Query,Flashback Transaction Query 三种。

Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据。flashback query 对v$tables,x$tables 等动态性能视图无效,不过对于dba_*,all_*,user_*等数据字典是有效的。

Flashback query就是利用UNDO来实现的功能。不同的事务在写数据时,会将数据的前映像写入undo 表空间,这样如果同时有其它事务查询该表数据,则可以通过undo 表空间中数据的前映像来构造所需的完整记录集,而不需要等待写入的事务提交或回滚。Flashback query 有多种方式构建查询记录集,记录集的选择范围可以基于时间或基于scn,甚至可以同时查询出记录在undo 表空间中不同事务时的前映象。 ? ? ? ? 用法与标准查询非常类似,要通过flashback query 查询undo 中的撤销数据,最简单的方式只需要在标准查询语句的表名后面跟上as of timestamp(基于时间)或as of scn(基于scn)即可。 as of timestamp|scn 的语法是自9iR2 后才开始提供支持。

Flashback query受到UNDO_RETENTION参数的影响。该参数默认是900s,这个值是远远不够的。应该酌情调高该参数。调高该参数将导致UNDO表空间使用,随之而来的问题是UNDO表空间的过分扩展,不易回收。调低该参数在使用Flashback query时可能会出现ORA-01555错误。这个参数的调整需要在充分测试的基础上进行。

测试环境

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

查询当前系统SCN的方法

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    1478710

SQL>  select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1478725

模拟数据误删除场景并使用闪回进行恢复

-->创建测试表
SQL> create table t1 (id int,uname varchar2(20));
Table created.

SQL> insert into t1 values (1,'zhangsan');
1 row created.

SQL> insert into t1 values(3,'wangwu');
1 row created.

SQL> insert into t1 values(4,'xiaoqiang');
1 row created.

SQL> commit;
Commit complete.

SQL> select * from t1;
        ID UNAME
---------- --------------------
         1 zhangsan
         3 wangwu
         4 xiaoqiang
-->查询当前SCN号和系统时间
SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1480055

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    1480064

-->在真实故障中,我们不可能知道准确的SCN,但是可以从v$archived_log视图中获取SCN,可以多次尝试以便获取最佳结果。如果能获得准确的时间,可以获得准确的闪回。
SQL> select name,first_change#,next_change#,first_time,next_time from v$archived_log;

NAME                                               FIRST_CHANGE# NEXT_CHANGE# FIRST_TIME              NEXT_TIME
-------------------------------------------------- ------------- ------------ ----------------------- -----------------------
+ARCH/csdb/archivelog/2014_04_28/thread_2_seq_8.25       1327467      1375498 28-APR-2014 04:00:12    28-APR-2014 15:10:56
6.846083457

+ARCH/csdb/archivelog/2014_04_28/thread_2_seq_9.25       1375700      1384875 28-APR-2014 15:12:39    28-APR-2014 16:40:51
7.846088851

+ARCH/csdb/archivelog/2014_04_28/thread_1_seq_66.2       1331279      1417258 28-APR-2014 05:00:23    28-APR-2014 22:00:47
58.846108049

+ARCH/csdb/archivelog/2014_04_29/thread_1_seq_67.2       1417258      1477707 28-APR-2014 22:00:47    29-APR-2014 08:59:20
59.846147561

NAME                                               FIRST_CHANGE# NEXT_CHANGE# FIRST_TIME              NEXT_TIME
-------------------------------------------------- ------------- ------------ ----------------------- -----------------------

-->模拟误操作,将全部数据删除,并且进行了提交。
SQL> delete from t1;
3 rows deleted.

SQL> commit;
Commit complete.

-->通过闪回查询来恢复误删除的操作
SQL> select * from t1 as of scn 1480055;

        ID UNAME
---------- --------------------
         1 zhangsan
         3 wangwu
         4 xiaoqiang

-->如果要进行数据恢复操作需要先建一个表,将查询出来的数据插入该表中
SQL> create table t1_recover as select * from t1 where 0=1;
Table created.

SQL> insert into t1_recover select * from t1 as of scn 1480055;
3 rows created.

SQL> commit;
Commit complete.

SQL> select * from t1_recover;
        ID UNAME
---------- --------------------
         1 zhangsan
         3 wangwu
         4 xiaoqiang
到这里,通过闪回恢复误删除数据的操作就完成了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读