【赵渝强老师】Oracle的闪回删除

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 本文介绍了Oracle数据库的闪回删除(Flashback Drop)功能,该功能可从回收站恢复已删除的对象至删除前状态。文章详细讲解了回收站的工作原理及操作步骤,包括检查回收站功能是否开启、删除表、查看回收站内容以及使用闪回删除恢复数据等实战操作。通过具体示例,演示了如何恢复被删除的员工表及其数据,并处理同名表冲突问题。文末还附有视频讲解,帮助读者更直观地理解操作流程。

b237.png

Oracle的闪回删除(Flashback Drop)实际上从Oracle数据库的回收站中将已删除的对象,恢复到删除之前的状态。


一、 闪回删除简介


回收站是所有被删除对象及其相依对象的逻辑存储容器,例如当一个表被删除时,该表及其依赖的对象并不会马上被数据库彻底删除,而是被保存到回收站中。使用闪回删除功能,可以撤消drop table语句产生的影响,而不需要借助于传统的时间点恢复。通过使用闪回删除可以直接从Oracle的回收站中将删除的表恢复到删除之前的状态。


视频讲解如下:


二、 【实战】操作Oracle数据库的回收站


在了解到了什么是Oracle数据库的回收站后,下面将通过一个具体是示例来演示如何操作Oracle数据库的回收站。


(1)使用数据库管理员登录数据库,并检查回收站功能是否开启。

SQL> conn / as sysdba
SQL> select value from v$parameter where name='recyclebin';
# 输出的信息如下:
VALUE
-------------
on
# 如果没有开启回收站的功能,可以通过下面的语句开启Oracle数据库的回收站:
SQL> alter system|session set recyclebin=on;


(2)切换到c##scott用户,并查询用户下的表。

SQL> conn c##scott/tiger
SQL> select * from tab;
# 输出的信息如下:
TNAME   TABTYPE     CLUSTERID
---------- -----------  ------
BONUS   TABLE
COMM    TABLE
DEPT    TABLE
EMP     TABLE
......


(3)删除员工表emp

SQL> drop table emp;
# 由于在默认情况下启用了Oracle的回收站,这里将会把表删除到回收站中。
# 如果在删除表的时候不经过回收站直接删除,可以使用下面的语句。
SQL> drop table emp purge;


(4)查看回收站。

SQL> show recyclebin;
# 输出的信息如下:
ORIGINAL NAME   RECYCLEBIN NAME       OBJECT TYPE   DROP TIME
--------------  ------------------------------ ------------ ---------------------
EMP       BIN$2wRA2DnkHfrgUwEAAH88+w==$0  TABLE   2025-03-25:12:18:22
# 清空Oracle数据库的回收站可以使用下面的语句:
SQL> purge recyclebin;
# 为了确保在回收站中的对象的名称都是唯一的,
# Oracle会对回收站中的对象进行重命名,重命名的格式如下:
# BIN$globalUID$version
# 其中,BIN表示Oracle数据库的回收站;
# globalUID是一个全局唯一的、24个字节的对象,
# 该对象与原对象名没有任何关系;version指数据库分配的版本号。


(5)由于员工表并没有真正被删除,查询员工表的数据。

SQL> select * from emp where deptno=10;
# 此时将输出下面的错误信息:
ERROR at line 1:
ORA-00942: table or view does not exist
# 尽管员工表并没有真正被删除,
# 但此时表名已经改为了BIN$2wRA2DnkHfrgUwEAAH88+w==$0。


(6)通过表在回收站中的名称查询数据。

SQL> select * from BIN$2wRA2DnkHfrgUwEAAH88+w==$0 where deptno=10;
# 此时将出现下面的错误信息。
ERROR at line 1:
ORA-00933: SQL command not properly ended
# 通过表在回收站中的名称查询原来表数据的时候,需要在表名上加上双引号。


(7)加上双引号,通过表在回收站中的名称查询数据。

SQL> select * from "BIN$2wRA2DnkHfrgUwEAAH88+w==$0" where deptno=10;;
# 输出的信息如下:
EMPNO ENAME JOB     MGR   HIREDATE  SAL   COMM  DEPTNO
------ ------- ----------- ------- ----------- ------- ------- ----------
7782  CLARK MANAGER   7839  09-JUN-81 2450        10
7839  KING  PRESIDENT     17-NOV-81 5000        10
7934  MILLER  CLERK   7782  23-JAN-82 1300        10
# 值得注意的时,数据库管理员是没有回收站的。


(8)切换到数据库管理员上,并创建一张表。

SQL> conn / as sysdba
SQL> create table testtable as select * from c##scott.dept;


(9)查询表testtable中的数据。

