Oracle对于误删误操作的数据进行恢复(flashback query、flashback drop、flashback table、flashback database)

Oracle对于误删误操作的数据进行恢复。
日常工作中难免遇到自己或者别人误操作、删除、修改了数据库的数据。此时我们该如何恢复数据呢。
 
1、我们可以应用Flashback Query查询过去的数据
Flashback Query这一特性,最常被应用的就是修复误操作的数据了。注意,这并不是说Flashback Query能够恢复数据。Flashback Query本身不会恢复任何操作或修改,也不能告诉你做过什么操作或修改,实际上Flashback Query特性实际应用时,是基于标准SELECT的扩展,借助该特性能够让用户查询到指定时间点的表中的记录,相当于拥有了看到过去的能力,至于恢复,SELECT的结果都出来了,难道还不懂如何执行INSERT。
注意: Flashback Query查询过去的数据仅对delete 等dml语句有效,如果是通过truncate更改了数据是无法使用 Flashback Query查询过去的数据的
下面举个例子:
首先我准备了一张表,里面有两条数据。
 
此时我们执行delete语句 将数据删除。
 
 
使用flashback query查询
select * from O_MCHT_KEY_API_BAK as of timestamp to_timestamp('2020-03-13 11:00:57', 'yyyy-mm-dd hh24:mi:ss');
 
我们可以看到使用flashback query指定时间点为2020-03-13 11:00:57,可以查询到当时的数据是什么样,这个时候我们就可以把这两条数据重新复制出来插到表里,这样就完成了数据恢复。
注意: flashback query有时效性,太久之前的数据会被清除。
如果我们drop了表,该如何恢复呢?
这里我们先把表drop掉,使用查询可以看到,表已经不存在
 
 
2、我们可以应用Flashback table恢复被drop操作的表
这时我们使用flashback query是无法查询到表的原来数据,此时可以使用flashback table。
flashback table O_MCHT_KEY_API_BAK to before drop;

再执行查询之后我们可以看到数据已经恢复成功。

 
 
当然flashback tabloe也可以用在对已经delete了的数据进行恢复。
 
此时我们先删除一行数据,然后执行
flashback table O_MCHT_KEY_API_BAK to timestamp to_timestamp('2020-03-13 11:00:57', 'yyyy-mm-dd hh24:mi:ss');

可以看到,此时恢复报错,提示[72000][8189] ORA-08189: 因为未启用行移动功能, 不能闪回表

这里只需要给对应的表开启行移动功能即可。
//开启表行移动功能
alter table T_TERM_MCHT_INFO enable row movement;
 
再次执行
flashback table O_MCHT_KEY_API_BAK to timestamp to_timestamp('2020-03-13 11:00:57', 'yyyy-mm-dd hh24:mi:ss');

可以看到被删除的一条记录已经恢复成功了。

 
 
3、我们可以应用Flashback table恢复被drop操作的表(数据被delete了,且!!新增字段表结构被改变!!!)
delete完数据之后,我们加了一列,此时再执行flashback quert 以及flashback table
这里执行flashback query与falshback table 均可以恢复,但是新加的列被使用null填充。
次执
4、当表里的数据被delete了,且!!删除 字段- - - - 表结构被改变!!!
为了模拟这种情况,首先我们将这个表还原成原始状态并插入两条记录。
过5分钟,我们删除表中一列,然后再按flashback query或者flashback table的方式恢复。执行完系统报错:[72000][1466] ORA-01466: 无法读取数据 - 表定义已更改
因为系统闪回的数据已经跟当前状态的表不一致了。
 
此时如果要恢复之前的数据只能使用rename的方式,即将以前的数据按以前的表结构,恢复到另一张新表中,具体操作如下:
--将O_MCHT_KEY_API_BAK闪回并将数据转存到另一张表:O_MCHT_KEY_API_BAK_1
flashback table O_MCHT_KEY_API_BAK to before drop rename to O_MCHT_KEY_API_BAK_1;
我们可以看到原始的数据已经被回复到我们rename之后的一张新表中。
 
5、当表里的数据被truncate了,只能通过flashback database来恢复
如果表被truncate了,那么flashback query、flashback table都没用了
直接通过flashback database来恢复
要使用flashback database 首先得确保FLASHBACK 是打开的,也就是下面你的语句 要返回YES
 
在FLASHBACK是打开的前提下,此时使用以下命令就能重新恢复。如果flashback没有打开,且你已经truncate table,那么恭喜你,找DBA吧,这是你跟他增进感情的绝佳机会!
flashback database to timestamp to_timestamp('2020-03-13 14:31:26', 'yyyy-mm-dd hh24:mi:ss');
 
 
 

猜你喜欢

转载自blog.csdn.net/qq_23974323/article/details/104841424