oracle 表数据删除后恢复还原

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34846877/article/details/79615736

数据库表还原到某时间点

还原语句

使用如下sql语句就可以还原整张表格数据到某个时间点,前提条件:该表的表格式没有变动(如:字段的修改等)

ALTER TABLE 表名 ENABLE ROW MOVEMENT;
FLASHBACK TABLE 表名 TO TIMESTAMP TO_TIMESTAMP('2018-02-27 09:00:00', 'yyyy-mm-dd hh24:mi:ss');
  • 测试基础数据
create table DEMO
(
  id        VARCHAR2(10) not null,
  dsc       VARCHAR2(100),
  pid       VARCHAR2(10),
  is_delete NUMBER default 0 not null,
  sal       NUMBER
);

insert into demo (ID, DSC, PID, IS_DELETE, SAL)
values ('00013', '河南', '00001', 0, null);
insert into demo (ID, DSC, PID, IS_DELETE, SAL)
values ('00022', '香港', '0001', 0, 10);
insert into demo (ID, DSC, PID, IS_DELETE, SAL)
values ('00001', '中国', '-1', 0, null);
insert into demo (ID, DSC, PID, IS_DELETE, SAL)
values ('00011', '陕西', '00001', 0, 400);
insert into demo (ID, DSC, PID, IS_DELETE, SAL)
values ('00012', '贵州', '00001', 0, 11);
insert into demo (ID, DSC, PID, IS_DELETE, SAL)
values ('00111', '西安', '00011', 0, null);
insert into demo (ID, DSC, PID, IS_DELETE, SAL)
values ('00112', '咸阳', '00011', 0, null);
insert into demo (ID, DSC, PID, IS_DELETE, SAL)
values ('00113', '延安', '00011', 0, null);
commit;

以下两种还原表数据方式,可以正对于某个特点条件下删除的数据恢复

1. select…as of timestamp

--1.删除id为'00013'的这条数据
DELETE FROM demo de WHERE de.id = '00013';
COMMIT;
--查询是10分钟前id为'00013'的这条数据
SELECT * FROM demo AS OF TIMESTAMP SYSDATE-10/1440 WHERE ID = '00013';
--插入刚才删除id为'00013'的这条数据
INSERT INTO demo SELECT * FROM demo AS OF TIMESTAMP SYSDATE-10/1440 WHERE id = '00013';
commit;
  • 注解说明

    SYSDATE-10/1440
    SYSDATE-10/1440是啥意思,1440又是怎么来的?

    首先60(分)×24=1440,这样就计算出一天拥有多少分钟,SYSDATE是系统函数,用来取得当前的系统时间(以天为单位),SYSDATE-10/1440,得出的就是距当前时间10分钟前的记录了

2. select…as of scn

--该语句获取scn值2948488
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual;
SELECT * FROM demo de WHERE de.id = '00013';
--1.删除id为'00013'的这条数据
DELETE FROM demo de WHERE de.id = '00013';
COMMIT;

--查询是scn值为2948488时 表中id为'00013'的这条数据
SELECT * FROM demo AS OF SCN 2948488 WHERE id = '00013';

--插入刚才删除id为'00013'的这条数据
INSERT INTO demo SELECT * FROM demo AS OF SCN 2948488 WHERE id = '00013';
COMMIT;
  • 注解说明

    SCN 2884883
    SCN 2884883是啥意思呢? 2884883是怎么来的?

    既然是基于SCN的查询,我们首先就需要得到SCN,这里我们通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函数来获取Oracle当前的SCN,之后再执行数据的修改操作。
    如何获取Oracle数据库当前的SCN?获取当前SCN的方式非常多,除了使用DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函数外,也可以通过查询V$DATABASE视图中的CURRENT_SCN列获取。不过,不管是通过查询视图,或是通过过程获取,操作的用户都必须拥有要操作对象的访问权限。
    SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual;


  • 转换说明
    在Oracle数据库中也可以手动进行时间和SCN的相互转换,Oracle提供了两个函数SCN_TO_TIMESTAMP和 TIMESTAMP_TO_SCN专门干这个
SELECT timestamp_to_scn(SYSDATE) FROM dual ;
    SELECT to_char(scn_to_timestamp(2884883),'yyyy-mm-dd hh:mm:ss') FROM dual;  

猜你喜欢

转载自blog.csdn.net/qq_34846877/article/details/79615736