oracle 表数据删除后恢复还原

oracle 表数据删除后恢复还原oracle数据库表数据还原

##数据库表还原到某时间点

还原语句

使用如下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;	

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38810.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注