【赵渝强老师】Oracle数据库的闪回表

在这里插入图片描述

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

视频讲解如下

【赵渝强老师】Oracle的闪回表

一、 闪回表简介

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

使用闪回表需要有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'

《Oracle数据库从零开始》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵渝强老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值