• Oracle 10g Flashback实验


    Oracle Flashback 收藏
    概述
    从Oracle 10g开始,提供了一种新的恢复技术,称之为Flashback(闪回技术),这种技术可以任意恢复数据到指定的时间点或某个操作点,尤其是对用户误操作时有极好的帮助。这些误操作包括了

    用户对表的行记录有误操作
    用户对表有总体误操作,如批量修改了一组记录
    用户误删除了某个表
    对于第一、第二类错误,如 果业务逻辑不算太复杂,但数据又非常重要的情况下,效果非常的好。所谓业务逻辑不算太复杂,就是这个表里的记录并非与其它的表有很大的关联性,它的改动不 会引起其它表的改动。所谓数据非常重要,就是这个表里的数据事关业务操作。如上次某客户自己开发的程序将自己的商户记录误删除,导致无法发货。当时的解决 办法是只能跑到镜像系统中恢复整个数据库,并将该表的数据导出来重新导入数据表中,费时费力。

    用户误删除某个表,并且又发生了commit动作后,也可通过flashback技术把这个表“捞”回来(不过如果发生这种事情,肯定是运营上有问题,不是程序设计得不合理,让用户有这种空子可钻,就是验证机制没做好,用户权限过大导致的)。

    如果非要结合SAP来看的话,似乎这三个动作都不太用得到。因为一来SAP的每个表似乎都关联性颇大,二来一般的用户也不太可能直接去删除一个表(SAP还有自己的数据字典,而且也不提倡用户直接在数据库里直接操作)。

    所以我这里只是做了一些实验,来体验一下这个flashback的玩法。

    准备工作
    平台: Windows 2003 32bit Enterprise Edition + Oracle 10.2.0.2

              2G Memory + 15G Hard disk

              Under VMWare workstation

    使用Oracle的数据库创建工具来创建数据库,默认情况下会将flashback打开,这里面有几个重要的参数:

    SQL> show parameter db_flashback_retention_target;

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    db_flashback_retention_target        integer     1440

    SQL> show parameter db_recovery_file_dest;

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    db_recovery_file_dest                string      C:\oracle\SEA/flash_recovery_a

                                                     rea

    db_recovery_file_dest_size           big integer 2G

    分别说明一下它的用途:

    db_flashback_retention_target 代表回闪数据保留的时间,单位是分钟,所以默认的就是1440/60=24小时,就是一天(你可以把它设大一些,以便能保留得更久);
    db_recovery_file_dest 代表回闪数据保存的地方,我这里是c:\oracle\SEA\flash_recovery_area,目录的截图请参看下图
    db_recovery_file_dest_size 代表回闪数据可用的大小,这里是2G,你可以根据实际的业务需要,设得适合自己的用量 
     
    回闪目录截图

    可以看到回闪目录下分别有archivelog,controlfile,flashback和onlinelog几个目录,分别存放着归档日志, 控制文件,回闪记录和在线日志(这个很有意思,如果使用得当,在standby环境中应该就可以做到没有日志丢失,因为在线日志被保存在这个目录下了)。

    实验
    根据Oracle的文档,实验了三个场景下的回闪。

    先准备用户和表。

    SQL>create user sea identified by asap;

    SQL>grant connect, resource to sea;

    SQL>connect sea/asap;

    SQL>create table users (name varchar2(90), age int, gender char(1));

    SQL>insert into users values('Sea Zhang', 40, 1);

    SQL>commit;

    SQL>alter table users enable row movement;

    一定要有最后这一步,激活行移动,否则表是不能回闪的。

    SQL>connect / as sysdba;

    SQL>alter system switch logfile;

    做这步的目的,就是做一个时间点,方便我查看而已,这时的时间是2008-06-23 13:58。

    SQL>connect sea/sap;

    SQL>insert into users value('Marty Ma', 28, 1);

    SQL>commit;

    SQL>column name format c20;

    SQL> select * from users;

    NAME                        AGE G

    -------------------- ---------- -

    Sea Zhang                    40 1

    Marty Ma                     28 1

    SQL> flashback table users to timestamp

      2  to_timestamp('2008-06-23 13:58:00', 'YYYY-MM-DD HH24:MI:SS');

    闪回完成。

    SQL> select * from users;

    NAME                        AGE G

    -------------------- ---------- -

    Sea Zhang                    40 1

    这里看到我后面加的小马同志的记录没了,假设从那个时间点后有错误发生,那么仅此一步就可以把对这个表的任何错误操作都纠正过来了(到此似乎已经觉得有点爽了)。

    再来一个场景,恢复单条记录。

    SQL>insert into users value('Marty Ma', 28, 1);

    SQL>commit;

    SQL> select * from users;

    NAME                        AGE G

    -------------------- ---------- -

    Sea Zhang                    40 1

    Marty Ma                     28 1

    我也不知道为什么非要拿小马同志来又加又删的,反正就是不让他安生。

    SQL> delete from users where name='Marty Ma';

    已删除 1 行。

    SQL> commit;

    提交完成。

    SQL>select * from users;

    NAME                        AGE G

    -------------------- ---------- -

    Sea Zhang                    40 1

    试着恢复一下小马同志的记录,先要查看一下历史记录里的情况,14:57之前的表里的记录有我们的小马同志。

    SQL> select * from users as of timestamp

      2  to_timestamp('2008-06-23 14:57:00', 'YYYY-MM-DD HH24:MI:SS');

    NAME                        AGE G

    -------------------- ---------- -

    Sea Zhang                    40 1

    Marty Ma                     28 1

    那我要做的事情就是把这条记录加回来就成。

    SQL> insert into users

      2  (select * from users as of timestamp

      3  to_timestamp('2008-06-23 14:57:00', 'YYYY-MM-DD HH24:MI:SS')

      4  where name='Marty Ma');

    已创建 1 行。

    SQL> select * from users;

    NAME                        AGE G

    -------------------- ---------- -

    Marty Ma                     28 1

    Sea Zhang                    40 1

    SQL> commit;

    提交完成。

    最后一个场景,误删除了整个表(连我自己的记录都没了)。

    SQL> drop table users;

    表已删除。

    SQL> show recyclebin;

    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

    ---------------- ------------------------------ ------------ -------------------

    USERS            BIN$hQZcZM2zS0CFnEb+p374uQ==$0 TABLE        2008-06-23:15:07:25

    这里需要提醒一点的是,在SAP中,默认的recyclebin是关闭的,因为这会增加系统的负载,所以如果你要使用这个功能,就需要把这个功能打开。

    SQL> select * from "BIN$hQZcZM2zS0CFnEb+p374uQ==$0";

    NAME                        AGE G

    -------------------- ---------- -

    Marty Ma                     28 1

    Sea Zhang                    40 1

    SQL> desc users;

    ERROR:

    ORA-04043: 对象 users 不存在

    SQL> flashback table users to before drop;

    闪回完成。

    SQL> desc users;

     名称                                      是否为空? 类型

     ----------------------------------------- -------- ----------------------------

     NAME                                               VARCHAR2(80)

     AGE                                                NUMBER(38)

     GENDER                                             CHAR(1)

    SQL> select * from users;

    NAME                        AGE G

    -------------------- ---------- -

    Marty Ma                     28 1

    Sea Zhang                    40 1

    至此,flashback的几个场景都试验完成。

    另附flashback table语法
    1. 语法
     
    FLASHBACK TABLE
       [ schema. ]table
         [, [ schema. ]table ]...
       TO { { SCN | TIMESTAMP } expr
            [ { ENABLE | DISABLE } TRIGGERS ]
          | BEFORE DROP [ RENAME TO table ]
          } ;
     
    2. 测试当回收站中存在两个重名的表时,如何闪回:
    -- 1. 创建测试环境
    C:\Documents and Settings\yuechao.tianyc>sqlplus test/test
     
    SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 3月 31 18:52:38 2009
     
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
     
     
    连接到:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options
     
    SQL> create table test_purge as select 1 a from dual;
     
    表已创建。
     
    SQL> drop table test_purge;
     
    表已删除。
     
    SQL> show recyclebin
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    TEST_PURGE       BIN$op097VdeQwKNHTBVCa/23w==$0 TABLE        2009-03-31:19:04:10
     
    SQL> create table test_purge as select 1 a, 2 b from dual;
     
    表已创建。
     
    SQL> drop table test_purge;
     
    表已删除。
     
     
    SQL> show recyclebin
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    TEST_PURGE       BIN$fvirzrOASPCDF5v1WSe9iw==$0 TABLE        2009-03-31:19:04:33
    TEST_PURGE       BIN$op097VdeQwKNHTBVCa/23w==$0 TABLE        2009-03-31:19:04:10
     
    -- 2. 闪回:此时采用“后进先出”的策略来闪回
    SQL> flashback table test_purge to before drop;
     
    闪回完成。
     
    SQL> desc test_purge
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     A                                                  NUMBER
     B                                                  NUMBER
     
    SQL> show recyclebin
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    TEST_PURGE       BIN$op097VdeQwKNHTBVCa/23w==$0 TABLE        2009-03-31:19:04:10
     
    -- 3. 继续闪回:因为名称相同而失败
    SQL> flashback table test_purge to before drop;
    flashback table test_purge to before drop
    *
    第 1 行出现错误:
    ORA-38312: 原始名称已被现有对象使用
     
     
    -- 3. 使用rename to 子句来闪回第二个同名的表
    SQL> flashback table test_purge to before drop rename to test_purge_old;
     
    闪回完成。
     
    SQL> desc test_purge_old
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ---------------------------
     A                                                  NUMBER
     
    SQL> show recyclebin
    SQL>
     
    -- 4. 测试 purge table:按照“先进先出”的顺序purge
    SQL> drop table test_purge;
     
    表已删除。
     
    SQL> show recyclebin
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    TEST_PURGE       BIN$ei/ce6WZTPiZ5CBiAbBRXQ==$0 TABLE        2009-03-31:20:43:03
     
    SQL> rename test_purge_old to test_purge;
     
    表已重命名。
     
    SQL> drop table test_purge;
     
    表已删除。
     
    SQL> show recyclebin
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    TEST_PURGE       BIN$SiNTtrq9TduKnIPxRynwbQ==$0 TABLE        2009-03-31:20:43:43
    TEST_PURGE       BIN$ei/ce6WZTPiZ5CBiAbBRXQ==$0 TABLE        2009-03-31:20:43:03
     
    SQL> purge table test_purge;
     
    表已清除。
     
    SQL> show recyclebin
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    TEST_PURGE       BIN$SiNTtrq9TduKnIPxRynwbQ==$0 TABLE        2009-03-31:20:43:43
     
    SQL> purge table test_purge;
     
    表已清除。
     
    SQL>  show recyclebin
    SQL>
  • 相关阅读:
    FlaskRESTful之响应处理
    FlaskRESTful之请求处理(RequestParser)
    FlaskRESTful之入门
    Flask框架之异常处理和请求钩子
    Flask框架之Cookie和Session
    Flask框架之请求和响应
    Flask框架的路由和蓝图
    初识Flask框架
    DRF框架之问题总结
    字符串和date数据进行转换和Date类型进行计算
  • 原文地址:https://www.cnblogs.com/datalife/p/1985323.html
Copyright © 2020-2023  润新知