Oracle Flashback Technology(闪回技术)

时间:2021-06-14 08:15:05
Flashback的目的
先看下Oracle官方文档中的解释
Oracle Flashback Technology is a group of Oracle Database features that that let you view past states of database objects or to return database objects to a previous state without using point-in-time media recovery. 
即:Oracle Flashback是一组Oracle数据库特性,闪回允许你查看过去一个时间数据库对象的状态,或者不借助数据库恢复,就可以恢复数据库对象到之前的一个时间状态。
比如:如果你对数据误操作,而且已提交,这时想回退该误操作,将会是很件麻烦的事情。有人可能会说可以用备份恢复到误操作之前,但那样的话,之前所做的其他正确的操作数据也就一起没了,而Flashback技术就可以帮助你快速的恢复误操作。

需要注意的是Flashback主要是用来解决数据错误,或是用户的一些误操作,对于介质损坏,任何闪回技术都是无能为力的,此时我们只能使用标准的还原、恢复过程。

Flashback技术都包括哪些
  • Flashback Query (引入自Oracle 9i)
  • Flashback Table (引入自 Oracle 10g)
  • Flashback Drop (引入自 Oracle 10g)
  • Flashback Version Query (引入自Oracle 10g)
  • Flashback Transaction Query (引入自Oracle 10g)
  • Flashback Database (引入自Oracle 10g)
  • Flashback Data Archive (引入自Oracle 11g)
  • Flashback Transaction (引入自Oracle 11g)
闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务级别闪回。
Oracle Flashback Technology(闪回技术)
Flashback Query useful to view the data at a point-in-time in the past. This can be used (only) to view and reconstruct lost data that was deleted or changed by accident.

Flashback Table useful to recover a table to a point-in-time in the past without restoring a backup. Flashback Table is a push button solution to restore the contents of a table to a given point-in-time. An application on top of Flashback Query can achieve this, but with less efficiency.

Flashback Drop provides a way to restore accidentally dropped tables. This will be done with the help of Recyclebin feature.

Flashback Version Query uses undo data stored in the database to view the changes to one or more rows along with all the metadata of the changes.

Flashback Transaction Query useful to examine changes to the database at the transaction level. As a result, we can diagnose problems, perform analysis and audit transactions.

Flashback Database useful to bring database to a prior point in time by undoing all the changes that have taken place since that time. This operation is fast, because we do not need to restore the backups. This in turn results in much less downtime following data corruption or human error. Flashback Database applies to the entire database. It requires configuration and resources, but it provides a fast alternative to performing incomplete database recovery.

Flashback Data Archive - from Oracle 11g, flashback will make use of flashback logs, explicitly created for that table, in FRA (Flash/Fast Recovery Area), will not use undo. Flashback data archives can be defined on any table/tablespace. Flashback data archives are written by a dedicated background process called FBDA so there is less impact on performance. Can be purged at regular intervals automatically.

Flashback技术演进的历史Oracle Flashback Technology(闪回技术)

Flashback Query
Oracle Flashback Query是指针对特定的表来查询特定的时间段内的数据变化情况来确定是否将表闪回到某一个特定的时刻以保证数据无讹误存在。这个特性大大的减少了采用时点恢复所需的工作量以及数据库脱机的时间。

一个列子,DBA误删了某业务表,事后突然意识到了,那么如何快速的确认&恢复呢
SQL> alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss'; 
Session altered

SQL> select * from scott.emp;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH      CLERK      7902 1980/12/17     800.00               20
7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
7839 KING       PRESIDENT       1981/11/17    5000.00               10
7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
7900 JAMES      CLERK      7698 1981/12/3      950.00               30
7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
14 rows selected

SQL> create table test1 as (select * from scott.emp);
Table created

SQL> select sysdate from dual; 
SYSDATE
-----------
2015/7/19 15:22:17

--这里DBA误操作,误删除了test1业务表,并且执行了commit
SQL> delete from test1;
14 rows deleted

SQL> commit;
Commit complete
此时test1表中已经没有数据了
SQL> select * from test1;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------

SQL> 
但我们依然可以通过Flashback Query查询之前被删除的数据:
SQL> select * from test1 as of timestamp to_timestamp('2015-07-19:15:22:17','yyyy-mm-dd:hh24:mi:ss'); 
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH      CLERK      7902 1980/12/17     800.00               20
7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
7839 KING       PRESIDENT       1981/11/17    5000.00               10
7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
7900 JAMES      CLERK      7698 1981/12/3      950.00               30
7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
14 rows selected

SQL>
如果需要,还可以恢复数据:
SQL> insert into test1 select * from test1 as of timestamp to_timestamp('2015-07-19:15:22:17','yyyy-mm-dd:hh24:mi:ss'); 
14 rows inserted

SQL> commit; 
Commit complete
上边这个例子是通过时间戳来查看历史记录,Flashback Query还可以通过SCN的方式查询历史记录,可以参考Oracle Flashback Query中的例子。

Flashback Database
Flashback Database,数据库级别的恢复,可以将整个数据库恢复到指定的时间点。

数据库级别的恢复,大家首先会想到的方式可能是借助备份,没错!在10g之前进行全库恢复只能借助备份进行(不管是逻辑备份还是物理备份,反正都得先有备份,才能进行恢复)。那么10g中推出的Flashback Database特性用来做恢复,相比常规的备份方式有哪些优势呢?主要有两点:速度和恢复方式。

常规的恢复方式须借助"备份+归档"
Oracle Flashback Technology(闪回技术)
当前数据库SCN为2000,要将数据库恢复到2000之前的状态,如SCN 1850,就必须有在指定时间点前创建的备份。如果没有适当的备份,我们想依靠SCN 2000时的归档和数据文件,是不可能将数据库恢复到SCN 1850时的状态的。  

而借助Flashback Database特性,可以进行这样的恢复
Oracle Flashback Technology(闪回技术)
从启用Flashback Database的那刻到当前时间,借助Flashback Database,我们可以将数据库直接修复到这中间的任意时间点,比如直接将数据库Flashback至SCN 1850。当然,实际上我们还是借助了备份的,只不过没有了恢复数据文件的过程,因此才会表现得如此快速。

操作原理:数据库不可能平白无故拥有这样的功能,Oracle为了实现Flashback Database特性,另外引入了一组新的日志文件:Flashback Logs。我们知道Oracle数据库中有Online Redologs、Standby Redologs及Archived Redologs,被统称为重做日志,这几类日志文件都是用来记录Oracle数据库所做的操作,那么Flashback Logs又是何方高人?起什么作用?又以什么形式表现的呢,请听下回……啊别打别打,俺马上就说。

其实Flashback Logs并不神秘,与所有的日志文件功能相同,它也是用来记录日志。只不过这个日志保存的信息比较特别,并不简单记录做过什么的操作,而是记录下操作执行前要修改的数据,即数据块的前映像。这些信息被写入一个专用存储区叫Flash Recovery Area,简称FRA。当需要Flashback Database时,通过Flashback Log中保存的数据,就可以快速将Oracle数据库恢复到指定时间点块的状态,然后再通过应用重做日志,将数据库恢复到一致性状态。

Flashback Log的创建、删除、修改都由Oracle自动进行,完全无须DBA手工干预,唯一需要DBA介入的,就是给Flash Recovery Area分配适当的空间。





参考
《涂抹Oracle》