`
zengshaotao
  • 浏览: 787640 次
  • 性别: 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数据库管理系统中,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 闪回oracle 闪回oracle 闪回oracle 闪回

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

    ORACLE 11gR2 备份与还原

    在《Oracle Database Backup and Recovery User's Guide》11g Release 2 (11.2)文档中,全面介绍了Oracle数据库的备份与恢复策略。这份指南不仅涵盖了RMAN(Recovery Manager)备份和恢复技术,还包括了用户管理的...

    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进行单独的数据...

Global site tag (gtag.js) - Google Analytics