查询oracle 数据库中回滚段中一个时间点被修改的表数据并还原表中原来数据

利用下面的SQL就可以查处最近更改的数据。

SQL> SELECT ID,NAME,VERSIONS_STARTTIME,VERSIONS_ENDTIME,VERSIONS_OPERATION
FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE WHERE
VERSIONS_STARTTIME IS NOT NULL ORDER BY VERSIONS_STARTTIME DESC;

通过以上小实验可以看出,VERSIONS_STARTTIME是数据被修改的起始时间,VERSIONS_ENDTIME是数据被修改后新数据的有效时间,也就是VERSIONS_STARTTIME和VERSIONS_ENDTIME时间段内,这条数据再没被修改过,如果VERSIONS_ENDTIME为空,就说明这天记录从VERSIONS_STARTTIME时间起再没被修改过。VERSIONS_OPERATION是修改状态,I代表INSERT,U代表UPDATE,D代表DELETE。此时如果想回滚INSERT的数据,只需要DELETE反向操作即可,如果想回滚UPDATE操作,将数据反向UPDATE回去即可,比如本实验已经可以看到进行UPDATE操作的是NAME为史波和孙书祯的两条记录,而且也可以看到进行UPDATE之前的数据他们的性别是男,所以只需要在做个反向UPDATE,将性别该为男即可实现回退,如果要回滚DELETE操作,同样做个INSERT操作,将删除的数据在插回去即可。注:此SQL只能查询到回滚段内的信息,超出回滚段范围这个SQL就无能为力了,需要借助LOGMGR工具挖掘日志了。(详见:http://www.cnblogs.com/wzmenjoy/archive/2012/01/17/2367636.html)

下面是我写的一个存储,用来还原一个表pub_goods中某个时间点做的数据的更新:

create or replace procedure supplytaxrate_to_his_withdate(hisdate in date) is

cursor c_modifiedgoods is
SELECT distinct goodsid FROM pub_goods VERSIONS BETWEEN TIMESTAMP MINVALUE AND
MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL and VERSIONS_STARTTIME > hisdate;

r_modifiedgoods c_modifiedgoods%rowtype;

begin

open c_modifiedgoods;
loop

fetch c_modifiedgoods into r_modifiedgoods;
if c_modifiedgoods%notfound then
exit;
end if;

UPDATE pub_goods aa
SET (supplytaxratebak) = (select a.supplytaxrate
from pub_goods VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE a,
(SELECT goodsid,
min(VERSIONS_STARTTIME) VERSIONS_STARTTIME
FROM pub_goods VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
WHERE VERSIONS_STARTTIME IS NOT NULL
and VERSIONS_STARTTIME >
to_date(‘2017-07-01‘,
‘YYYY-MM-DD‘)
group by goodsid) b
where a.goodsid = b.goodsid
and a.VERSIONS_STARTTIME = b.VERSIONS_STARTTIME
and a.goodsid=r_modifiedgoods.goodsid)
where aa.goodsid=r_modifiedgoods.goodsid;
end loop;
commit;
close c_modifiedgoods;

end supplytaxrate_to_his_withdate;
/

上面的存储中,我是将修改的字段的值还原到一个我新增的bak字段中了,具体如何还原可视情况而定,具体关于insert和delete操作同样可以通过sql查询出数据并做还原。

时间: 2024-08-10 02:25:35

查询oracle 数据库中回滚段中一个时间点被修改的表数据并还原表中原来数据的相关文章

Oracle Undo回滚段深入解析_超越OCP精通Oracle视频课程培训15

oracle视频教程目标 Oracle视频教程,风哥本套oracle教程培训学习oracle数据库UNDO的作用及相关数据字典,UNDO自动管理,DDL与DML操作与UNDO的关系,UNDO表空间满了怎么办?模拟ora-01555,UNDO表空间损坏怎么处理?Undo段头/回滚块/事务槽解析,UNDO回滚段头的深入分析,事务提交前后oracle内部操作?深入分析前镜像及一致性读. 适用人群 IT相关从业人员.Oracle数据库技术人员.想加工资的.想升职的都可以. 视频在线学习地址: http:

Oracle回滚段的概念,用法和规划及问题的解决

回滚段概述  回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值).回滚段的头部包含正在使用的该回滚段事务的信息.一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回滚信息. 回滚段的作用  事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值. 事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,ORA

