oracle 闪回技术

闪回技术概览

1.查看数据的过去状态

2.可沿时间轴向前或者向后闪回

3.协助用户进行错误分析和恢复

4.简单的sql实现闪回(或者DBMS_FLASHBACK包)

5.闪回时间与数据库大小无关(主要是数据库在闪回时间段数据变化有关)

闪回类型

复制代码
flashback database

flashback table

flashback drop

flashback transaction

flashback transaction

flashback transaction query

flashback query

flashback version query(数据库版本的闪回查询)
复制代码

闪回技术

1.基于undo数据的闪回

1)闪回查询:查询一张表在过去时间的数据状态

2)闪回表:把一张表山回到过去的时间点

3)闪回版本查询:一段时间多个事务操作对应表中数据状态

4)闪回事务查询:查询事务对应的undo sql;闪回数据归档

 

闪回查询前提

基于undo数据,确实是否可以查询对象或将对象改回到过去的某个时间点。

undo_management=auto

闪回到精确的时间点
select * from sh.test_tab1 as of timestamp to_timestame('2022-12-21 08:45:00','yyyy-nn-dd hh24:mi:ss');
闪回到多久之前
select * from tab as of timestamp sysdate-1/24;
闪回到指定scn
select * from tab2 as of scn 553423;

 

闪回查询版本技术

具体伪劣有很多

versions_startscn 数据版本被创建时的scn
versions_starttime 数据版本被创建时的时间戳
versions_endscn
versions_endtime
versions_xid 数据版本被创建时的事务号
versions_operation 数据版本创建时事务类型

 

select versions_xid,salary from employees versions between timestamp <t1> and <t2> where employee_id=200;

另外可以关联 flashback_transaction_query,了解更多的闪回查询,例如undo_sql可以直接给出数据修复需要执行的sql

闪回表技术

限制:只能将闪回到undo所允许的指定时间内

需要开启行迁移(row movement)

alter table table_name enable row movement;
闪回到指定时间点
flushback table table_name to timestamp <time>
闪回到n小时之前
flushback table table_name to timestamp sysdate -1;
闪回到指定scn
flushback table table_name to scn 234;

 

FDA闪回数据归档技术

基于undo有很多局限性,undo会被覆盖

闪回归档步骤

1)创建一个供闪回数据库使用的表空间

2)在该表空间创建闪回数据归档

3)创建一个用户并授权dba角色

4)登录创建一个表启用闪回数据归档

5)执行查询来确定归档创建的对象

create flushback archive default fal1 tablespace tbs1 quota 10G retention 1 year;

基于recyclebin的闪回删除技术

闪回删除技术:

1)针对非system 表空间

2)适用于通过drop 操作和非purge 的删除对象(包括索引,约束,触发器)

flashback table employees to beforce drop;

基于闪回数据库日志的闪回数据库技术

闪回数据库:把数据库闪回到过去的某一个时间点,针对逻辑故障,或者对相同数据做循环迭代测试。

 

闪回数据库应用场景

闪回数据库:truncate table,多张表都发生非预期的更改,数据库升级中的回退,循环测试

闪回表:drop table(基于回收站)

闪回表:使用错误的where字句对表进行了更新(基于undo)

闪回表:对比当前的和过去的时间的数据(undo)闪回查询

闪回表:比较指定行数据的不通版本(undo)

table and transaction :事务审计,合规,历史数据保留(指定的表空间)

 

实验1

闪回查询

select count(*) from testuser.test_tab as of timestamp sysdate -1/24/60;

查看一分钟前的数据行数(闪回就像时间游戏中追溯)

select count(*) from testuser.test_tab as of timestamp to_timestamp('2023-12-01 12:00:00','yyyy-mm-dd hh24:mi:ss')+1*INTERVAL '1' MINUTE;

查看具体时间周围几分钟的数据状态

闪回版本查询

select versions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operaton,id,name,salary from test_user_tab versions between timestamp <ti> and <t2> wehre id=1;

闪回表

alter table table_name enable row movement;
flushback table test_user.tab to timestamp to_timestamp(略);
同时这个也可以使用
+1*INTERVAL '1' MINUTE;
flushback table test_user.test_tab to before drop;

注意:多租户环境闪回可以只闪回pdb

闪回PDB

复制代码
开启数据库闪回
  1. alter system set db_recovery_file_dest_size=20g;
  2. alter system set db_recovery_file_dest='/home/db/oracle/'

alter session set container=pdb; alter pluggable database pdb close immediate; flashback pluggable database pdb to timestamp to_timestamp();
alter pluggable database pdb open resetlogs;
复制代码

 

 

posted @   蚌壳里夜有多长  阅读(189)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示