Oracle数据库基础之8_闪回

闪回技术分以下几类

闪回查询:Flashback Query

闪回版本查询:Flashback Version Query

闪回事务查询:Flashback Transaction Query

闪回表:Flashback Table

闪回删除:Flashback Drop

闪回数据库:Flashback Database

其中闪回查询,闪回版本查询,闪回事务查询,闪回表这四种闪回都是基于undo实现的,闪回删除Flashback Drop是基于回收站来实现的,闪回数据库Flashback Database是基于闪回日志来实现的。

闪回查询:Flashback Query

select * from A as of scn 1095782;

select * from A as of timestamp sysdate-5/1440;

闪回版本查询:Flashback Version Query

select column1,column2,versions_startscn,versions_starttime,versions_xid,versions_operation from A versions BETWEEN SCN MINVALUE AND MAXVALUE order by 3

闪回事务查询:Flashback Transaction Query

必须启用ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;否则flashback_transaction_query.undo_sql结果为空

Select xid,operation,commit_scn,undo_sql from flashback_transaction_query where xid in

(Select versions_xid from A versions between scn minvalue and maxvalue)

闪回表:Flashback Table

必须启用ALTER TABLE t1 ENABLE ROW MOVEMENT;否则执行flashback table时会报错: ORA-08189: 因为未启用行移动功能, 不能闪回表

需要ROW MOVEMENT的原因

每一行数据都对应一个row_id,记录了数据存放的具体位置,哪个数据文件、哪个数据块、哪行

比如1行数据被删除了,这行对应的数据块就空了,一旦有其他数据插入,可能就会写入到这些到数据块上,也就是这行数据的位置被其他数据占用了,以后如果要恢复这行,因为原先的位置被其他数据占用,就要改变这行数据的位置,这就是row movement

flashback table t1 to scn XX

闪回删除:Flashback Drop

每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时, 被删除的表和表的关联对象( 包括索引, 约束,

触发器,LOB段,LOBindex 段) 不会被物理删除, 这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。闪回丢弃是指将被丢弃的数据库对象及其相依对象的拷贝保存在回收站中,以便在必要时能够及时恢复这些对象。在回收站被清空以前,被丢弃的对象并没有从数据库中删除,这就使得数据库能够恢复被意外或误操作而删除的表。

drop table t1;

show recyclebin;

select object_name,original_name from user_recyclebin;

flashback table t1 to before drop;

闪回数据库Flashback Database

要想使用Flashback Database, 必须使用Flash RecoveryArea,因为Flashback Database Log 只能保存在这里。 要配置的2个参数如下,一个是大小DB_RECOVERY_FILE_DEST_SIZE,一个是位置DB_RECOVERY_FILE_DEST。

startup mount;

alter database flashback on;

alter database open;

shutdown immediate;

startup mount;

Flashback database to timestamp to_timestamp('09-10-14 14:37:05','yy-mm-dd hh24:mi:ss');

Flashback database to SCN XX;

alter database open resetlogs;

直接alter database open resetlogs打开数据库,当然,指定scn或者timestamp时间点之后产生的数据统统丢失。如果不想丢数据,可以先执行alter database open read only命令以read-only模式打开数据库,然后立刻通exp(expdp不行因为expdp必须在readwrite下操作)方式将误操作涉及表的数据导出,再执行recover database命令以重新应用数据库产生的redo,将数据库修复到flashback database操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

相关推荐
笃行3504 小时前
数据库性能优化的五处内核改造,KingbaseES 配了四件诊断工具
数据库
非优秀程序员6 小时前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范
SelectDB11 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶11 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶14 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风14 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio14 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
数据库急诊室_阿哲18 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋19 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子19 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能