简单了解Oracle的回滚段

因为上一次研究了Oracle的事务一致性,中间查阅资料的时候,看到这个地方与回滚段有关.所以就罗列了以下简单的知识.更为深层次的就不再深挖了,个人感觉对于事务的一致性和隔离级别是开发经理应该了解的,但是回滚段的具体机制应该是DBA的学习范畴了. 回滚段(ROLLBACK SEGMENT)的作用: 回滚段是在事务中间过程中,将修改前的状态记录下来,记录的过程中加上类似时间戳的scn.它的主要作用有两个: 当事务出现错误回滚的时候,原始数据可以从回滚段中找回. 实现读一致性.当读操作读取到某一行,发

查询Oracle 数据库中带有lob字段的某一个表的大小

注意:由于lob字段有独立的lob segment来存储,故对于带有lob字段的表,不能仅仅查询dba_segments. 以下脚本来自: How to Compute the Size of a Table containing Outline CLOBs and BLOBs[Article ID 118531.1] 经过修改:改为了NVL(SUM(S.BYTES),0) SQL> col "TOTAL TABLE SIZE" format 99999999999999 ---

关于调用方有事务,被调用的SP中也有事务,在嵌套SP中回滚代码的报错处理,好文推荐

SQL报错异常:Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0. --首先明确一点,在SQL中开启事务时,Begin Tran时,@@TRANCOUNT会加1,Commit Tran时@@TRANCOUNT会减1,但是当ROLLBACK TRAN时会把@@TranCount直接设置

mysql5.6和mysql5.7分配undo回滚段的区别

1.mysql5.7中分为2类:临时表空间回滚段和普通回滚段. 2.mysql5.6中没有区分. As of MySQL 5.7.2, 32 undo logs are reserved for use by temporary tables and are hosted in the temporary table tablespace (ibtmp1). To allocate additional undo logs for data-modifying transactions that

使用PLSQL Developer和DbVisualizer查询oracle数据库时出现乱码

使用PLSQL Developer和DbVisualizer查询oracle数据库时,出现查询数据中文乱码情况. 查看了一下数据库编码格式select * from v$nls_parameters; 查看编码值为WE8ISO8859P1.而电脑环境变量NLS_LANG的值为AMERICAN_AMERICA.ZHS16GBK.更改为AMERICAN_AMERICA.WE8ISO8859P1之后重启工具就好了.如果没有此环境变量,可以新建一个,将编码值更改为一致. 我的机器到此就好使了,据说有的需

Undo(回滚段)对应的系统参数

回滚段表空间,为什么叫Undo,而不是rollback?我们对数据库操作理解为do,所以反向操作就是undo,通过对应的undo就可以达到回滚目的. 第一行,undo_management 为AUTO表示自动回滚段管理,空间不够时自动扩展. 第二行,undo_retention 为900表示DML需要记录前镜像,当commit后,回滚段前镜像被打上了可以覆盖重新使用的标记,但要在900秒后才可以. 第三行,UNDOTBS1为回滚段表空间的名字 原文地址:https://www.cnblogs.c

查询ORACLE数据库操作记录

代码: SELECT a.First_Load_Time,        a.Sql_Text,        s.Sid,        s.Serial#,        s.Program --,        ,        a.* --       Utl_Inaddr.Get_Host_Address(s.Terminal) Ip   FROM V$sqlarea a, V$session s  WHERE s.Sql_Address(+) = a.Address    AND U