Oracle Flashback技术

来源:互联网 发布:数控铣创意图案编程 编辑:程序博客网 时间:2024/06/06 09:11
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 AUTOundo_retention     integer 900undo_tablespace      string UNDOTBS1SQL> 
配置数据库使用Oracle闪回事务查询(Oracle Flashback Transaction Query)
1、确保Oracle数据库使用版本10.0兼容运行
SQL> show parameter compatibleNAME     TYPE VALUE------------------------------------ ----------- ------------------------------compatible     string 11.2.0.4.0
2、启用补充日志记录
SQL> alter database add supplemental log data;Database altered.
配置数据库使用闪回事务(Flashback Transaction)
1、启用数据库归档
SQL> startup mountORACLE instance started.Total System Global Area  622149632 bytesFixed Size    2255792 bytesVariable Size  234882128 bytesDatabase Buffers  381681664 bytesRedo Buffers    3330048 bytesDatabase mounted.SQL> alter database archivelog;Database altered.SQL> archive log list;Database log mode       Archive ModeAutomatic archival       EnabledArchive destination       USE_DB_RECOVERY_FILE_DESTOldest online log sequence     25Next log sequence to archive   28Current log sequence       28SQL> 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 a50SQL> column version for a15SQL> column status for a20SQL> select * from product_component_version  2  where product like 'Oracle%';--->查看数据库版本信息PRODUCT    VERSION   STATUS-------------------------------------------------- --------------- --------------------Oracle Database 11g Enterprise Edition   11.2.0.4.0   64bit ProductionSQL> 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      SALCOMM 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 a30SQL> column versions_endtime for a30SQL> 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_ENDTIMEVERSIONS_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 PM0A0008008D030000 U SMITH 1990.66  1284161 27-AUG-17 04.38.55 PM  1284166 27-AUG-17 04.38.58 PM04001F0098030000 U SMITH 1658.88  1284143 27-AUG-17 04.38.37 PM  1284161 27-AUG-17 04.38.55 PM0200210062040000 U SMITH  1382.4  1281680 27-AUG-17 04.15.16 PM  1284143 27-AUG-17 04.38.37 PM01001F0080030000 U SMITH    1152 1281680 27-AUG-17 04.15.16 PM   SMITH     8006 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 BEGIN02000E0063040000    1284171 UPDATE     EMP            update "SCOTT"."EMP" set "SAL" = '1990.66' where ROWID = 'AAAVREAAEAAAACXAAA';02000E0063040000    1284171 BEGIN0200210062040000    1283966 UPDATE     EMP            update "SCOTT"."EMP" set "SAL" = '1152' where ROWID = 'AAAVREAAEAAAACXAAA';0200210062040000    1283966 BEGIN04001F0098030000    1284160 UPDATE     EMP            update "SCOTT"."EMP" set "SAL" = '1382.4' where ROWID = 'AAAVREAAEAAAACXAAA';04001F0098030000    1284160 BEGIN0A0008008D030000    1284165 UPDATE     EMP            update "SCOTT"."EMP" set "SAL" = '1658.88' where ROWID = 'AAAVREAAEAAAACXAAA';0A0008008D030000    1284165 BEGIN11 rows selected.
注:可以使用UNDO_SQL进行回退。
4、使用DBMS_FLASHBACK包
DBMS_FLASHBACK包提供了和闪回查询一样的功能,但是个人觉得闪回查询使用起来更方便。
SQL> update scott.emp set sal=sal*1.2 where empno=7369;--->更新后sal为2866.551 row updated.SQL> commit;Commit complete.SQL>  select sysdate from dual;SYSDATE-------------------2017-08-27 17:48:15SQL> 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      SALCOMM 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     12501400     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      SALCOMM 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     1014 rows selected.SQL> call dbms_flashback.disable();----->调用后必须调用disable退出闪回查询Call completed.SQL> select *from scott.emp;     EMPNO ENAME      JOB       MGR HIREDATE      SALCOMM 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     12501400     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      SALCOMM 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     1014 rows selected.
5、闪回事务(Flashback Transaction)
数据库处于Online状态时,使用DBMS_FLASHBACK.Transaction_backout可以回滚事务或者其他相关的事务。恢复操作使用撤销数据创建和运行补偿事务,使受影响的数据回到原始状态。
对应的数据字典视图:
dba_flashback_txn_statedba_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,statusfrom dba_flashback_archive;----->显示关于闪回数据归档文件的信息OWNER_NAME NAME    NO#   DAYS STATUS---------- -------------------- ------ -------- --------------------SYS   FLA1   1.00 365.00 DEFAULTSQL> SELECT * FROM dba_flashback_archive_ts;----->显示闪回数据归档文件的表空间信息FLASHBACK_ARCHIVE_NAME  FLASHBACK_ARCHIVE# TABLESPACE_NAME    QUOTA_IN_MB------------------------- ------------------ ------------------------------ ----------------------------------------FLA11.00 FLASHARCHIVE    5120SQL> 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:32SQL> select * from scott.emp where empno=7369;     EMPNO ENAME      JOB       MGR HIREDATE      SALCOMM DEPTNO---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------      7369 SMITH      CLERK      7902 1980-12-17 00:00:00  3439.86     20SQL> 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      SALCOMM DEPTNO---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------      7369 SMITH      CLERK      7902 1980-12-17 00:00:00  3439.861000     20SQL> 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 enabledSQL> 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      SALCOMM DEPTNO---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------      7369 SMITH      CLERK      7902 1980-12-17 00:00:00  3439.86     20SQL> 
8、闪回删除(Flashback Drop)
使用DROP TABLE指令删除表,表不会从数据库立即删除,而是将其信息存储在回收站中,回收站记录了被删除表的新名字和原名字。记录在回收站会保留一段时间,直到空间不足或使用PURGE指令删除。回收站是一个逻辑结构,不具有物理数据结构,只要删除的表信息存储在回收站中就可以通过闪回技术进行恢复。
SQL> drop table scott.emp;Table dropped.SQL> show recyclebin----->显示回收站信息ORIGINAL NAME RECYCLEBIN NAMEOBJECT TYPE  DROP TIME---------------- ------------------------------ ------------ -------------------EMP BIN$V7tfl0Pf+hzgU3UBqMDJEg==$0 TABLE     2017-08-27:20:10:19SQL> flashback table emp to before drop;Flashback complete.SQL> select count(1) from emp;  COUNT(1)----------14SQL> show recyclebinORIGINAL NAME RECYCLEBIN NAMEOBJECT TYPE  DROP TIME---------------- ------------------------------ ------------ -------------------T_FLASHARCHIVE BIN$V7tfl0Pc+hzgU3UBqMDJEg==$0 TABLE     2017-08-27:19:21:02SQL> 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官方文档
原创粉丝点击