数据库误删记录如何恢复

时间:2024-02-19 16:53:20

--原文 

oracle 

1、第一种情况适用于delete删除(一条记录)的方式,利用oralce提供的闪回方法进行数据恢复。

  前提:需要知道删除时间,就算不可以也必须确定准确的删除数据前的时间

  然后利用以下语句可以找回删除的数据,再利用第二条语句将语句恢复到原表(前提原表主键唯一) 

1 SELECT * FROM 表名 AS OF timestamp to_timestamp(\'删除时间点\'\'yyyy-mm-dd hh24:mi:ss\');
2 insert into 表名 (select * from 表名 as of timestamp to_timestamp(\'删除时间点\',\'yyyy-mm-dd hh24:mi:ss\'));

     第二种方法可以通过闪回整个表来恢复误删除的数据,但仅适用于表结构没有发生改变且用户有flash any table权限的情况下

  前提:表结构没有发生改变   和   用户具有  flash  any  table 权限的情况

   

alter table 表名 enable row movement
flashback table 表名 to timestamp to_timestamp(\'删除时间点\',\'frombyte yyyy-mm-dd hh24:mi:ss\')

2、该方法适用于 drop(整个表被删除)的方式

select table_name,dropped from user_tables
select object_name,original_name,type,droptime from user_recyclebin

注意此时的表名称已经被重新命名,table_name和object_name就是回收站中的存放表名,如果管理员此时可以明确原表的名称可以通过

flashback table 原表名 to before drop

语句进行数据恢复,如果不知道原表名称可以直接按照回收站中的表名称将数据恢复回复来,然后通过

flashback table "回收站中的表名(如:Bin$DSbdfd4rdfdfdfegdfsf==$0)" to before drop rename to 新表名

语句就可以重新命名。

3、第三种方法同样利用oracle数据库的闪回功能可以将数据库恢复到过去某一状态,语法如下:

1 alter database flashback on
2 flashback database to scn SCNNO;
3 flashback database to timestamp to_timestamp(\'frombyte 2007-2-12 12:00:00\',\'yyyy-mm-dd hh24:mi:ss\');

 

介绍到这里有朋友发现问题了,oracle数据库提供了可以恢复数据的保障机制,但也不可避免的占用了大量空间,使用drop一个表或者delete数据后空间并不能自动进行回收,如果确定需要删除的数据又不想无谓的占用空间该如何操作呢?我们可以使用以下两种方式:

1、采用truncate方式进行截断。(但不能进行数据恢复了)

2、在drop时加上purge选项:

drop table 表名 purge;

该选项也可以通过删除recyclebin区域来永久性删除表 ,原始删除表drop table emp cascade constraints

purge table emp;

删除当前用户的回收站:

purge recyclebin;

删除全体用户在回收站的数据:

purge dba_recyclebin_frombyte.com;

 

--原文