ORACLE恢复一个数据表的方法

今天提交给客户方一个sql脚本去跟新历史数据,结果客户那边的部署人员犯了一个错误,直接拿系统账号去部署,结果第一段代码没有执行成功,结果第二段代码却执行成功了,并且已经提交了的,。。。。由于事前没有备份第二段更新表的数据,导致恢复标的数据非常困难,网上查找了半天,现在将找到的办法归纳如下:

1. 执行如下SQL将test_temp表中的数据恢复到2016年7月7号,即脚本被执行之前时间点。

 注意,这里一定要先删除全部数据,否则可能会导致数据重复

1 SELECT * FROM DQAQTSW
2  AS OF TIMESTAMP TO_TIMESTAMP(‘2016-07-07 00:00:00‘,
3  ‘yyyy-mm-dd hh24:mi:ss‘);
delete from test_tmp;
insert into test_tmp select *
    from test_tmp as of timestamp to_timestamp(‘2014-05-28 11:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)

commit;

或者得到sync的节点时间,基本和第一种方法是一致的。

1 select timestamp_to_scn(to_timestamp(‘2014-05-27 11:00:00‘,‘YYYY-MM-DD HH:MI:SS‘))
2 from dual;
3 或 select * from sys.smon_scn_time  order by time_dp desc;
4 得到结果 71547785 然后
5  insert into test_tmp select * from test_tmp AS OF SCN 71547785

注意:

  truncate后的数据是无法恢复的

  truncate table test_temp;

2. 下面看第三种(这种方法需要更高的管理权限,否则没法查询回复数据)

  

select * from v$sqlarea ;
SELECT * FROM v$session;
SELECT * FROM v$session a,v$sqlarea b
WHERE b.ADDRESS = a.PREV_SQL_ADDR;

通过这条语句找到的数据是有限的 因为有的用户可能已经断开和oracle的连接了

如果你看到以上方法能够解决你的问题,哪就不要犹豫,快点动 手吧,因为如果动手晚了,之前的操作的数据记录可能就要被覆盖了,因为存储不大的话要被循环使用的

(以上博客很多引用来自  http://vvv-110.iteye.com/blog/2072702 )

时间: 2024-11-05 10:36:56

ORACLE恢复一个数据表的方法的相关文章

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT is SELECT ID,UNAME from g_users where utype=2 and STATUS>-1; begin for c in TABLE_DEPT loop INSERT INTO G_KNOWDOCRIGHT(RID,DIRID,DOCID,USERID) VALUES(SYS

oracle表空间查询维护命令大全之中的一个(数据表空间)史上最全

表空间是数据库的逻辑划分,一个表空间仅仅能属于一个数据库. 全部的数据库对象都存放在建立指定的表空间中.但主要存放的是表, 所以称作表空间.在oracle 数据库中至少存在一个表空间.即SYSTEM的表空间.一个表空间能够包括多个段.以及区.以及最小的块,同一时候也能够包括多个数据文件(物理结构). oracle 能够依据表空间对相关的用户配额以及磁盘空间都有极大的保护作用,并且还能够灵活的存放.同一时候也能够把不同的数据文件分开存放,保证不同数据文件的安全行. 所以在一般数据创建后,就会创建相

Oracle导出数据结构和数据表的方法

1.PLSQL导出数据结构(数据表.序列.触发器.函数.视图) 1)在左侧 点击tables 2)Tools-->Export User Objects 3)红色1 是你要选择导出的表,红色2 是你要导出到.sql文件 存放到自己电脑位置,红色三就是导出的意思,做完这一步就已经把数据表的结构导出来了 2.PLSQL导出表数据 1)在左侧 点击tables,然后 Tools-->Exports Tables 2)注意红色的部分,导出文件后缀为.sql

多用户操作一个数据表时的并发性操作

事务处理(多用户同时操作一条信息时是用-并发) 在c/s或多层中,如果两个用户同时打开一条记录,修改后提交会产生更新冲突: 据说办法有二:1.打开同时锁定表的记录 2.浦获错误,撤消其中一个用户的修改,但是很少见到具体实现的代码:请大家告诉具体的代码怎么写: 1.打开时如何锁定一条记录? 2.如何扑获更新错误?在delphi中调试时会报“该记录读出后已经被再次修改”,而在运行时如何判定错误为更新冲突?因为更新时其他的错误如输入不合法等也可能报错,如何把更新冲突和其他的分开? ==========

分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

1:MSSQL SQL语法篇: BULK INSERT [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] FROM 'data_file' [ WITH ( [ [ , ] BATCHSIZE = batch_size ] [ [ , ] CHECK_CONSTRAINTS ] [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_pag

linux 通过scp 复制备份恢复mysql数据表

最近客户有个需求,小弟对于运维的东西也是半瓶醋,所以就果断的摸索了下.折磨了一个晚上终于算是搞定了.因为是两个不同的服务器,本来想用ftp,无奈小弟不是很熟悉,所以就用了scp,但是scp有个问题就是要输入密码才能复制,这下把小弟急坏了,那我这shell脚本咋办, 我的需求是我要每天定时导出三个表,然后通过scp复制到另外一台服务器上,再恢复这三个表的数据. 俗话说,家事找度娘,小弟就翻阅了度娘的衣柜,终于算是找到了件合身的衣服. 该文章链接是这个http://blog.csdn.net/xif

发现Navivat for MySQL有一个数据表分组功能,用起来很方便!

今天用Navivat for MySQL时,发现原来Navivat for MySQL还有这样一个功能,可以对数据表进行分组,这样找起表来就方便多了.一直用SQL Server的时候就希望能有这样的功能,大量的表都混在一起确实很让人抓狂,能有个标记或者分组这样多好,微软也多学习一下.

【SQL Sever】将SQL Sever中的一个数据表的数据导出为insert语句

例如:这SQL   Sever中的一张数据表,想要将这张数据表中的数据  转化成一个一个的insert语句存储在txt的文档中,那么不论走到那里这个insert语句一执行,我们就能将这个数据表中的数据插入到另一个地方了. 1>在新建查询中,创建一个对象,这个对象就是用来产生这个对象的,名字叫proc_insert,我们可以创建多个不重名的对象,当然也可以删除这个对象. 1 create proc proc_insert (@tablename varchar(256)) 2 as 3 begin

Oracle 函数 “判断数据表中不存在的数据,才允许通过”

1 create or replace function mca_detail_material_val(p_material_code VARCHAR2, --实参 2 p_material_name VARCHAR2, 3 p_mca_no VARCHAR2 4 ) 5 RETURN varchar2 AS 6 7 --物料编码/名称的验证,数据表(MATERIAL)中 不存在 该物料编码/名称,允许通过,填其他值都不允许通过 8 9 v_count1 NUMBER; -- 形参 10 v_