前言:上周给大家介绍了在Oracle数据库中怎么利用“闪回技术”将数据进行恢复,但是存在一个问题:指定scn或者timestamp时间点之后的数据统统丢失。那到底有没有一种两全其美的办法呢?今天给大家介绍另外一种方式,既能恢复删除前的数据,又能保留原有的数据。

书接上文,上回我们对删除的数据进行了闪回操作,并执行:alter database open resetlogs,打开数据库;这时候数据库已经回到我们指定的时间点。导致结果:指定scn或者timestamp时间点之后产生的数据统统丢失。
我们看看如果操作能够两全其美的保留数据?
操作步骤:
1、执行完闪回操作之后,输入命令:alter database open read only以只读模式打开数据库;
2、通过逻辑导出的方式将误操作涉及表的数据导出;这里的话我们可以通过
连接数据库可视化工具PL/SQL,我们可以很容易的导出该表的逻辑导入语句(另一种方式是数据泵方式):
INSERT INTO TEST(A,B,C) VALUES('PC','ORC',10);
INSERT INTO TEST(A,B,C) VALUES('IPHONE','IOS',20);
INSERT INTO TEST(A,B,C) VALUES('ANDROID','AD',30);
3、执行recover database命令,修复数据库到闪回操作前的状态;
4、再通过逻辑导入的方式,将之前误操作的表数据重新导入,这边采用执行步骤3中的导入语句。
5、验证当前数据库中的TEST数据,如下图,已有4条数据(包含闪回之前以及最开始的数据),至此闪回数据库操作已成功。

最后给大家介绍下闪回技术中几条常见的命令:
数据库是否开启归档和闪回功能
select log_mode,flashback_on from v$database;
获取数据库当前SCN
select dbms_flashback.get_system_change_number scn from dual;
查询数据库最大可闪回的时间点及SCN
select oldest_flashback_scn,to_char(oldest_flashback_time,'YYYY-MM-DD
HH24:MI:SS') from v$flashback_database_log;
SCN和时间戳相互转化
SCN转化成时间戳
select scn_to_timestamp(122037263) scn from dual;
时间戳转化成SCN
select timestamp_to_scn(to_date('2021-04-12,11:20:00','yyyy-mm-
dd,hh24:mi:ss')) scn from dual;

以上就是今天给大家介绍的Oracl数据恢复的第二部分,将删除前后的数据完整的恢复回来,对整体数据没有造成影响。
喜欢小知的话请不要忘了关注,点赞,转发!