在oracle中,如果不小心drop掉一张表,能不能恢复呢?
DROP TABLE FORM_DESIGNER_USER_NAME;
答案是不一定的(分情况-Oracle数据表对于被drop的表和索引,都会存放在回收站中。所以对于生产的数据库必须设置好回收站功能)在oracle中,当使用命令drop table tablename 命令时,其实不会真正的删除该表,而是把表放到了回收站中(回收站的概念类似windows中的回收站),所以我们可以通过flashback命令来恢复drop掉的表,如果关闭了回收站功能或者回收站被清空了就不好处理啦。
实验drop
我们先创建一张表
Create table testuser (
Id int,
Name varchar(20)
)
再插入几条数据
insert into testuser (id,name) values(1,'a');
insert into testuser (id,name) values(2,'b');
commit;
drop table testuser ;
表已删除。
查询oracle回收站表
select * from recyclebin ORDER BY CREATETIME DESC ;
找到被删除的表名有操作时间。如果想查询这张表可以用recyclebin 表里面的OBJECT_NAME字段加双引号。
恢复
FLASHBACK TABLE "BIN$YAuvlQWzQA+YBLx0RbotCQ==$0" TO BEFORE DROP;
查询
如果drop表之后、有重新建了一张名称一样的表、需要先给新建的表重命名之后在进行恢复。
--修改目前已经重建的表名称
ALTER TABLE testuser RENAME TO testuser_BAK;
如果drop表之后、有重新建了一张名称一样的表结果不一样了、可以先查询出来删除的表把数据导出来在导入到目标表中。
实验delete
查询表中数据
#删除ID=1的数据
delete from testuser2 where id = '1';
注意如果删除数据后,对表做了ddl操作(更改列的长度等,但是根据测试,增加一列不会报错),然后想闪回,则报错,不能闪回。
首先获取删除数据的时间点、删除时间点字段是:FIRST_LOAD_TIME
select * from v$sql where sql_text like '%table_name%' ;
根据结果中的sql_text内容,找到delete执行语句对应的删除时间点,执行下面语句查询出删除的数据。
select * from table_name as of timestamp to_timestamp(‘删除时间点’,‘yyyy-mm-dd hh24:mi:ss’)
where (删除时的条件)
检查数据无误后,执行下面操作,将数据插回原表中。注意主键不重复
insert into table_name
select * from from table_name as of timestamp to_timestamp(‘删除时间点’,‘yyyy-mm-dd hh24:mi:ss’)
where (删除时的条件)
这里不小心执行了二次、导致插入了二条。