SQL> select * from testtable;
# 输出的信息如下:
DEPTNO    DNAME     LOC
---------- -------------- -----------
  10    DName123    NEW YORK
  20    RESEARCH    DALLAS
  30    SALES     CHICAGO
  40    OPERATIONS    BOSTON


(10)删除表testtable。

SQL> drop table testtable;
# 由于在使用drop table语句时并没有使用参数purge,
# 表testtable应该是被删除到Oracle的回收站中。
# 但是由于当前用户是管理员用户,他是没有回收站的。
# 因此表testtable将直接被删除。换句话说,回收站只针对普通用户有效。


(11)查看回收站。

SQL> show recyclebin;
# 此时回收站中没有任何的记录。


三、 【实战】使用闪回删除从回收站中恢复数据


在了解到了什么是Oracle数据库的回收站后,下面将通过一个具体是示例来演示如何使用闪回删除从回收站中恢复表。这里以之前删除的员工表emp为例来进行演示。


(1)切换到c##scott用户,并且查看回收站中的信息。

SQL> conn c##scott/tiger
SQL> show recyclebin;
# 输出的信息如下:
ORIGINAL NAME RECYCLEBIN NAME         OBJECT TYPE   DROP TIME
-------------- -------------------------------  ------------ -----------------------
EMP       BIN$2wRA2DnkHfrgUwEAAH88+w==$0  TABLE     2025-03-25:12:18:22


(2)执行闪回删除恢复表。

SQL> flashback table emp to before drop;
# 此处也可以使用表在回收站中的名称执行闪回删除,
# 但需要在名称上加上双引号。例如:
SQL> flashback table "BIN$2wRA2DnkHfrgUwEAAH88+w==$0" to before drop;


(3)验证员工表及数据是否恢复。

SQL> select * from emp where deptno=10;
# 输出的信息如下:
EMPNO ENAME JOB     MGR   HIREDATE  SAL   COMM  DEPTNO
------ ------- ----------- ------- ----------- ------- ------- ----------
7782  CLARK MANAGER   7839  09-JUN-81 2450        10
7839  KING  PRESIDENT     17-NOV-81 5000        10
7934  MILLER  CLERK   7782  23-JAN-82 1300        10


(4)再次删除员工表

SQL> drop table emp;


(5)重新创建一张新的表。表名也叫emp,并往新表中插入一些数据。

SQL> create table emp(tid number);
SQL> insert into emp values(1);
SQL> commit;


(6)删除新建的emp表。

SQL> drop table emp;


(7)查看回收站中的信息。

SQL> show recyclebin;
# 输出的信息如下:
ORIGINAL NAME RECYCLEBIN NAME         OBJECT TYPE   DROP TIME
--------------- ------------------------------- ------------ ------------------------
EMP       BIN$2wVIwwEZItLgUwEAAH/P1A==$0  TABLE     2025-03-25:13:32:40
EMP       BIN$2wVIwwEYItLgUwEAAH/P1A==$0  TABLE     2025-03-25:13:32:10
# 此时回收站中的ORIGINAL NAME就有两张重名的表,
# 但RECYCLEBIN NAME是不重复的。
# 如果通过RECYCLEBIN NAME执行闪回删除操作,将不会产生歧义。


(8)执行闪回删除从回收站中恢复表。

SQL> flashback table emp to before drop;


(9)查看恢复的表结构。

SQL> desc emp;
# 输出的信息如下:
 Name  Null?    Type
 ---------- --------------- --------
 TID   NUMBER
# 从这里可以看出,如果回收站中存在ORIGINAL NAME重名的表,
# 先闪回后删除的表。此时回收站中还存在一张名叫emp的表。


(10)再次执行闪回删除从回收站中恢复表。

SQL> flashback table emp to before drop;
# 将输出下面的错误信息:
ERROR at line 1:
ORA-38312: original name is used by an existing object
# 由于当前用户下已经有一张名叫emp的表,
# 因此再次闪回同名表时就需要修改一下表的名称。


(11)重新执行闪回表的操作,并指定闪回成功后的表名。

SQL> flashback table emp to before drop rename to empold;


(12)查看表empold中的数据。

SQL> select * from empold where deptno=10;
# 输出的信息如下:
EMPNO ENAME JOB     MGR   HIREDATE  SAL   COMM  DEPTNO
------ ------- ----------- ------- ----------- ------- ------- ----------
7782  CLARK MANAGER   7839  09-JUN-81 2450        10
7839  KING  PRESIDENT     17-NOV-81 5000        10
7934  MILLER  CLERK   7782  23-JAN-82 1300        10


