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表空间的信息能够将一张表恢复到之前时间点的状态,它提供了一个快速、在线的表恢复解决方案,用于恢复被用户或者应用程序意外修改或删除的表。闪回表在恢复表的同时,会自动的维护相关的属性,比如当前索引、触发器和约束,而不需要你查找和恢复应用程序特有的属性。
闪回表语法:
![Oracle Flashback技术_第3张图片](http://img.e-com-net.com/image/info8/c052085d25f94156b8dd262e0d76acab.png)
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>
使用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官方文档