• 总结oracle flashback 特性


     
    Oracle 9i只能够使用flashback query。10G依然可以使用闪回查询,与9i没有变化。但flashback功能大幅强化,新增很多特性;如闪回表,闪回数据库等等。11g又增加了flashback archive ,可以提供不依靠undo的闪回功能。通过实验完成闪回功能测试,仅供参考。
     
    10g默认启用除了闪回数据库之外的所有闪回功能,如果想打开Flashback database,要使用闪回区。Flashback database使用flashbacklog & onlinelog/archivelog 实现数据库闪回,flashbackarchive通过永久tablespace实现闪回。其他都是通过undo段实现闪回。

    SQL> grant flashback any table to scott;
     
    Grant succeeded
     
    SQL> grant execute on dbms_flashback to scott;
     
    Grant succeeded
     
    1 ONE - Flashback query
    1.1 基于scn的查询
     
    SQL> select dbms_flashback.get_system_change_number from dual;
     
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                      479197
     
    SQL> select sal from emp where ename='SCOTT';
     
          SAL
    ---------
      3000.00
     
    SQL> update emp set sal = 5000 where ename='SCOTT';
     
    1 row updated
     
    SQL> commit;
     
    Commit complete

    SQL> select sal from emp where ename='SCOTT';
     
          SAL
    ---------
      5000.00
     
    SQL> select sal from emp as of scn 479197 where ename='SCOTT';
     
          SAL
    ---------
      3000.00
     
    1.2 基于时间的查询
     
    SQL> select sal from emp as of timestamp to_timestamp('20111105 20:30:00','yyyymmdd hh24:mi:ss') where ename='SCOTT';
     
          SAL
    ---------
      3000.00
     
    1.3 可以创建闪回表
     
    SQL> create table f_emp as select * from emp as of scn 479197;
     
    Table created
     
     
    说明:
    1.要求,使用自动管理的undo表空间,但不要求DB处于归档模式;
    2.使用当前数据字典,所以如果表结构发生变化,无法闪回;
    3.drop truncate等ddl操作无法闪回;
    4.受到参数undo_retention的限制,之前的数据,不能保证闪回成功;
     
     
    2 TWO - Flashback drop
    必须打开回收站
    10.1版本中,修改隐藏参数 _recyclebin
          alter system set "_recyclebin" = false;
    10.2版本中,
          alter system set recyclebin = off;
    SQL> conn sys/czjie@ORCL as sysdba;
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
    Connected as SYS

    SQL> show parameter recyclebin;
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    recyclebin                           string      on
    注意:
        alter system set recyclebin = off/on DEFERRED;
    2.1 flashback drop table
    SQL> conn scott/tiger@ORCL
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
    Connected as scott
     
    SQL> drop table emp;
     
    Table dropped

    SQL> select original_name,object_name,type,droptime from recyclebin;
     
    ORIGINAL_NAME                    OBJECT_NAME                     TYPE                      DROPTIME          
    ------------------------ --------------------------------------  ------------------------- -------------------
    EMP                              BIN$sP1RQPcQ6frgQAB/AQALZQ==$0  TABLE                     2011-11-05:20:54:08


    SQL> flashback table emp to before drop;
     
    Done
     
     
    2.2 如果有多张表重名,先恢复后删除的
     
    SQL> create table emp2 as select * from emp where rownum<=3;
     
    Table created
     
    SQL> drop table emp2;
     
    Table dropped
     
    SQL> create table emp2 as select * from emp where rownum<=2;
     
    Table created
     
    SQL> drop table emp2;
     
    Table dropped
     
    SQL> select original_name,object_name,type,droptime from recyclebin;
     
    ORIGINAL_NAME                    OBJECT_NAME                    TYPE                      DROPTIME
    -------------------------------- ------------------------------ ------------------------- -------------------
    EMP2                             BIN$sP1RQPcR6frgQAB/AQALZQ==$0 TABLE                     2011-11-05:20:58:49
    EMP2                             BIN$sP1RQPcS6frgQAB/AQALZQ==$0 TABLE                     2011-11-05:20:59:14

    SQL> flashback table emp2 to before drop;
     
    Done
     
    SQL> select original_name,object_name,type,droptime from recyclebin;

    ORIGINAL_NAME                    OBJECT_NAME                    TYPE                      DROPTIME
    -------------------------------- ------------------------------ ------------------------- -------------------
    EMP2                             BIN$sP1RQPcR6frgQAB/AQALZQ==$0 TABLE                     2011-11-05:20:58:49

    SQL> select count(*) from emp2;
     
      COUNT(*)
    ----------
             2
            
    --可以看到最晚时间为20:59:14的且只有3行表数据的emp2给恢复了;

    下面再次恢复20:58:49删除的表emp2:
    SQL> flashback table emp2 to before drop;
     
    flashback table emp2 to before drop
     
    ORA-38312: original name is used by an existing object
    注意:错误提示原始名称已被现有对象使用

    SQL> flashback table emp2 to before drop rename to emp3;
    Done

    SQL> select count(*) from emp3;
     
      COUNT(*)
    ----------
             3
     
    2.3 索引会同时恢复,但是名字会更改;

    SQL> create index test on emp2(ename);
    Index created
     
    SQL> drop table emp2;
    Table dropped。
     
    SQL> flashback table emp2 to before drop;
    Done
     
    SQL> select table_name,index_name,status from user_indexes where table_name='EMP2';
     
    TABLE_NAME                     INDEX_NAME                     STATUS
    ------------------------------ ------------------------------ --------
    EMP2                           BIN$sP1RQPcT6frgQAB/AQALZQ==$0 VALID
     
    SQL> alter index "BIN$sP1RQPcT6frgQAB/AQALZQ==$0" rename to test;
    Index altered

    SQL> select table_name,index_name,status from user_indexes where table_name='EMP2';
    TABLE_NAME                     INDEX_NAME                     STATUS
    ------------------------------ ------------------------------ --------
    EMP2                           TEST                           VALID


    2.4 扩展

    1.purge recyclebin; 清空回收站

    2、drop table tableName purge; 删除表而不进回收站
     
    3.drop tablespace including contents and datafiles; 数据不入回收站
     
    4.drop user cascade; 数据不入回收站

     
    3 Three - flashback table
    3.1 Flashback dml
     
    SQL> create table emp2 as select * from emp;

    Table created
     
     
    SQL> select dbms_flashback.get_system_change_number from dual;
     
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                      482035
     
    SQL> update emp2 set sal=1 where ename = 'SCOTT';
     
    1 row updated
     
    SQL> commit;
     
    Commit complete
     
    SQL> select dbms_flashback.get_system_change_number from dual;
     
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                      482089
     
    SQL> update emp2 set sal=2 where ename = 'SCOTT';
     
    1 row updated
     
    SQL> commit;
     
    Commit complete
     
    SQL> select dbms_flashback.get_system_change_number from dual;
     
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                      482117
     
    SQL> update emp2 set sal=3 where ename = 'SCOTT';
     
    1 row updated
     
    SQL> commit;
     
    Commit complete
     
    SQL> select dbms_flashback.get_system_change_number from dual;
     
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                      482128
     
    SQL> update emp2 set sal=4 where ename = 'SCOTT';
     
    1 row updated
     
    SQL> commit;
     
    Commit complete


    SQL> flashback table emp2 to scn 482035;
     
    flashback table emp2 to scn 482035
     
    ORA-08189: cannot flashback the table because row movement is not enabled
    ORA-08189: 因为未启用行移动功能, 不能闪回表
     
    SQL> alter table emp2 enable row movement;
    Table altered
     
    SQL> flashback table emp2 to scn 482117;
    Done

    SQL> select sal from emp2 where ename='SCOTT';
     
          SAL
    ---------
         2.00


     
    SQL> select sal from emp2 where ename='SCOTT';
     
          SAL
    ---------
         2.00
     
    SQL> flashback table emp2 to scn 482089;
     
    Done
     
    SQL> select sal from emp2 where ename='SCOTT';
     
          SAL
    ---------
         1.00
        
        
    SQL> flashback table emp2 to scn 482128;
     
    Done    
        
     
    SQL> select sal from emp2 where ename='SCOTT';
     
          SAL
    ---------
         3.00
     
    也可以根据时间闪回
    -- 闪回到5分钟之前
     
    SQL> flashback table emp2 to timestamp systimestamp - interval '5' minute;
    SQL> flashback table emp2 to timestamp to_timestamp('20111105 21:35:00','yyyymmdd hh24:mi:ss');
     
    2.Ddl 无法闪回
    SQL> select dbms_flashback.get_system_change_number from dual;
     
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                      482797
     
    SQL> truncate table emp2;
    Table truncated
     
    SQL> flashback table emp2 to scn 482797;
     
    ORA-01466: unable to read data - table definition has changed
    ORA-01466: 无法读取数据 - 表定义已更改
     
    3.2 说明
    1.DDL操作无法闪回
    2.必须enable row movement;
    3.索引同时闪回
    4.如果表上有触发器,触发器实效。可以使用enable triggers关键字使flashback同时启动trigger;
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    4 Four - Flashback version

    通过flashback version 可以查到表上发生了哪些dml操作
     
    SQL> create table test(name date);
    Table created
     
    SQL> truncate table test;
    Table truncated
     
    SQL> insert into test values(sysdate);
    1 row inserted
     
    SQL> /
    1 row inserted
     
    SQL> /
    1 row inserted
     
    SQL> commit;
    Commit complete

    SQL> insert into test values(sysdate);
    1 row inserted
     
    SQL> /
    1 row inserted
     
    SQL> /
    1 row inserted
     
    SQL> commit;
    Commit complete
     
    SQL> insert into test values(sysdate);
    1 row inserted
     
    SQL> /
    1 row inserted
     
    SQL> /
    1 row inserted
     
    SQL> commit;
    Commit complete
     
     
    SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
    Session altered
     
    伪列(pseudo_columns)包括以下:
     
    VERSIONS_STARTSCN:创建行时具有的SCN
    VERSIONS_STARTTIME:创建行时此版本的时间标记
    VERSIONS_ENDSCN:此行的最后一次操作的SCN
    VERSIONS_ENDTIME:此行的最后一次操作的时间
    VERSIONS_XID:创建此版本的事务ID
    VERSIONS_OPERATION:此事务完成的操作:I:INSERT、U:UPDATE、D:DELETE
     
    SQL> select versions_starttime,versions_startscn,versions_xid,versions_operation from test versions between timestamp minvalue and maxvalue order by 1;
     
    VERSIONS_STARTTIME                                VERSIONS_STARTSCN VERSIONS_XID     VERSIONS_OPERATION
    ------------------------------------------------- ----------------- ---------------- ------------------
    05-11? -11 09.59.59 ??                                    483569 01001C00C4000000 I
    05-11? -11 09.59.59 ??                                    483569 01001C00C4000000 I
    05-11? -11 09.59.59 ??                                    483569 01001C00C4000000 I
    05-11? -11 10.01.04 ??                                    483711 03001C0002010000 I
    05-11? -11 10.01.04 ??                                    483711 03001C0002010000 I
    05-11? -11 10.01.04 ??                                    483711 03001C0002010000 I
    05-11? -11 10.01.37 ??                                    483723 04002B00C8000000 I
    05-11? -11 10.01.37 ??                                    483723 04002B00C8000000 I
    05-11? -11 10.01.37 ??                                    483723 04002B00C8000000 I
    9 rows selected

     
    SQL> truncate table test;
    Table truncated
     
    SQL> select versions_starttime,versions_startscn,versions_xid,versions_operation from test versions between timestamp minvalue and maxvalue order by 1;
    VERSIONS_STARTTIME                                VERSIONS_STARTSCN VERSIONS_XID     VERSIONS_OPERATION
    ------------------------------------------------- ----------------- ---------------- ------------------
     
    说明:
    1.只能分析dml操作
    2.如果发生了ddl操作,之前dml操作,无法查询
    3.查询也可以指定scn 或者timestamp
       versions between scn xxx and xxx;
       versions between timestamp to_date(xxxxxxx) and to_date(xxxxxxx);

      
      
      
      
      

    Five - Flashback transaction query
    通过flashback version 可以找到事务id,而flashback transaction则可以找到事物的undo sql 通过undosql可以会滚已经提交的事物;
     
    SQL> delete from emp where ename = 'SCOTT';
    1 row deleted
     
    SQL> commit;
    Commit complete
     
    SQL> delete from emp where deptno=10;
    3 rows deleted
     
    SQL> commit;
    Commit complete
     
    SQL> select to_char(versions_starttime,'yyyy-mm-dd hh24:mi:ss') versions_starttime,versions_startscn,versions_xid,versions_operation from emp versions between timestamp minvalue and maxvalue order by 1;
     
    VERSIONS_STARTTIME  VERSIONS_STARTSCN VERSIONS_XID     VERSIONS_OPERATION
    ------------------- ----------------- ---------------- ------------------
    2011-11-05 22:11:30            484033 0900030023010000 D
    2011-11-05 22:12:18            484056 0A001C00C7000000 D
    2011-11-05 22:12:18            484056 0A001C00C7000000 D
    2011-11-05 22:12:18            484056 0A001C00C7000000 D
     
    SQL> desc flashback_transaction_query;

    Name             Type           Nullable Default Comments                                 
    ---------------- -------------- -------- ------- -----------------------------------------
    XID              RAW(8)         Y                Transaction identifier                   
    START_SCN        NUMBER         Y                Transaction start SCN                    
    START_TIMESTAMP  DATE           Y                Transaction start timestamp              
    COMMIT_SCN       NUMBER         Y                Transaction commit SCN                   
    COMMIT_TIMESTAMP DATE           Y                Transaction commit timestamp             
    LOGON_USER       VARCHAR2(30)   Y                Logon user for transaction               
    UNDO_CHANGE#     NUMBER         Y                1-based undo change number               
    OPERATION        VARCHAR2(32)   Y                forward operation for this undo          
    TABLE_NAME       VARCHAR2(256)  Y                table name to which this undo applies    
    TABLE_OWNER      VARCHAR2(32)   Y                owner of table to which this undo applies
    ROW_ID           VARCHAR2(19)   Y                rowid to which this undo applies         
    UNDO_SQL         VARCHAR2(4000) Y                SQL corresponding to this undo    
     
    SQL> select undo_sql from flashback_transaction_query where xid=hextoraw('0900030023010000');
    ORA-01031: insufficient privileges
    ORA-01031: 权限不足
     
    SQL> conn sys/czjie@orcl as sysdba
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
    Connected as sys
    SQL> grant select any transaction to scott;
    Grant succeeded
     
    SQL> conn scott/tiger@orcl
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
    Connected as scott

     
    SQL> select undo_sql from flashback_transaction_query where xid=hextoraw('0900030023010000');
     
    UNDO_SQL
    --------------------------------------------------------------------------------
    insert into "SCOTT"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7788','SCOTT','ANALYST','7566',TO_DATE('19-4?  -87', 'DD-MON-RR'),'5000',NULL,'20');
     
    SQL> select undo_sql from flashback_transaction_query where xid=hextoraw('0A001C00C7000000');
     
    UNDO_SQL
    --------------------------------------------------------------------------------
    insert into "SCOTT"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7934','MILLER','CLERK','7782',TO_DATE('23-1?  -82', 'DD-MON-RR'),'1300',NULL,'10');
    insert into "SCOTT"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7839','KING','PRESIDENT',NULL,TO_DATE('17-11? -81', 'DD-MON-RR'),'5000',NULL,'10');
    insert into "SCOTT"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7782','CLARK','MANAGER','7839',TO_DATE('09-6?  -81', 'DD-MON-RR'),'2450',NULL,'10');

     
     
    SQL> insert into "SCOTT"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7788','SCOTT','ANALYST','7566',TO_DATE('19-4?  -87', 'DD-MON-RR'),'5000',NULL,'20');
    /
    1 row inserted

    SQL> select * from emp where ename='SCOTT';
    EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
    7788 SCOTT      ANALYST    7566 1987/4/19     5000.00               20
     
    SQL> insert into "SCOTT"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7934','MILLER','CLERK','7782',TO_DATE('23-1?  -82', 'DD-MON-RR'),'1300',NULL,'10');
     
    1 row inserted
    SQL> insert into "SCOTT"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7839','KING','PRESIDENT',NULL,TO_DATE('17-11? -81', 'DD-MON-RR'),'5000',NULL,'10');
     
    1 row inserted
    SQL> insert into "SCOTT"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7782','CLARK','MANAGER','7839',TO_DATE('09-6?  -81', 'DD-MON-RR'),'2450',NULL,'10');
     
    1 row inserted

    SQL> commit;
    Commit complete

    SQL> select * from emp where deptno = 10;
     
    EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
    7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
    7839 KING       PRESIDENT       1981/11/17    5000.00               10
    7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
     
    至此,已经提交的事物成功会滚;

    6 Six - Flashback Database
    flashback database 在sqlplus or rman中都可以使用,命令略有不同
     
    RMAN
    RMAN> FLASHBACK DATABASE TO TIME = 
       2> "TO_DATE('2004-05-27 16:00:00','YYYY-MM-DD HH24:MI:SS')";
    RMAN> FLASHBACK DATABASE TO SCN=23565;
    RMAN> FLASHBACK DATABASE TO SEQUENCE=223 THREAD=1;
     
    SQLPLUS
    SQL> FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-1/24); 
    SQL> FLASHBACK DATABASE TO SCN 53943;
    SQL> FLASHBACK DATABASE TO RESTORE POINT b4_load; 
     
    6.1 打开flashback

    SQL> select name,flashback_on,log_mode from v$database;

    NAME      FLASHBACK_ON       LOG_MODE
    --------- ------------------ ------------
    ORCL      NO                 NOARCHIVELOG
    flashback_on:是否开启闪回(否);
    log_mode:日志模式,是否归档(非归档模式);

    6.1.1 操作步骤:
    1)先关闭数据库:shutdown immediate
    2)启动到mount状态:startup mount
    3)开启归档功能:alter database archivelog;
    4)打开flashback:alter database flashback on;
    5)打开数据库:alter database open;

    SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.

    SQL> startup mount;
    ORACLE instance started.

    Total System Global Area  218103808 bytes
    Fixed Size                  1218604 bytes
    Variable Size              96470996 bytes
    Database Buffers          117440512 bytes
    Redo Buffers                2973696 bytes
    Database mounted.

    SQL> alert system set db_recovery_file_dest_size=10g;
    #mkdir /opt/ora10g/product/10.2.0/recover
    SQL> alter system set db_recovery_file_dest='/opt/ora10g/product/10.2.0/recover';
    System altered.

    SQL> alter database archivelog;
    Database altered.

    SQL> alter database flashback on;
    Database altered.

    SQL> select name,flashback_on,log_mode from v$database;

    NAME      FLASHBACK_ON       LOG_MODE
    --------- ------------------ ------------
    ORCL      YES                ARCHIVELOG

    SQL> alter database open;
    Database altered.

    拓展:
    开启闪回flashback功能(归档下才可开启数据库闪回)
    查看flashback是否开启:select name,flashback_on from v$database;
    查看闪回恢复区及大小是否设置:show parameter db_recovery;
    先设置闪回恢复区的大小:alter system set db_recovery_file_dest_size='2G';(这里系统默认也是2G,也未改)
    再设置闪回恢复区路径:alter system set db_recovery_file_dest='/u01/oracle/db_recovery_file_dest';(这步我并未使用)
    设置数据库回退的时间,默认1440分钟为一天时间:alter system set db_flashback_retention_target = 1440;
     
    如果不是在归档模式下试图打开flashback,则会出现下面情况:
    SQL> alter database flashback on;
    alter database flashback on
    *
    ERROR at line 1:
    ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
    ORA-38707: Media recovery is not enabled.

    ORA-38707:
    Media recovery is not enabled.
    Cause:     An ALTER DATABASE FLASHBACK ON command failed because media recovery was not enabled.
    Action:     Turn on media recovery with an ALTER DATABASE ARCHIVELOG command and then retry the command.

    6.2 比较重要的数据字典
     
    SQL> select * from v$flash_recovery_area_usage;
    FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
    ------------ ------------------ ------------------------- ---------------
    CONTROLFILE                   0                         0               0
    ONLINELOG                     0                         0               0
    ARCHIVELOG                    0                         0               0
    BACKUPPIECE                   0                         0               0
    IMAGECOPY                     0                         0               0
    FLASHBACKLOG                .38                         0               1

    6 rows selected.

     
    SQL> select OLDEST_FLASHBACK_SCN,OLDEST_FLASHBACK_TIME,RETENTION_TARGET from v$flashback_database_log;
    OLDEST_FLASHBACK_SCN OLDEST_FL RETENTION_TARGET
    -------------------- --------- ----------------
                  485108 05-NOV-11             1440

                 
    SQL> select current_scn from v$database;
    CURRENT_SCN
    -----------
         485904

     
    6.3 测试删除用户的flashback

    SQL> drop user scott cascade;
    drop user scott cascade
    *
    ERROR at line 1:
    ORA-01940: cannot drop a user that is currently connected


    SQL> drop user scott cascade;

    User dropped.

    SQL> startup mount force; -- 相当于一次断电的数据库重启
    ORACLE instance started.

    Total System Global Area  218103808 bytes
    Fixed Size                  1218604 bytes
    Variable Size             100665300 bytes
    Database Buffers          113246208 bytes
    Redo Buffers                2973696 bytes
    Database mounted.
    SQL> flashback database to scn 485904;

    Flashback complete.

    SQL> alter database open resetlogs;

    Database altered.

    SQL> conn scott/tiger
    Connected.

     
    -- flashback database to timestamy(to_date('xxxxxxxxxx','xxxxxxxxxxx'));
    -- flashback database to timestamp(sysdate-1/24);
     
    6.4 Incarnation 问题
    同不完全恢复一样,Flashback database也有incarnation的问题需要注意:如果OLDEST_FLASHBACK_SCN小于v$database.resetlog_scn。那么就可以闪会到上一个incarnation,可以指定incarnation,或者使用下面命令到上一个incarnation。
    FLASHBACK DATABASE TO BEFORE RESETLOGS;

    6.4.1 准备工作
     
    SQL> select OLDEST_FLASHBACK_SCN,OLDEST_FLASHBACK_TIME,RETENTION_TARGET from v$flashback_database_log;
    OLDEST_FLASHBACK_SCN OLDEST_FL RETENTION_TARGET
    -------------------- --------- ----------------
                  485108 05-NOV-11             1440

     
    SQL> select incarnation# from v$database_incarnation where status='CURRENT';
    INCARNATION#
    ------------
               3

     
    SQL> begin
    for i in 1 .. 10000 loop
       insert into scott.t values(dbms_flashback.get_system_change_number);
       commit;
       end loop;
      end;
    /
    PL/SQL
    过程已成功完成。
     
     
    SQL> select min(tscn),max(tscn) from scott.t;
    MIN(TSCN)  MAX(TSCN)
    ---------- ----------
       1130562    1149237
     
    6.4.2 恢复到某一点,并reseglogs打开数据库

    SQL> startup mount force;
    SQL> flashback database to scn 1140000;
    SQL> alter database open resetlogs;
     
    SQL> select min(tscn),max(tscn) from scott.t;
    MIN(TSCN)  MAX(TSCN)
    ---------- ----------
       1130562    1139997
     
    6.4.3尝试恢复到上次resetlogs点之前
     
    SQL> startup mount force;
    SQL> flashback database to scn 1135000;
    SQL> alter database open resetlogs; 
    SQL> select min(tscn),max(tscn) from scott.t;
    MIN(TSCN)  MAX(TSCN)
    ---------- ----------
       1130562    1134999
    -- 恢复成功
     
     
    SQL> select dbms_flashback.get_system_change_number from dual;
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                     1166421
     
     
    6.4.4 我们想恢复t表里面所有数据,所以决定恢复到scn 1149239
    SQL> startup mount force
    SQL> flashback database to scn 1149239;
    SQL> alter database open resetlogs;
     
    SQL>  select min(tscn),max(tscn) from scott.t;
    MIN(TSCN)  MAX(TSCN)
    ---------- ----------
       1130562    1134999
    -- 数据没有恢复
     
    6.4.5 reset database 成功恢复数据
     
    SQL> startup mount force; 
    RMAN>reset database to incarnation 19; 
    SQL> flashback database to scn 1149239;
    SQL> alter database open resetlogs;
    SQL> select min(tscn),max(tscn) from scott.t;
    MIN(TSCN)  MAX(TSCN)
    ---------- ----------
       1130562    1149237
    -- 数据成功恢复
     
     
    6.5 闪回与归档
     
    /*
    注意,闪回不仅需要闪回日志,并且需要归档日志的存在。如下案例
     
    1.--查找能够闪回的最早的scn
    SQL> select OLDEST_FLASHBACK_SCN,OLDEST_FLASHBACK_TIME,RETENTION_TARGET from v$flashback_database_log;

    OLDEST_FLASHBACK_SCN OLDEST_FL RETENTION_TARGET
    -------------------- --------- ----------------
                  485108 05-NOV-11             1440

     
    2.--切换并且归档日志
     
    alter system archive log current;

    3.-- 删除所有归档日志
     
    4.--再次查询,没有变化
     
    SQL> select OLDEST_FLASHBACK_SCN,OLDEST_FLASHBACK_TIME,RETENTION_TARGET
      2         from v$flashback_database_log;
     
    OLDEST_FLASHBACK_SCN OLDEST_FLASHBA RETENTION_TARGET
    -------------------- -------------- ----------------
               301202568 01-7月 -09                 1440
     
    5.--尝试闪回
    startup mount force;
    flashback database to scn 301202568 ;
    flashback database to scn 301202568

    第 1 行出现错误:
    ORA-38754: FLASHBACK DATABASE 没有启动; 所需的重做日志不可用
     
    ORA-38761: 无法访问重做日志序列 84 (在线程 1, 原型 2 中)

     
    6.6 Flashback database read only 
    使用flashdatabase 如果以resetlogs模式打开数据库,会造成部分数据丢失。
     
    10g支持flashback database后,以readonly模式打开数据库,而不必resetlogs 对于删除表的错误操作,可以使用下面步骤
     
    startup mount force
    flashback database to scn 1149239;
    alter database open readonly;
    exp
    startup mount force;
    recover database;
    alter database open;
    imp
     
    7 Seven - flashback archive
    -- 11g提供了不再依赖undo的flashback archive
    -- 必须建立flashback archive,将闪回信息存放到永久表空间
     
    7.1 准备
     
    首先创建三个测试测试闪回归档的表空间
     
    create tablespace tbs_flash datafile 'E:\oracle\oradata\orcl\flash.dbf' size 200m;
    create tablespace tbs_flash2 datafile 'E:\oracle\oradata\orcl\flash2.dbf' size 200m;
    create tablespace tbs_flash3 datafile 'E:\oracle\oradata\orcl\flash3.dbf' size 200m;

    7.2 创建并管理
    flashback archive
    -- 必须有一个默认的archive
    -- 每个archive 可以对应多个表空间,每个archive 有一个主表空间
    -- 不同的archive可以设定不同的保留策略

    create flashback archive default flash1 tablespace tbs_flash [quota xxx] retention 1 year;
    create flashback archive flash2 tablespace tbs_flash2 [quota xxx] retention 2 day;
     
    -- 将表空间增加到
    flashback archive
    alter flashback archive flash2 add tablespace tbs_flash3 [quota xxx];                                                       
    --
    将表空间移出
    flashback archive                                                             
    alter flashback archive flash2 remove tablespace tbs_flash2;
    ORA-55626:
    无法删除闪回归档的主表空间
     
    alter flashback archive flash2 remove tablespace tbs_flash3;
    -- 管理quota
    alter flashback archive flash1 modify tablespace tbs_flash quota 200m;
    -- 管理闪回时间
     
    alter flashback archive flash1 modify retention 1 month;
    -- 删除
    flashback archive
    drop flashback archive flash1;
    7.3 创建表并使用
    flashback archive
    create table emp2 as select * from emp;
    alter table emp2 flashback archive;
    -- 需要 flashback archive administer 的权限
     
    -- 建立在默认
    flashback archive
    create table emp3 as select * from emp;
    alter table emp3 flashback archive flash2;
    -- 指定flashback archive

    7.4 闪回归档的管理
    --所有dml操作,都会写flashback archivelog 
    --如果flashback archive用尽,dml操作会收到错误 ORA-55617 
    --删除某个archive 一天之前的log alter flashback archive flash1 purge before timestamp(systimestamp - interval '1' day);
    --删除某scn之前的log
    alter flashback archive flash1 purge before scn 900000;
     
    --使用了flashback archive 则对该表的所有ddl操作都不允许
     
    truncate table emp2;
    收到错误
    ORA-55610
    --取消表的flashback archive
    alter table emp2 no flashback archive; 
     
    7.5 常用数据字典
     
    dba/all/user_flashback_archive
    dba/all/user_flashback_archive_ts
    dba/all/user_flashback_archive_tables
     
    desc dba_flashback_archive;
     
    名称                                    是否为空? 类型
    ----------------------------------------- -------- ----------------------------
    FLASHBACK_ARCHIVE_NAME                    NOT NULL VARCHAR2(255)
    FLASHBACK_ARCHIVE#                        NOT NULL NUMBER
    RETENTION_IN_DAYS                         NOT NULL NUMBER
    CREATE_TIME                                        TIMESTAMP(9)
    LAST_PURGE_TIME                                    TIMESTAMP(9)
    STATUS                                             VARCHAR2(7)
     
    desc dba_flashback_archive_ts;
     
    名称                                     是否为空? 类型
    ----------------------------------------- -------- ----------------------------
    FLASHBACK_ARCHIVE_NAME                    NOT NULL VARCHAR2(255)
    FLASHBACK_ARCHIVE#                        NOT NULL NUMBER
    TABLESPACE_NAME                           NOT NULL VARCHAR2(30)
    QUOTA_IN_MB                                        VARCHAR2(40)
     
    desc dba_flashback_archive_tables;
     
    名称                                      是否为空? 类型
     
    ----------------------------------------- -------- ----------------------------
    TABLE_NAME                                NOT NULL VARCHAR2(30)
    OWNER_NAME                                NOT NULL VARCHAR2(30)
    FLASHBACK_ARCHIVE_NAME                    NOT NULL VARCHAR2(255)
    ARCHIVE_TABLE_NAME                                 VARCHAR2(53)


    作者:czjie
    出处:http://www.cnblogs.com/czjie/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    AWS CLI command example
    NetTime
    git fetch和git pull的区别
    Coding tools
    Username Generator
    使用消息系统来解决分布式事务
    【转】关于分布式事务、两阶段提交协议、三阶提交协议
    NoSql的三大基石:CAP理论&BASE&最终一致性
    【转】Raft 为什么是更易理解的分布式一致性算法
    【转】分布式一致性算法:Raft 算法(Raft 论文翻译)
  • 原文地址:https://www.cnblogs.com/czjie/p/2238460.html
Copyright © 2020-2023  润新知