写点什么

YashanDB 表的闪回

作者:YashanDB
  • 2025-03-17
    广东
  • 本文字数:3056 字

    阅读完需:约 10 分钟

闪回恢复

若较短时间内发现由于操作不当等原因误删了表数据,可以使用闪回功能及时将数据恢复至指定时间点(无需还原备份),更多详情可查阅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$2393ORDERS_INFO BIN$2389EMPLOYEES BIN$2385FINANCE_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_NAMEFROM USER_INDEXESWHERE 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_NAMEFROM USER_INDEXESWHERE 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     
复制代码


发布于: 刚刚阅读数: 3
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB表的闪回_数据库_YashanDB_InfoQ写作社区