• Oracle Flashback技术


    Oracle Flashback技术概览

    Oracle Flashback技术是一组数据库特性,它可以让你查看数据库对象的过去状态,或者将数据库对象返回到以前的状态,而无需使用基于时间点的介质恢复。根据数据库的变化,闪回特性可以更快的回退不想要的变化,而且相比介质恢复,对数据库可用性产生的影响更小。

    利用闪回特性,你能够:
    • 执行回到过去的数据查询
    • 执行显示对数据库更改的详细历史的元数据的查询
    • 将表或行恢复到之前的时间点
    • 自动追踪和归档事务数据的更改
    • 当数据库保持在线状态时,回退事务和与它相关的事务
    Oracle闪回特性利用自动撤销管理(Automatic Undo Management)系统来获得事务的元数据和历史数据。它依赖于撤销数据(UNDO Data),这些数据记录单个事务影响。例如,如果你运行一个Update语句来将工资从1000更改为1100,那么Oracle数据库将在撤销数据(Undo Data)中存储旧值1000。

    撤销数据(Undo Data)是持久的,并能在数据库关闭时继续存在。通过使用闪回特性,可以使用撤销数据查询过去的数据,或者从逻辑损坏中进行恢复操作。除了在闪回特性使用它外,Oracle数据库还可以使用撤销数据执行这些操作:回滚活动的事务;使用数据库或进程恢复已经终止的事务;SQL查询中提供读一致性。

    配置数据库使用Oracle闪回技术

    配置数据库使用自动撤销管理(Automatic Undo Management)
    具体设置参照:管理Undo
    SQL> show parameter undo;
    
    NAME				     TYPE	 VALUE
    ------------------------------------ ----------- ------------------------------
    undo_management 		     string	 AUTO
    undo_retention			     integer	 900
    undo_tablespace 		     string	 UNDOTBS1
    SQL> 
    配置数据库使用Oracle闪回事务查询(Oracle Flashback Transaction Query)
    1、确保Oracle数据库使用版本10.0兼容运行
    SQL> show parameter compatible
    
    NAME				     TYPE	 VALUE
    ------------------------------------ ----------- ------------------------------
    compatible			     string	 11.2.0.4.0
    2、启用补充日志记录
    SQL> alter database add supplemental log data;
    
    Database altered.
    配置数据库使用闪回事务(Flashback Transaction)
    1、启用数据库归档
    SQL> startup mount
    ORACLE instance started.
    
    Total System Global Area  622149632 bytes
    Fixed Size		    2255792 bytes
    Variable Size		  234882128 bytes
    Database Buffers	  381681664 bytes
    Redo Buffers		    3330048 bytes
    Database mounted.
    SQL> alter database archivelog;
    
    Database altered.
    
    SQL> archive log list;
    Database log mode	       Archive Mode
    Automatic archival	       Enabled
    Archive destination	       USE_DB_RECOVERY_FILE_DEST
    Oldest online log sequence     25
    Next log sequence to archive   28
    Current log sequence	       28
    SQL> alter database open;
    
    Database altered.
    2、打开至少一个归档日志
    SQL> alter system archive log current;
    
    System altered.
    在特定的LOB列上启用Oracle闪回操作
    在特定的LOB列上启用Oracle闪回操作,需要使用Alter Table语句的RETENTION选项,因为LOB列的Undo Data可能非常大,所以你必须定义哪些LOB列可以使用Flashback操作。这个在此不做过多讨论。

    授权
    要使用闪回特性,必须授予一定的权限给用户、角色或者应用程序。
    1、对于闪回查询(Oracle Flashback Query)和闪回版本查询(Oracle Flashback Version Query)
    访问特定的对象,需要授予Flashback和Select权限;访问所有的表,需要授予Flashback Any Table权限;
    2、对于闪回事务查询(Oracle Flashback Transaction Query)
    需要授予Select Any Transaction权限,允许执行Oracle闪回事务查询检索出来的撤销SQL代码(Undo SQL Code),需要授予Select、Update、Delete和Insert权限;
    3、对于DBMS_FLASHBACK包
    访问DBMS_FLASHBACK包里的特性,需要授予对该包的Execute权限;
    4、对于闪回数据归档(Flashback Data Archive / Oracle Total Recall)
    为了允许特定的用户在表上启用闪回数据归档,使用特定的闪回数据归档,需要授予Flashback Archive对象权限。授权时,必须以SYSDBA或者Flashback Archive Administer系统权限登录。

    闪回技术演示

    演示环境为:
    SQL> column product for a50
    SQL> column version for a15
    SQL> column status for a20
    SQL> select * from product_component_version
      2  where product like 'Oracle%';--->查看数据库版本信息
    
    PRODUCT 					   VERSION	   STATUS
    -------------------------------------------------- --------------- --------------------
    Oracle Database 11g Enterprise Edition		   11.2.0.4.0	   64bit Production
    SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
    1、闪回查询(SELECT AS OF)
    SQL> select *from scott.emp
      2  as of timestamp to_date('2017-08-27 16:14:36','yyyy-mm-dd hh24:mi:ss')
      3  where empno=7369;
    
         EMPNO ENAME      JOB	       MGR HIREDATE		      SAL	COMM	 DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK	      7902 1980-12-17 00:00:00	      800		     20
    2、闪回版本查询(Oracle Flashback Version Query)
    使用Oracle闪回版本查询可以检索一个给定的时间间隔内特定行的不同版本,当执行Commit时,就会创建一个row版本。
    使用SELECT的Versions Between语句指定闪回版本查询,语法为:
    Versions {Between {SCN | Timestamp} start And end }
    SQL> column versions_starttime for a30
    SQL> column versions_endtime for a30
    SQL> select versions_startscn,
      2  versions_starttime,
      3  versions_endscn,
      4  versions_endtime,
      5  versions_xid,
      6  versions_operation,
      7  ename,
      8  sal
      9  from scott.emp
     10  versions between timestamp
     11  to_date('2017-08-27 16:14:36','yyyy-mm-dd hh24:mi:ss')
     12  and to_date('2017-08-27 16:40:10','yyyy-mm-dd hh24:mi:ss')
     13  where empno=7369;
    
    VERSIONS_STARTSCN VERSIONS_STARTTIME		 VERSIONS_ENDSCN VERSIONS_ENDTIME		VERSIONS_XID	 V ENAME	     SAL
    ----------------- ------------------------------ --------------- ------------------------------ ---------------- - ---------- ----------
    	  1284173 27-AUG-17 04.39.16 PM 							02000E0063040000 U SMITH	 2388.79
    	  1284166 27-AUG-17 04.38.58 PM 		 1284173 27-AUG-17 04.39.16 PM		0A0008008D030000 U SMITH	 1990.66
    	  1284161 27-AUG-17 04.38.55 PM 		 1284166 27-AUG-17 04.38.58 PM		04001F0098030000 U SMITH	 1658.88
    	  1284143 27-AUG-17 04.38.37 PM 		 1284161 27-AUG-17 04.38.55 PM		0200210062040000 U SMITH	  1382.4
    	  1281680 27-AUG-17 04.15.16 PM 		 1284143 27-AUG-17 04.38.37 PM		01001F0080030000 U SMITH	    1152
    							 1281680 27-AUG-17 04.15.16 PM				   SMITH	     800
    
    6 rows selected.
    3、闪回事务查询(Oracle Flashback Transaction Query)
    使用Oracle事务查询可以检索给定的时间间隔内所有的事务或者给定的事务的元数据或历史数据,查询需要使用静态数据字典视图Flashback_transaction_Query。
    利用上面产生的Versions_XID来进行事务查询:
    SQL> SELECT xid, start_scn, operation, table_name, undo_sql
      FROM flashback_transaction_query
     where xid in ('02000E0063040000',
                   '0A0008008D030000',
                   '04001F0098030000',
                   '0200210062040000',
                   '01001F0080030000'); 
    
    XID		  START_SCN OPERATION			     TABLE_NAME 													            UNDO_SQL
    ---------------- ---------- -------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
    01001F0080030000    1281544 UPDATE			     EMP														            update "SCOTT"."EMP" set "SAL" = '960' where ROWID = 'AAAVREAAEAAAACXAAA';
    01001F0080030000    1281544 UPDATE			     EMP														            update "SCOTT"."EMP" set "SAL" = '800' where ROWID = 'AAAVREAAEAAAACXAAA';
    01001F0080030000    1281544 BEGIN
    02000E0063040000    1284171 UPDATE			     EMP														            update "SCOTT"."EMP" set "SAL" = '1990.66' where ROWID = 'AAAVREAAEAAAACXAAA';
    02000E0063040000    1284171 BEGIN
    0200210062040000    1283966 UPDATE			     EMP														            update "SCOTT"."EMP" set "SAL" = '1152' where ROWID = 'AAAVREAAEAAAACXAAA';
    0200210062040000    1283966 BEGIN
    04001F0098030000    1284160 UPDATE			     EMP														            update "SCOTT"."EMP" set "SAL" = '1382.4' where ROWID = 'AAAVREAAEAAAACXAAA';
    04001F0098030000    1284160 BEGIN
    0A0008008D030000    1284165 UPDATE			     EMP														            update "SCOTT"."EMP" set "SAL" = '1658.88' where ROWID = 'AAAVREAAEAAAACXAAA';
    0A0008008D030000    1284165 BEGIN
    
    11 rows selected.
    注:可以使用UNDO_SQL进行回退。
    4、使用DBMS_FLASHBACK包
    DBMS_FLASHBACK包提供了和闪回查询一样的功能,但是个人觉得闪回查询使用起来更方便。
    SQL> update scott.emp set sal=sal*1.2 where empno=7369;--->更新后sal为2866.55
    
    1 row updated.
    
    SQL> commit;
    
    Commit complete.
    
    SQL>  select sysdate from dual;
    
    SYSDATE
    -------------------
    2017-08-27 17:48:15
    SQL> call dbms_flashback.enable_at_time(to_date('2017-08-27 17:48:15','yyyy-mm-dd hh24:mi:ss'));
    
    Call completed.
    
    SQL> select *from scott.emp;
    
         EMPNO ENAME      JOB	       MGR HIREDATE		      SAL	COMM	 DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK	      7902 1980-12-17 00:00:00	  2866.55		     20
          7499 ALLEN      SALESMAN	      7698 1981-02-20 00:00:00	     1600	 300	     30
          7521 WARD       SALESMAN	      7698 1981-02-22 00:00:00	     1250	 500	     30
          7566 JONES      MANAGER	      7839 1981-04-02 00:00:00	     2975		     20
          7654 MARTIN     SALESMAN	      7698 1981-09-28 00:00:00	     1250	1400	     30
          7698 BLAKE      MANAGER	      7839 1981-05-01 00:00:00	     2850		     30
          7782 CLARK      MANAGER	      7839 1981-06-09 00:00:00	     2450		     10
          7788 SCOTT      ANALYST	      7566 1987-04-19 00:00:00	     3000		     20
          7839 KING       PRESIDENT 	   1981-11-17 00:00:00	     5000		     10
          7844 TURNER     SALESMAN	      7698 1981-09-08 00:00:00	     1500	   0	     30
          7876 ADAMS      CLERK	      7788 1987-05-23 00:00:00	     1100		     20
    
         EMPNO ENAME      JOB	       MGR HIREDATE		      SAL	COMM	 DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7900 JAMES      CLERK	      7698 1981-12-03 00:00:00	      950		     30
          7902 FORD       ANALYST	      7566 1981-12-03 00:00:00	     3000		     20
          7934 MILLER     CLERK	      7782 1982-01-23 00:00:00	     1300		     10
    
    14 rows selected.
    
    SQL> call dbms_flashback.disable();----->调用后必须调用disable退出闪回查询
    
    Call completed.
    
    SQL> select *from scott.emp;
    
         EMPNO ENAME      JOB	       MGR HIREDATE		      SAL	COMM	 DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK	      7902 1980-12-17 00:00:00	  3439.86		     20
          7499 ALLEN      SALESMAN	      7698 1981-02-20 00:00:00	     1600	 300	     30
          7521 WARD       SALESMAN	      7698 1981-02-22 00:00:00	     1250	 500	     30
          7566 JONES      MANAGER	      7839 1981-04-02 00:00:00	     2975		     20
          7654 MARTIN     SALESMAN	      7698 1981-09-28 00:00:00	     1250	1400	     30
          7698 BLAKE      MANAGER	      7839 1981-05-01 00:00:00	     2850		     30
          7782 CLARK      MANAGER	      7839 1981-06-09 00:00:00	     2450		     10
          7788 SCOTT      ANALYST	      7566 1987-04-19 00:00:00	     3000		     20
          7839 KING       PRESIDENT 	   1981-11-17 00:00:00	     5000		     10
          7844 TURNER     SALESMAN	      7698 1981-09-08 00:00:00	     1500	   0	     30
          7876 ADAMS      CLERK	      7788 1987-05-23 00:00:00	     1100		     20
    
         EMPNO ENAME      JOB	       MGR HIREDATE		      SAL	COMM	 DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7900 JAMES      CLERK	      7698 1981-12-03 00:00:00	      950		     30
          7902 FORD       ANALYST	      7566 1981-12-03 00:00:00	     3000		     20
          7934 MILLER     CLERK	      7782 1982-01-23 00:00:00	     1300		     10
    
    14 rows selected.
    5、闪回事务(Flashback Transaction)
    数据库处于Online状态时,使用DBMS_FLASHBACK.Transaction_backout可以回滚事务或者其他相关的事务。恢复操作使用撤销数据创建和运行补偿事务,使受影响的数据回到原始状态。
    对应的数据字典视图:
    dba_flashback_txn_state
    dba_flashback_txn_report
    6、闪回数据归档(Flashback Data Archive)
    对于一张表来说,在它的生命周期中,闪回数据归档提供了追踪和存储事务变化的能力。闪回数据归档对于遵守记录阶段策略和审计报告非常有用。
    闪回数据归档由一个或多个表空间及其部分组成。你可以有多个闪回数据归档。如果你以SYSDBA身份登录系统,你能为系统指定默认的闪回数据归档。使用保留时间(Retention Time)来配置闪回数据归档,在闪回数据归档的已归档数据在保留时间内保留。
    默认情况下,对任何表闪回归档是禁用的,如果满足下面的条件,你可以激活闪回数据归档:
    • 对于使用闪回数据归档的表,你有Flashback Archive对象权限;
    • 表不是嵌套表,Cluster表、临时表、远端表和外部表;
    • 表不包含Long和嵌套列;
    • 表列没有使用任何的闪回数据归档关键字,STARTSCN、ENDSCN、RID、XID、OP和Operation。

    当一张表的闪回数据归档启用后,你只能使用Flashback Archive Administrater系统权限或者以SYSDBA身份登录到系统禁用它。当为一张表选择闪回数据归档时,应当考虑该表的数据保留时间和闪回数据归档的保留时间。

    创建闪回数据归档语法:

    flashback_archive_quota::=

    flashback_archive_retention::=

    创建闪回数据归档
    SQL> create tablespace flasharchive 
      2  datafile '/u01/app/oracle/oradata/orcl/flasharchive01.dbf'
      3  size 100M;
    
    Tablespace created.
    
    SQL> create flashback archive 
      2  default fla1
      3  tablespace flasharchive
      4  quota 5G
      5  retention 1 year;
    
    Flashback archive created.
    激活和禁用闪回数据归档
    SQL> create table scott.t_flasharchive(
      2  id number,
      3  name varchar2(30),
      4  job varchar2(20),
      5  cdate date
      6  )flashback archive fla1;
    
    Table created.
    
    SQL> alter table scott.t_flasharchive no flashback archive;
    
    Table altered.
    
    SQL>  alter table scott.t_flasharchive flashback archive fla1;
    
    Table altered.
    
    SQL> 
    闪回数据归档数据字典视图
    SQL> select owner_name,
    flashback_archive_name as name,
    flashback_archive# as no#,
    retention_in_days as days,
    status
    from dba_flashback_archive;----->显示关于闪回数据归档文件的信息
    OWNER_NAME NAME 		   NO#	   DAYS STATUS
    ---------- -------------------- ------ -------- --------------------
    SYS	   FLA1 		  1.00	 365.00 DEFAULT
    SQL> SELECT * FROM dba_flashback_archive_ts;----->显示闪回数据归档文件的表空间信息
    
    FLASHBACK_ARCHIVE_NAME	  FLASHBACK_ARCHIVE# TABLESPACE_NAME		    QUOTA_IN_MB
    ------------------------- ------------------ ------------------------------ ----------------------------------------
    FLA1					1.00 FLASHARCHIVE		    5120
    SQL> SELECT * FROM dba_flashback_archive_tables;----->显示启动闪回数据归档的表的信息
    
    TABLE_NAME		       OWNER_NAME FLASHBACK_ARCHIVE_NAME    ARCHIVE_TABLE_NAME					  STATUS
    ------------------------------ ---------- ------------------------- ----------------------------------------------------- --------------------
    T_FLASHARCHIVE		       SCOTT	  FLA1			    SYS_FBA_HIST_88685					  ENABLED
    7、闪回表(Flashback Table)
    闪回表利用Undo表空间的信息能够将一张表恢复到之前时间点的状态,它提供了一个快速、在线的表恢复解决方案,用于恢复被用户或者应用程序意外修改或删除的表。闪回表在恢复表的同时,会自动的维护相关的属性,比如当前索引、触发器和约束,而不需要你查找和恢复应用程序特有的属性。
    闪回表语法:


    SQL> select sysdate from dual;
    
    SYSDATE
    -------------------
    2017-08-27 19:59:32
    
    SQL> select * from scott.emp where empno=7369;
    
         EMPNO ENAME      JOB	       MGR HIREDATE		      SAL	COMM	 DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK	      7902 1980-12-17 00:00:00	  3439.86		     20
    
    SQL> update scott.emp set comm=1000 where empno=7369;
    
    1 row updated.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from scott.emp where empno=7369;
    
         EMPNO ENAME      JOB	       MGR HIREDATE		      SAL	COMM	 DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK	      7902 1980-12-17 00:00:00	  3439.86	1000	     20
    
    SQL> flashback table scott.emp to timestamp to_date('2017-08-27 19:59:32','yyyy-mm-dd hh24:mi:ss');
    flashback table scott.emp to timestamp to_date('2017-08-27 19:59:32','yyyy-mm-dd hh24:mi:ss')
                          *
    ERROR at line 1:
    ORA-08189: cannot flashback the table because row movement is not enabled
    
    
    SQL> alter table scott.emp enable row movement;----------->闪回表必须启用行移动
    
    Table altered.
    
    SQL> flashback table scott.emp to timestamp to_date('2017-08-27 19:59:32','yyyy-mm-dd hh24:mi:ss');
    
    Flashback complete.
    
    SQL> select * from scott.emp where empno=7369;
    
         EMPNO ENAME      JOB	       MGR HIREDATE		      SAL	COMM	 DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK	      7902 1980-12-17 00:00:00	  3439.86		     20
    
    SQL> 
    8、闪回删除(Flashback Drop)
    使用DROP TABLE指令删除表,表不会从数据库立即删除,而是将其信息存储在回收站中,回收站记录了被删除表的新名字和原名字。记录在回收站会保留一段时间,直到空间不足或使用PURGE指令删除。回收站是一个逻辑结构,不具有物理数据结构,只要删除的表信息存储在回收站中就可以通过闪回技术进行恢复。
    SQL> drop table scott.emp;
    
    Table dropped.
    SQL> show recyclebin----->显示回收站信息
    ORIGINAL NAME	 RECYCLEBIN NAME		OBJECT TYPE  DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    EMP		 BIN$V7tfl0Pf+hzgU3UBqMDJEg==$0 TABLE	     2017-08-27:20:10:19
    SQL> flashback table emp to before drop;
    
    Flashback complete.
    
    SQL> select count(1) from emp;
    
      COUNT(1)
    ----------
    	14
    SQL> show recyclebin
    ORIGINAL NAME	 RECYCLEBIN NAME		OBJECT TYPE  DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    T_FLASHARCHIVE	 BIN$V7tfl0Pc+hzgU3UBqMDJEg==$0 TABLE	     2017-08-27:19:21:02
    SQL> purge recyclebin---->清空回收站
      2  ;
    
    Recyclebin purged.
    
    SQL> show recyclebin
    9、闪回数据库(Flashback Database)
    是一种不完全的恢复,利用闪回日志允许将整个数据库恢复到过去的某个时间点,Oracle默认不启动闪回数据库,如果需要启动闪回数据库特性,必须将数据库设置为归档模式并启用闪回恢复区。使用场景,当误删除一个用户,或者TRUNCATE一个表时。

    闪回数据库语法


    可以使用RMAN方法,也可以使用SQL指令方法。
    (1)RMAN> flashback database to time=to_date('2017-06-01 09:30:00','yyyy-mm-dd hh24:mi:ss');将数据库闪回到某个时间点;
    (2)RMAN> flashback database to scn=2;闪回到过去某个系统SCN;
    (3)RMAN> flashback database to sequence=123 thread=1;闪回到特定日志序列号之前的状态,不包括123;
    (4)SQL> flashback database to timestamp(sysdate-1/24);闪回到时间戳指定的状态;
    (5)SQL> flashback database to SCN5、;
    闪回数据库时,数据库必须在MOUNT状态,闪回结束后,需使用ALTER DATABASE OPEN RESETLOGS打开数据库。



    参考:Oracle官方文档
  • 相关阅读:
    luoguP5024 保卫王国 动态dp
    luoguP4571 [JSOI2009]瓶子和燃料 裴蜀定理
    luoguP3235 [HNOI2014]江南乐 数论分块 + 博弈论
    luoguP4101 [HEOI2014]人人尽说江南好 结论
    hdu 3032 NIm or not Nim? Multi SG
    luoguP4279 [SHOI2008]小约翰的游戏 Anti-SG 博弈论
    luoguP3480 [POI2009]KAM-Pebbles 阶梯Nim
    Educational Codeforces Round 65 (Div. 2)
    [PKUSC2018]主斗地(搜索+贪心)
    Codeforces Round #557 (Div. 1)
  • 原文地址:https://www.cnblogs.com/alen-liu-sz/p/12975723.html
Copyright © 2020-2023  润新知