#表闪回
表闪回本质上是还原回收站中的表/表分区及其子对象,因此该功能受回收站功能约束(例如,必须开启回收站)且必须确保目标对象仍在回收站中。
SQL语句为FLASHBACK TABLE [PARITITION|SUBPARTITION] TO BEFORE ……,详细语法介绍请查阅FLASHBACK。
对于被TRUNCATE的表/分区,若TRUNCATE后表/分区中已插入新数据,闪回后该类新数据将会被放入回收站中。
闪回表/表分区时,数据恢复规则如下:
若待恢复对象为被DROP的表,需确认原表名是否被占用,若被占用则需在闪回的同时进行重命名,否则会报错。
若待恢复对象已执行过多次DROP操作,每一次FLASHBACK只会逆序恢复一次DROP的数据,即首次FLASHBACK只恢复最后1次DROP操作。若前1次FLASHBACK恢复时未重命名(占用原表名),则后续FLASHBACK时则无法再继续使用原名称恢复。
若待恢复对象已执行过多次TRUNCATE操作,每一次FLASHBACK只会逆序恢复一次TRUNCATE的数据,即首次FLASHBACK只恢复最后1次TRUNCATE操作。
各类对象始终遵循从属关系:
无法单独恢复通过TRUNCATE整个表进入回收站的分区,无法单独恢复通过TRUNCATE一级分区进入回收站的二级分区。
无法单独恢复子对象(索引、触发器等),在恢复表/分区时,会自动恢复未被清理的相关子对象。
# 前提条件
执行表闪回操作需使用具备DBA权限或FLASHBACK相关权限的用户。
确保目标表/分区仍保存在回收站中,通过DBA_RECYCLEBIN视图(或对应的USER_RECYCLEBIN、ALL_RECYCLEBIN视图)可以查看回收站中的对象。
对于被DROP的表,需确认原表名是否被占用,若被占用可在闪回的同时进行重命名。
# 操作示例
# 闪回DROP操作
示例(HEAP表)
-- 环境准备(开启回收站、删除示例表)
ALTER SYSTEM SET RECYCLEBIN_ENABLED=ON;
DROP TABLE finance_info;
DROP TABLE orders_info;
DROP TABLE sales_info;
DROP TABLE employees;
-- 1. 查询回收站中是否存在finance_info表
SELECT original_name,object_name FROM DBA_RECYCLEBIN
WHERE original_name IN ('FINANCE_INFO','ORDERS_INFO','SALES_INFO','EMPLOYEES');
ORIGINAL_NAME OBJECT_NAME
----------------------------- -----------------------
SALES_INFO BIN$2393
ORDERS_INFO BIN$2389
EMPLOYEES BIN$2385
FINANCE_INFO BIN$2408
-- 2.表结构及表数据闪回
FLASHBACK TABLE BIN$2393 TO BEFORE DROP;
-- 或使用表的原始名称进行闪回
FLASHBACK TABLE finance_info TO BEFORE DROP;
-- 或通过RENAME TO命令指定表的新名称
FLASHBACK TABLE employees TO BEFORE DROP RENAME TO employees_recycle;
-- 3.验证相关对象是否保留系统生成的回收站名称,若名称未恢复,请使用ALTER INDEX语句手动修改
SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'FINANCE_INFO';
INDEX_NAME
---------------------------------
IDX_FINANCE_INFO_1
# 闪回TRUNCATE操作
示例(HEAP表)
-- 环境准备(开启回收站、删除示例表数据、插入新数据)
ALTER SYSTEM SET RECYCLEBIN_ENABLED=ON;
SELECT year,month,branch,revenue_total,cost_total,fee_total FROM finance_info;
YEAR MONTH BRANCH REVENUE_TOTAL COST_TOTAL FEE_TOTAL
--------- --------- --------- ------------- ----------- -----------
2001 01 0201 2888 2000 300
2021 01 0201 28888 24000 3000
2021 01 0101 38888 34000 4000
TRUNCATE TABLE finance_info;
INSERT INTO finance_info VALUES ('2024','01','0201',28808,12000,1000);
COMMIT;
-- 1. 查询回收站是否存在product表
SELECT ORIGINAL_NAME,OPERATION,RECYCLEBIN_TIME FROM DBA_RECYCLEBIN WHERE original_name = 'FINANCE_INFO';
ORIGINAL_NAME OPERATION RECYCLEBIN_TIME
---------------------------------------------------------------- ------------------------- -----------------------------------------
FINANCE_INFO TRUNCATE 2024-12-13:16:25:16
-- 2. 表闪回
FLASHBACK TABLE finance_info TO BEFORE TRUNCATE;
-- 3. 验证finance_info表的数据,TRUNCATE后新插入的数据并不存在,新数据会在回收站中
YEAR MONTH BRANCH REVENUE_TOTAL COST_TOTAL FEE_TOTAL
--------- --------- --------- ------------- ----------- -----------
2001 01 0201 2888 2000 300
2021 01 0201 28888 24000 3000
2021 01 0101 38888 34000 4000
-- 4.查看回收站中是否存在finance_info表相关信息,并对比进入回收站的时间
SELECT ORIGINAL_NAME,OPERATION,RECYCLEBIN_TIME FROM DBA_RECYCLEBIN WHERE original_name = 'FINANCE_INFO';
ORIGINAL_NAME OPERATION RECYCLEBIN_TIME
---------------------------------------------------------------- ------------------------- -----------------------------------------
FINANCE_INFO TRUNCATE 2024-12-13:16:27:05

