#表的闪回
# 闪回恢复
若较短时间内发现由于操作不当等原因误删了表数据,可以使用闪回功能及时将数据恢复至指定时间点(无需还原备份),更多详情可查阅FLASHBACK。
闪回恢复需满足以下条件:
- 执行闪回恢复操作需使用具备DBA权限或FLASHBACK相关权限的用户。
- 在当前时间点至目标闪回时间点期间,表的结构未发生变化。
- 可闪回恢复的时间点由撤销保持期(UNDO_RETENTION)决定,建议将该参数设置为86400秒(24小时)或更长。
- 需闪回恢复的表对象为HEAP表。
- 通过时间戳或SCN闪回恢复前需手动开启表的ROW MOVEMENT,且闪回恢复后的数据可能会改变rowid,请确保应用程序不依赖于rowid才能执行闪回恢复。
- 对于被drop的表,需确保历史数据仍然存放在回收站中才能将该表(包括表结构和数据)闪回恢复。
- drop前已开启回收站。
- drop表时,未指定purge语句。
- 当前时间点至目标闪回时间点期间,未对回收站执行purge。
- drop表时,表空间未满。
- 对于被truncate的表,需确保历史数据仍然存放在回收站中才能将该表数据(包括truncate表或truncate分区)闪回恢复。若当前时间点与truncate时间点期间表格已插入新数据,执行闪回恢复后该类新数据将会被放入回收站中。
- truncate前已开启回收站。
- 当前时间点至目标闪回时间点期间,未对回收站执行purge。
- truncate表时,表空间未满。
delete操作闪回
示例(HEAP表)
-- 开启finance_info的ROW MOVEMENT开关
ALTER TABLE finance_info ENABLE ROW MOVEMENT;
-- finance_info表中存在的一条记录
SELECT year,month,branch,revenue_total,cost_total,fee_total FROM finance_info WHERE year='2021' AND month='02';
YEAR MONTH BRANCH REVENUE_TOTAL COST_TOTAL FEE_TOTAL
----- ----- ------ ------------- ----------- -----------
2021 02 0101 37778 33000 6000
-- 获取当前时间戳
SELECT SYSTIMESTAMP res FROM dual;
RES
-----------------------------------------------
2023-12-17 14:10:28.736908
-- 删除此条记录并提交
DELETE FROM finance_info WHERE year='2021' AND month='02';
COMMIT;
SELECT year,month,branch,revenue_total,cost_total,fee_total FROM finance_info WHERE year='2021' AND month='02';
YEAR MONTH BRANCH REVENUE_TOTAL COST_TOTAL FEE_TOTAL
----- ----- ------ ------------- ----------- -----------
-- 利用FLASHBACK闪回历史数据(通过时间戳闪回)
FLASHBACK TABLE finance_info TO TIMESTAMP TIMESTAMP('2023-12-17 14:10:28.736908');
SELECT year,month,branch,revenue_total,cost_total,fee_total FROM finance_info WHERE year='2021' AND month='02';
YEAR MONTH BRANCH REVENUE_TOTAL COST_TOTAL FEE_TOTAL
----- ----- ------ ------------- ----------- -----------
2021 02 0101 37778 33000 6000
-- 获取最后一次修改时SCN(通过ROWSCN获取)
SELECT rowscn FROM finance_info WHERE year='2021' AND month='02';
ROWSCN
---------------------
408883147271815168
-- 再次删除记录
DELETE FROM finance_info WHERE year='2021' AND month='02';
COMMIT;
SELECT year,month,branch,revenue_total,cost_total,fee_total FROM finance_info WHERE year='2021' AND month='02';
YEAR MONTH BRANCH REVENUE_TOTAL COST_TOTAL FEE_TOTAL
----- ----- ------ ------------- ----------- -----------
-- 利用FLASHBACK闪回历史数据(通过SCN闪回)
FLASHBACK TABLE finance_info TO SCN 408883147271815168;
SELECT year,month,branch,revenue_total,cost_total,fee_total FROM finance_info WHERE year='2021' AND month='02';
YEAR MONTH BRANCH REVENUE_TOTAL COST_TOTAL FEE_TOTAL
----- ----- ------ ------------- ----------- -----------
2021 02 0101 37778 33000 6000
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;
TRUNCATE TABLE product;
-- 1.查询回收站是否存在product表
SELECT original_name,object_name FROM DBA_RECYCLEBIN WHERE original_name = 'PRODUCT';
ORIGINAL_NAME OBJECT_NAME
----------------------------- -----------------------
PRODUCT PRODUCT
-- 2.表数据闪回
FLASHBACK TABLE product TO BEFORE TRUNCATE;
-- 3.验证相关对象是否保留系统生成的回收站名称,若名称未恢复,请使用ALTER INDEX语句手动修改
SELECT INDEX_NAME
FROM USER_INDEXES
WHERE TABLE_NAME = 'PRODUCT';
INDEX_NAME
--------------------------
SYS_C_133
# 闪回查询
表数据被UPDATE或DELETE更改后,可以通过闪回查询功能追溯到近期的历史数据,更多详情可查阅SELECT的flashback_query_clause。
可闪回查询的时间点由撤销保持期(UNDO_RETENTION)决定,建议将该参数设置为86400秒(24小时)或更长。
闪回查询不适用于分布式部署。
示例(单机、共享集群部署)
--area表中存在的一条记录
SELECT area_no,area_name,DHQ FROM area WHERE area_no='03';
AREA_NO AREA_NAME DHQ
------- ------------------ ------------
03 华南 Guangzhou
--获取当前时间
SELECT SYSTIMESTAMP res FROM dual;
RES
----------------------------------------------------------------
2023-12-17 14:14:08.498126
--删除此条记录并提交
DELETE FROM area WHERE area_no='03';
COMMIT;
SELECT area_no,area_name,DHQ FROM area WHERE area_no='03';
AREA_NO AREA_NAME DHQ
------- ------------------ ------------
--利用flashback可查询到快照历史数据
SELECT area_no,area_name,DHQ FROM area AS OF TIMESTAMP TIMESTAMP('2023-12-17 14:14:08.498126')
WHERE area_no='03';
AREA_NO AREA_NAME DHQ
------- ------------------ ------------
03 华南 Guangzhou