相关文章
|
4月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】在PostgreSQL中访问Oracle
本文介绍了如何在PostgreSQL中使用oracle_fdw扩展访问Oracle数据库数据。首先需从Oracle官网下载三个Instance Client安装包并解压,设置Oracle环境变量。接着从GitHub下载oracle_fdw扩展,配置pg_config环境变量后编译安装。之后启动PostgreSQL服务器,在数据库中创建oracle_fdw扩展及外部数据库服务,建立用户映射。最后通过创建外部表实现对Oracle数据的访问。文末附有具体操作步骤与示例代码。
141 6
【赵渝强老师】在PostgreSQL中访问Oracle
|
6月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的闪回版本查询
本文介绍了Oracle数据库的闪回版本查询(Flashback Version Query)功能,通过示例详细讲解了其使用方法。闪回版本查询可获取指定时间区间内行的不同版本,利用`versions between`子句实现。文中包含视频讲解,并通过创建测试表、插入数据及执行查询等步骤,演示如何获取历史版本信息和伪列详情,帮助用户深入了解该功能的实际应用。
113 13
|
5月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回数据库
Oracle闪回数据库功能类似于“倒带按钮”,可快速将数据库恢复至 earlier 状态,无需还原备份。本文介绍了闪回数据库的使用方法及实战案例:包括设置归档模式、开启闪回功能、记录SCN号、执行误操作后的恢复步骤等。通过具体 SQL 操作演示了如何利用闪回数据库恢复被误删的用户数据。注意,使用此功能前需确保数据库为归档模式。
149 9
|
6月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回表
本文介绍了Oracle数据库中的闪回表(Flashback Table)功能,它能够将表的数据快速恢复到特定时间点或系统改变号(SCN),无需备份。文章通过实战示例详细演示了如何使用闪回表恢复数据,包括授权、创建测试表、记录时间与SCN号、删除数据、启用行移动功能、执行闪回操作以及验证恢复结果等步骤。同时,还展示了如何通过触发器禁止插入操作,并在闪回过程中处理触发器的启用问题。文末附有视频讲解,帮助读者更好地理解闪回表的使用方法。
210 10
|
5月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回数据归档
本文介绍了Oracle闪回数据归档(Flashback Data Archive)的功能与实现方法。闪回数据归档可将表中的历史数据进行归档,支持全面的历史数据查询,引入了“Oracle Total Recall”概念。文中通过具体实战步骤演示了如何创建和启用闪回数据归档:包括创建表空间、数据归档,设置默认归档,授予用户权限,开启表的归档功能,并展示了误操作后如何通过归档恢复数据。最后通过执行计划验证了数据来源于归档。
132 4
|
5月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回事务查询
Oracle数据库的闪回事务查询(Flashback Transaction Query)是闪回版本查询的扩充,可用于审计或撤销已提交的事务。通过`flashback_transaction_query`视图,可生成还原特定事务的SQL语句。本文介绍了其基本概念,并通过实战演示如何使用该功能:从授权、开启UNDO数据增强,到创建测试表和事务,最后利用闪回查询撤销已提交的事务,验证数据恢复效果。附带视频讲解,帮助深入理解。
120 3
|
6月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回查询
本文介绍了Oracle数据库的闪回查询(Flashback Query)功能及其实际应用。闪回查询通过`AS OF`子句,结合时间戳或SCN号,可查询历史数据状态,帮助分析数据差异。文中通过具体示例演示了如何使用闪回查询:创建测试表、记录当前SCN号、更新数据并提交事务,最后通过闪回查询获取历史数据。附带的视频和代码块详细展示了操作步骤与结果。
202 4
|
6月前
|
Oracle 关系型数据库 数据管理
【赵渝强老师】Oracle数据库的闪回技术
在Oracle数据库操作中,难免会遇到误删表或提交错误事务等问题,可能导致数据丢失甚至数据库停止运行。传统解决方法依赖备份恢复,但需提前准备正确备份。为此,Oracle提供了闪回技术,无需备份即可快速恢复数据。它支持7种类型的操作,如闪回查询、版本查询、表恢复等,能有效应对逻辑损坏和用户错误。闪回技术基于还原(undo)数据管理,启用自动管理后可实现高效恢复。
168 0
|
Oracle 关系型数据库 数据库
Oracle备份恢复之闪回技术
Oracle备份恢复之闪回技术
254 0
Oracle备份恢复之闪回技术
|
SQL 缓存 Oracle
Oracle的学习心得和知识总结(一)|Oracle数据库闪回技术详解
Oracle的学习心得和知识总结(一)|Oracle数据库闪回技术详解
635 0
Oracle的学习心得和知识总结(一)|Oracle数据库闪回技术详解