`
zengshaotao
  • 浏览: 777592 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

oracle scn recovery data

 
阅读更多
今天测试下了oracle在删除表的数据后的恢复方法。

在oracle生产系统的维护测试中有一张表,将里面的数据delete并commit了,由于业务不能中断(数据库不能停机),并且系统还在不断有数据往该表中写入。现在需要将之前delete掉的数据恢复,可以使用基于scn的恢复。

在删除之前,最好查询到数据库当前的scn,恢复的时候就采用基于这个scn点的恢复。

example:
方法一:
1)创建一张测试表;
      CREATE TABLE w AS SELECT * FROM dba_objects WHERE 1 = 2;
2)向该表插入测试数据;
      SQL> insert into w select * from dba_objects;

      72558 rows created.

      SQL> commit;

      Commit complete.
3)SQL> select count(*) from w;

      COUNT(*)
      ----------
      72558
4)在删除之前,先获取数据库的scn,便于恢复的时候查找到数据在什么时候还是存在的;
      SQL> select dbms_flashback.get_system_change_number from dual;

      GET_SYSTEM_CHANGE_NUMBER
      ------------------------
       117853514                 ------ 当前scn号
      由于数据库没有停,因此scn号也在不断变化,因此需要查出数据在哪个scn点的时候还是存在的
      SQL> select count(*) from w as of scn 117854000; ------查看数据在scn号为117854000时是否存在
      select count(*) from w as of scn 117854000
                     *
      ERROR at line 1:
      ORA-08181: specified number is not a valid system change number  ------应该是系统还没有走到这个scn号


      SQL> select count(*) from w as of scn 117853000;------查看数据在scn号为117853000时是否存在

      COUNT(*)
      ----------
       0       ------不存在

      SQL> select count(*) from w as of scn 117853500;

      COUNT(*)
      ----------
       0

      SQL> select count(*) from w as of scn 117853510;    直到查到这个scn才发现数据才存在,因此届时就是基于这个scn点进行恢复

      COUNT(*)
      ----------
       72558
5)模拟删除数据;
      SQL> delete from w;

      72558 rows deleted.

      SQL> commit;

      Commit complete.
      SQL> SELECT COUNT(*) FROM w;

      COUNT(*)
      ----------
       0
6)模拟数据库不停机,业务在不断向表中插入数据;
       SQL> insert into w select * from w as of scn 117844000;

       72558 rows created.

       SQL> select count(*) from w;

       COUNT(*)
       ----------
       72558
7)执行基于删除之前数据仍然存在的scn点的恢复;
      SQL> insert into w select * from w as of scn 117853510;

      72558 rows created.

      SQL> commit;

      Commit complete.
8)查询验证,之前删除的数据是否恢复回来了,并且新插入的数据也存在;
      SQL> select count(*) from w;

       COUNT(*)
       ----------
        145116
大功告成。之前delete掉的72558条数据+新进来的72558条数据,总共是145116条数据。达到我们的要求!

现在稍微总结一下:
        在做数据表的删除操作之前,一点要谨慎,尤其是在生产系统不能停机的情况下,要么首先将数据库或者表备份一下,再进行删除,这样就算需要恢复也可以用备份进行恢复;如果删除时候没有做相关备份,在删除之前一定要先查下系统当前scn,并且验证出数据在哪个scn点的时候还是存在的(这点很重要,如果没有找到,就无法恢复删除的数据)恢复的时候就基于这个scn点的恢复。

方法二:
1)同样创建上面的测试表和数据;
      SQL> select count(*) from w;

      COUNT(*)
      ----------
       72558
2)查询下数据库的时间,用于确定删除的数据在什么时间点还存在;
      SQL> select to_char(sysdate, 'yyyy-dd-mm hh24:mi:ss') from dual;

      TO_CHAR(SYSDATE,'YY
      -------------------
       2011-23-03 17:23:55

      SQL> select count(*) from w;

      COUNT(*)
       ----------
        72558      -------数据在2011-23-03 17:23:55的时间还存在
3)模拟数据的删除操作;
       SQL> delete from w;

       72558 rows deleted.

        SQL> commit;

        Commit complete.
4)将删除数据之前的时间(数据还存在的时间)转换为scn;
      SQL> select timestamp_to_scn(to_timestamp('2011-03-23       17:22:00','yyyy-mm-dd hh24:mi:ss')) from dual;

      TIMESTAMP_TO_SCN(TO_TIMESTAMP('2011-03-2317:22:00','YYYY- MM-DDHH24:MI:SS'))
       ---------------------------------------------------------------------------
                                  117872363
5)验证这个scn点时数据的存在;
      SQL> select count(*) from w as of scn 117872363;

      COUNT(*)
       ----------
       72558
6)创建基于原表数据还存在时的临时表;
       SQL> create table q as select * from w as of scn 117872363;

       Table created.
       以上语句由两条语句合并而成:
       SQL> create table q as select * from w where 1 = 0;

       Table created.

       SQL> insert into q select * from w as of scn 117872363;

       72558 rows created.
       

       SQL> select count(*) from q;

        COUNT(*)
         ----------
         72558
7)由于业务并未中断,所以原表里面也有新数据进来了,此时只要将刚创建的临时表的数据导出,然后再倒入到原表中即可。
分享到:
评论

相关推荐

    oracle scn

    * transaction recovery:SCN 帮助 Oracle 决定在一次突然中断或者 SHUTDOWN ABORT 后,是否需要一个崩溃恢复。 * query consistency:Oracle 还使用数据块的 SCN 来维护查询的一致性和多版本。 Oracle SCN 是一个...

    Oracle SCN详解

    Checkpoint 的目的就是要把存储在 buffer 内的已提交交易写回 disk,否则一旦发生 crash,需要进行 recovery 时,就必须花很多时间从 redo log file内最后的 SCN 交易开始进行 recovery,这样在商业应用上是很浪费...

    scn号与恢复研究.pdf

    ### SCN号与Oracle数据库恢复研究 #### 一、SCN与Checkpoint 在Oracle数据库中,SCN(System Change Number)是一个非常重要的概念,它用来标识数据库中的任何改变。SCN是Oracle内部使用的数字序列,每当数据库发生...

    oracle介质恢复的内部过程

    本文将详细探讨Oracle介质恢复的内部过程,通过对控制文件(controlfile)、重做日志(redolog)、数据文件(datafile)等内容的深入分析,帮助读者理解这一复杂的流程。 #### 二、Oracle介质恢复的基本概念 1. **Start ...

    oracle 闪回oracle 闪回oracle 闪回oracle 闪回

    Oracle闪回技术基于数据库的撤销数据(Undo Data),它允许用户和管理员在不破坏当前数据库状态的情况下,查询或恢复过去的数据。这一功能在误删除、数据损坏或需要历史数据分析的情景下尤为重要。 ### 主要的...

    oracle 增量恢复详细记录

    在Oracle数据库管理系统中,RMAN(Recovery Manager)是一种强大的工具,用于执行数据库的备份与恢复操作。其中,增量备份作为一种高效的方式,在实际应用中非常普遍。增量备份的核心优势在于仅备份自上次完整或增量...

    用Oracle闪回功能恢复偶然丢失的数据.txt

    SQL> ALTER SYSTEM SET db_recovery_file_dest='D:\oracle\flash_recovery_area\test'; ``` - **监控闪回区域使用情况**:通过`V$RECOVERY_FILE_DEST`视图监控闪回区域的使用率,以避免空间不足导致的潜在问题。 ...

    oracle数据库不完全恢复

    查询SCN可以通过`v$datafile`、`v$datafile_header`、`v$database`、`v$log`以及`v$log_history`视图进行。 不完全恢复分为三种类型: 1. 时间基恢复(Time-based recovery):恢复到特定时间点,该点之前的所有...

    断档恢复-基于scn 号恢复.pdf

    3. **执行基于SCN的RMAN增量备份**:在主库上,使用RMAN(Recovery Manager)工具执行增量备份,指定从SCN开始,例如: - `RMAN> BACKUP DEVICE TYPE DISK INCREMENTAL FROM SCN <SCN from previous step> DATABASE...

    oracle数据库ORA-01196错误解决办法分享

    RMAN提供了强大的恢复功能,如`LIST INCOMPLETE RECOVERY`可以列出需要恢复的文件,`RESTORE DATABASE`和`RECOVER DATABASE`可以恢复整个数据库,而`RESTORE DATAFILE`和`RECOVER DATAFILE`则用于恢复单个文件。...

    oracle数据安全 数据保护

    RMAN (Recovery Manager) 是 Oracle 提供的一种强大而灵活的数据备份、恢复工具,它可以帮助数据库管理员执行各种复杂的备份与恢复操作。通过 RMAN,可以有效地管理 Oracle 数据库的备份和恢复策略,确保数据的安全...

    oracle数据库自动备份与恢复.zip

    在Linux系统中,通常使用RMAN(Recovery Manager)工具来执行Oracle数据库的备份。RMAN是Oracle数据库自带的命令行工具,它可以创建完整的数据库备份、增量备份以及归档日志备份。通过配置cron job或者systemd定时...

    oracle的入门心得.pdf

    对于数据库的维护与管理,Oracle提供了一系列的工具和组件,如RMAN(Recovery Manager),用于数据库的备份、恢复和迁移。通过RMAN,用户可以更加便捷地进行数据库的备份和恢复操作,同时它还支持增量备份、数据压缩...

    oracle 备份文档

    - **Incmplt recovery SCN**: 如果数据库曾经过恢复,这个SCN将不再是0,它记录了最后一次未完成恢复过程的SCN值。 - **Redo in Controlfile**: 提供了关于重做日志文件的信息,包括当前使用的线程、文件编号、SCN...

    Oracle Goldengate 安装

    记录并提供解决方案针对各种常见问题,如队列文件保存期限设置、AIX使用裸设备、UNIX GGSCI需要lib包验证、OGG错误代码、复制进程拆分、BOUNDED RECOVERY、从指定时间重新抓取等。 9. Oracle GoldenGate反向切换...

    实验8-Oracle数据库备份与恢复.pdf

    RMAN(Recovery Manager)是 Oracle 数据库提供的一种备份和恢复工具。RMAN 可以用于备份和恢复数据库。RMAN 的优点是可以自动管理备份和恢复过程,减少数据库管理员的工作量。 四、 数据的导入与导出 Oracle ...

    oracle 10g 数据库恢复

    RMAN支持全库备份、表空间备份、文件备份等多种备份类型,并且能够进行基于时间、基于SCN(系统更改号)和基于归档日志的恢复。 #### 3. 数据文件恢复 当某个数据文件损坏或丢失时,可以通过RMAN进行单独的数据...

    ORACLE 数据库RAC环境DG主备不同步问题处理.docx

    Oracle 数据库RAC环境下的Data Guard (DG) 是一种高可用性和灾难恢复解决方案,它通过在不同的物理位置创建和维护一个或多个备用数据库来保护关键数据。在这个特定的问题中,我们面临的是一个主库和备库不同步的情况...

Global site tag (gtag.js) - Google Analytics