Heim >Datenbank >MySQL-Tutorial >恢复oracle中update或delete的数据

恢复oracle中update或delete的数据

WBOY
WBOYOriginal
2016-06-07 14:50:22962Durchsuche

问题描述 比如在开发人员对employee表进行一个update语句,但更新完之后,才发现更新的语句有误,需要撤销刚才的update操作。如(update employee e set e.block='0300100011000000248' wheree.block='0300100011000000240'; 更新了10条数据) 1、如果在很短

问题描述

比如在开发人员对employee表进行一个update语句,但更新完之后,才发现更新的语句有误,需要撤销刚才的update操作。如(update employee e set e.block='0300100011000000248' wheree.block='0300100011000000240'; 更新了10条数据)

1、如果在很短的时间内,可以查询数据库中的versions,记录短时间内的employee表中的update、delete、insert的操作。(时间多长取决于数据库中的相关设置参数)

<pre name="code" class="sql">select versions_xid, versions_operation, versions_starttime, versions_endtime   
from employee   versions  between  timestamp  minvalue  and  maxvalue;


2、如果顺利,可以查到刚才update的语句,查出对应的versions_xid的值,然后查询flashback_transaction_query闪回事务查询表。

如versions_xid的值为'000A0019000214C3'

select  *  from  flashback_transaction_query  where xid ='000A0019000214C3'

如果想要取消刚才的update操作,在数据库中执行查询出来中的UNDO_SQL字段中的sql语句即可

时间条件的查询,如下:

select  * from flashback_transaction_query  where table_name like 'emp%'
where commit_timestamp
<p><span style="color:#666666"> </span><br>
<strong><span style="font-size:18px">3</span><span style="font-size:18px">、如果上面的第2部没有查询出来,可以先查看目前的employee表的数据量是多少,以便和没有update之前的对比一下</span></strong><span style="color:#666666"><br>
 </span></p>
<pre name="code" class="sql">select count(*) from employee

4、可以新生产一个表来备份update之前的闪回的数据(这也取决于数据库的闪回时间、undo的大小)

create table employee_copy
as
select * from employee as of  timestamp to_timestamp('2009-02-16 10:00:00','yyyy-mm-dd hh24:mi:ss')
 

5、查看在update之前的employee表 在update语句中的条件是否一样(比如原来更新语句中的条件是e.block='0300100011000000240',更新了10条),现在查出来也是10条数据,可以把下面10条数据的id查找出来,然后在更新回去。
 

select  *  from employee_copy  e  where e.block='0300100011000000240';

6、查找出来employee的id

<pre name="code" class="sql">select count(*) from employee where report_id in
( '8a8881a71c9e53f5011ca74049d7001b',
 '5F3BA0EA14890024E0437F0000010024', 
'5A6F193A11A820D8E0430A08012120D8',
 '56F9DFC764E0101AE0430A3E3D64101A', 
'8a8881a71cd6ea28011cdf6c372d00a3',
 '8a8881a71df71207011dfc3071730276', 
'8a8881a71df71207011dfc38012b0277', 
'8a8881a71df71207011dfc3f2e50027b', 
'8a8881a71df71207011dfc0d5ef9022b',
 '5DA7E2D9FA2AF06AE0430A080121F06A')


7、更新回来原来的数据

update employee set block='0300100011000000240' where report_id in
( '8a8881a71c9e53f5011ca74049d7001b',
 '5F3BA0EA14890024E0437F0000010024',
 '5A6F193A11A820D8E0430A08012120D8',
'56F9DFC764E0101AE0430A3E3D64101A',
 '8a8881a71cd6ea28011cdf6c372d00a3',
'8a8881a71df71207011dfc3071730276',
'8a8881a71df71207011dfc38012b0277',
'8a8881a71df71207011dfc3f2e50027b',
'8a8881a71df71207011dfc0d5ef9022b',
'5DA7E2D9FA2AF06AE0430A080121F06A')

这样就相当于把原来进行的误操作sql语句撤销了。

8、最后把备份的表删除掉

drop table employee_copy

完毕!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn