头图

Oracle的闪回表(Flashback Table)实际上是将表中的数据快速回退到过去的一个是时间点或者系统改变号SCN上,从而达到恢复数据的目的。

视频讲解如下:
https://www.bilibili.com/video/BV18iDoYVErE/?aid=113447081742...

一、 闪回表简介

闪回表可以将一张或多张表恢复到特定的时间点,并且整个恢复的过程是不需要有备份的。使用闪回表的时候,同时还会还原表及其关联的对象(如索引、约束条件、触发器等)中的数据。闪回表在执行的过程中国,会在还原数据中检索到用于满足闪回表请求的数据。因此,闪回表为用户提供了可快速容易地恢复意外的修改,而不需要数据库管理员的干预的方法。

使用闪回表需要有flashback table或flashback any table的系统权限。

闪回表的语法格式如下所示:

flashback table [schema.]<表名> to
{[before drop [rename to 表名]] [SCN|时间戳] 表达式
[enable|disable] triggers}

# 其中:
# schema:代表模式名,一般就是指的用户名。
# to before drop:代表恢复到删除之前。
# rename to:代表更换表名。

二、 【实战】使用闪回表恢复数据

在了解到了什么是Oracle数据库的闪回表后,下面将通过一个具体是示例来演示如何使用闪回表恢复数据。

(1)使用数据库管理登录数据库,并授权c##scott用户闪回表的权限。

SQL> conn / as sysdba
SQL> grant flashback any table to c##scott;

(2)切换到c##scott用户上,创建测试表并插入测试数据。

SQL> conn c##scott/tiger
SQL> create table flashback3(tid number, tname varchar2(20));
SQL> insert into flashback3 values(1,'Tom');
SQL> insert into flashback3 values(2,'Mary');
SQL> insert into flashback3 values(3,'Mike');
SQL> commit;

(3)查询表flashback3中的数据。

SQL> select * from flashback3;

# 输出的信息如下:
TID    TNAME
---------- --------------------
     1        Tom
     2        Mary
     3        Mike

(4)记录当前的时间和SCN号。

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') "current time",
       timestamp_to_scn(sysdate) SCN from dual;     

# 输出的信息如下:
current time                SCN
----------------------------- -----------------
2025-03-25 11:30:51    2754561

(5)删除测试表中的一条数据。

SQL> delete from flashback3 where tid=2;
SQL> commit;

# 这里的delete语句用于模拟用户误删除了表中的数据。

(6)执行闪回表恢复删除的数据:

SQL> flashback table flashback3 to scn 2754561;

# 此时将输出下面的错误信息:
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled

(7)执行闪回表需要启用表的行移动功能。

SQL> alter table flashback3 enable row movement;

(8)重新执行闪回表恢复删除的数据。

SQL> flashback table flashback3 to scn 2754561;

(9)执行查询语句验证数据是否恢复。

SQL> select * from flashback3;

# 输出的信息如下:
TID    TNAME
---------- --------------------
     1        Tom
     2        Mary
     3        Mike

# 在默认情况下,闪回表将禁用表上的触发器。

(10)在表flashback3创建一个触发器用于禁止插入操作。

SQL> create or replace trigger mytrigger
before insert
on flashback3
begin
        raise_application_error(-20001,'Insert disabled');
end;
/

# 当在表flashback3上执行插入操作时,
# 触发器mytrigger将被触发并直接抛出错误号是-20001的错误信息。
# 换句话说,表flashback3上的插入操作被禁用了。

(11)记录当前的时间和SCN号。

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') "current time",
  timestamp_to_scn(sysdate) SCN from dual;

# 输出的信息如下:
current time            SCN
--------------------- ------------------
2025-03-25 11:54:38    2755332

(12)删除数据。

SQL> delete from flashback3 where tid=2;
SQL> commit;

(13)重新执行闪回表恢复删除的数据

SQL> flashback table flashback3 to scn 2755332 enable triggers;

# 这里执行的闪回表操作启用了表上触发器。

# 此时,将输出下面的错误信息:
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Insert disabled
ORA-06512: at "C##SCOTT.MYTRIGGER", line 2
ORA-04088: error during execution of trigger 'C##SCOTT.MYTRIGGER'

赵渝强老师
36 声望15 粉丝

20年以上的IT行业从业经历,清华大学计算机软件工程专业毕业,京东大学大数据学院院长,Oracle中国有限公司高级技术顾问;曾在BEA、甲骨文、摩托罗拉等世界500强公司担任高级软件架构师或咨询顾问等要职,精通大...