– 先备份一下表数据
expdp iemr/123 DIRECTORY=DATA_PUMP_DIR tables=mr_tpl DUMPFILE=mr_tpl_20200616.dmp logfile=mr_tpl_20200616.log
expdp iemr/123 DIRECTORY=DATA_PUMP_DIR tables=xap_basefile DUMPFILE=xap_basefile_20200616.dmp logfile=xap_basefile_20200616.log
– 打开行迁移
alter table iih.bd_udidoc enable row movement;
alter table iemr.xap_basefile enable row movement;
– 查询删除数据的时间点的数据(也就是闪回至该时间点之前的数据)
select * from bd_udidoc as of timestamp to_timestamp(‘2021-03-30 20:20:00’,‘yyyy-mm-dd hh24:mi:ss’);
select * from xap_basefile as of timestamp to_timestamp(‘2020-06-16 20:30:00’,‘yyyy-mm-dd hh24:mi:ss’);
– 执行flashback 闪回
flashback table iih.bd_udidoc to timestamp to_date(‘2021-03-30 20:20:00’,‘YYYY-MM-DD HH24:MI:SS’);
flashback table iemr.xap_basefile to timestamp to_date(‘2020-06-16 20:30:00’,‘YYYY-MM-DD HH24:MI:SS’);
实际生产环境中,一张数据表的操作不只是一个人在操作,系统可能也在不断的写表或者更新表数据,使用闪回技术可能会存在数据的问题。如果删除的数据量比较小发现的时候又有延迟(过了好一会才发现删除错误),可以采用查询到删除前的数据后重新插入数据表中。
查询某个表在某个时间点操作的SQL
例如:在2019年11月21日对表T_SYS_USER进行的DELETE操作的执行的SQL。
–关闭行迁移
alter table iih.bd_udidoc disable row movement;
*回退到某个Log Sequence号
flashback database to sequence=223 thread=1;
*回退完成之后以resetlogs的方式打开数据库
alter database open resetlogs;
*也可以创建一个恢复点
CREATE RESTORE POINT before_changes;
FLASHBACK DATABASE TO RESTORE POINT before_changes;
方式1.使用SQLPLUS
Use an SCN or a time stamp in the SQL version
Example: Flash back the database to a day before using SQL
SQL> shutdown immediate;
SQL> startup mount exclusive;
SQL> flashback database to timestamp(sysdate-1);
SQL> alter database open resetlogs;
方式2.使用 RMAN
Using RMAN, you can flash back to a time stamp, SCN, or log sequence number (SEQUENCE) and thread number (THREAD).
Example:
RMAN> FLASHBACK DATABASE TO TIME = TO_DATE(‘2002-12-10 16:00:00’,‘YYYY-MM-DD HH24:MI:SS’);
RMAN> FLASHBACK DATABASE TO SCN=23565;
RMAN> FLASHBACK DATABASE TO SEQUENCE=223 THREAD=1;