一 前提了解
最近了解到,drop table 表其实不是真实的将表删除,而是类似于window中将文件删除后,oracle将表修改了名字放置到垃圾回收站中,
首先,前提是数据库开启垃圾回收站功能,这个可以通过命令查询 ,如果没有开启收回站功能,删除则为实体删除
SHOW PARAMETER RECYCLEBIN;
或者是查询垃圾回收站的视图,看看表中是否有数据
select * from user_recyclebin;
在垃圾回收站开启的基础上,可以将drop掉的表的数据进行恢复;
二 drop原理
首先我们要知道这个drop 的功能原理
假设这个是表空间
然后,里面的是表1,表2占用的空间,
接下来,drop掉表1后,表并不会立即从物理存储中删除。相反,它会被重命名并移动到数据库的回收站中,以便于将来可能的恢复。这个过程使得被删除的对象在逻辑上对用户不可见,但它们仍然占用物理磁盘空间。
这时,如果在有新的表3插入的话,表3的数据 将在新的表空间中继续使用,表1虽然被删除了,但是物理数据还在,
除非物理空间不够,才会开始占用已经drop掉的空间
回收站中的数据实际上仍然存储在数据库的数据文件中,但是这些对象的名称会被修改,前缀会加上BIN$,以标识这些对象现在属于回收站。
三 恢复数据
要查找回收站中的数据,可以查询特定的数据字典视图,例如USER_RECYCLEBIN或DBA_RECYCLEBIN。这些视图提供了关于回收站中对象的信息,包括它们的原始名称、在回收站中的新名称、类型等。
-- 查询回收站的命令
select * from user_recyclebin;
恢复数据命令
FLASHBACK TABLE "object_name_from_query" TO BEFORE DROP RENAME TO "new_table_name";
将"object_name_from_query"替换为查询结果中的OBJECT_NAME值,将"new_table_name"替换为你希望恢复的表的新名称(如果不想改变名称,也可以用原始名称)。注意new_table_name名称不要和现有库中的表名
示例:恢复被删除的 ORDER_TEST 表
-- 查询
SELECT * FROM USER_RECYCLEBIN WHERE ORIGINAL_NAME = 'ORDER_TEST';
--恢复
FLASHBACK TABLE "ORDER_TEST" TO BEFORE DROP RENAME TO "ORDER_TEST";
或者是
-- 查询
SELECT * FROM USER_RECYCLEBIN WHERE ORIGINAL_NAME = 'ORDER_TEST';
--恢复
FLASHBACK TABLE "BIN$EJ+G3kYBesngYwIAFKylJg==$0" TO BEFORE DROP RENAME TO "ORDER_TEST";
都可以恢复到数据到实际中,
四 清空回收站
- 清空当前用户的回收站:
PURGE RECYCLEBIN;
- 清空特定对象:
例如,如果你想清空一个特定的表,可以使用:
PURGE TABLE "tableName";
其中"tableName"是回收站中对象的名称,注意使用回收站中的名称,而不是原始名称。BIN$
- 清空数据库中所有用户的回收站(需要DBA权限):
PURGE DBA_RECYCLEBIN;