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

Samira ·
更新时间:2024-11-01
· 783 次阅读

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');
作者:盐城吊霸天



DROP DATABASE 数据 flashback Oracle table

需要 登录 后方可回复, 如果你还没有账号请 注册新账号