#表闪回

表闪回本质上是还原回收站中的表/表分区及其子对象,因此该功能受回收站功能约束(例如,必须开启回收站)且必须确保目标对象仍在回收站中。

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 
pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流