暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

聊聊关于Oracle误删除数据后的闪回技术

数据管理员 2021-11-04
488

昨天下午分享了一篇delete误删数据后,使用闪回查询恢复数据的技术,今天将继续分享闪回数据库,闪回表数据和闪回drop


备注(1):闪回技术是Oracle备份恢复的一部分,在于解决数据库发生逻辑错误时,能够快速的恢复数据。闪回技术的实现,依赖于Oracle强大体系中的redo 日志和undo 日志


备注(2):对于物理损坏时(比如硬盘故障),就需要借助Oracle的备份恢复工具了(例如exp/imp,expdp/impdp,rman等)


闪回支持以下恢复:


(1)

闪回数据库:

    SQL> select flashback_on from v$database;
    FLASHBACK_ON
    ------------------
    NO
    在oracle11g中打开闪回数据库可以在open状态打开
      下面这是oracle10g时的操作:
      SQL> SHUTDOWN IMMEDIATE;
      SQL> STARTUP MOUNT;
      SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=5G;
      SQL>alter system set db_recovery_file_dest='/flash';
      SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=2880 SCOPE=BOTH; --默认是1440 一天
      SQL> ALTER DATABASE FLASHBACK ON;
      SQL> ALTER DATABASE OPEN;

      至此,闪回数据库已经配置完成

      闪回数据库的使用

        SQL> shutdown immediate;
        SQL> startup mount;
        SQL> flashback database to timestamp sysdate-60/1440;
        SQL> alter database open resetlogs;


        (2)闪回表数据

          SQL> create table sal1 as select * from sal;


          表已创建。


          SQL>
          SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;


          TO_CHAR(SYSDATE,'YY
          -------------------
          2021-11-04 15:47:02


          SQL>
          SQL>
          SQL> delete sal1;


          已删除19行。


          SQL>
          SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;


          TO_CHAR(SYSDATE,'YY
          -------------------
          2021-11-04 15:47:29


          SQL> flashback table sal1 to timestamp to_timestamp('2021-11-04 15:47:00','yyyy-
          mm-dd hh24:mi:ss');
          flashback table sal1 to timestamp to_timestamp('2021-11-04 15:47:00','yyyy-mm-dd
          hh24:mi:ss')
          *
          第 1 行出现错误:
          ORA-08189: 因为未启用行移动功能, 不能闪回表




          SQL> alter table sal1 enable row movement;


          表已更改。


          SQL>
          SQL> flashback table sal1 to timestamp to_timestamp('2021-11-04 15:47:00','yyyy-
          mm-dd hh24:mi:ss');


          闪回完成。


          SQL>
          SQL> select count(*) from sal1;


          COUNT(*)
          ----------
          19


          SQL>
          SQL>


          (3)闪回drop


            创建测试表
            SQL> create table test1 as select * from crm.sal;
            表已创建。
            SQL>
            SQL> select count(*) from test1;
            COUNT(*)
            ----------
                    19
            SQL>


            模拟drop表


            SQL> drop table test1;
            表已删除。
            SQL>
            SQL> show recyclebin
            ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
            ---------------- ------------------------------ ------------ -------------------




            TEST1 BIN$vpXHkffmRPuIjKUu/7kd9A==$0 TABLE 2021-11-04:15:14:58


            SQL>flashback table "BIN$vpXHkffmRPuIjKUu/7kd9A==$0" to before drop;
            闪回完成。
            SQL>


            闪回表之后,再次查询test1表,表存在并且数据无丢失
            SQL> select count(*) from test1;
            COUNT(*)
            ----------
                    19
            SQL>

            至此,闪回数据库,闪回表数据,闪回drop就已经分享完成了。在实际的生产数据库系统中,闪回数据库通常适用于数据库升级压力测试,针对的整个数据库系统的闪回还原,影响的是整个数据库系统。

            闪回表数据和闪回drop,针对的是表操作,不影响系统中其它的业务表。闪回技术依赖于数据库体系中强大的undo和redo,我们在测试环境中,数据量小,没有别的其它操作,可以通过闪回技术来恢复数据。当在一个成熟的数据库系统中,dml和ddl语句是很频繁的,当undo被复写时,闪回就不能帮助恢复数据。当闪回过期不能使用时,做好数据库备份,成为了日常管理运维的重要任务,后面会分享Oracle数据库备份的工具和方法。



            文章转载自数据管理员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论