【oracle恢复】通过闪回(flahback)找回删除的表

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

oracle误删的表通过闪回(flash back)找回

场景:
数据库版本:11.2.0.4单实例;系统版本:Oracle Linux6.4
子公司联系人反馈,某公司人员对库进行了误操作,导致有六张基础表被误删除,看能否找回相关表,并把相关用户名atist和表名信息发送过来。

解决:
一开始想到使用备份恢复,这个库是每天凌晨1点进行的备份,使用的方式是exp对每个用户分开备份

(此时可以看到用户和密码,当然这样的备份貌似有点不太安全,每个用户的密码都泄露了;11g后其实推荐使用expdp/impdp,相关的参数实在是好得太多更利于理解,而且可以创建一个back用户赋予备份的权限对每个用户备份,这样就不用担心每个用户的密码都泄露),但恢复未成功,因为时间紧急,那还有没有别的方法呢,闪回!!!


■11g闪回有下面几个相关概念:
闪回查询、闪回版本查询、闪回事务查询、闪回表基于undo的保留信息
闪回删除基于recycle回收站机制
闪回数据库基于闪回日志
闪回归档(11g新增);
只保护非系统表空间中的表(即系统表不能使用闪回功能),且表空间必须本地管理,外键将不可以被恢复,索引和约束的名字将会被命名为以BIN开头,由系统生成的名字;
支持在Open状态下开启闪回功能;
开启数据库闪回的前提条件:开启数据库归档
设置两个初始化参数:闪回恢复区大小db_recovery_file_dest_size和闪回恢复区路径db_recovery_file_dest,而这两个参数是有先后顺序的,必须先设置db_recovery_file_dest_size后设置db_recovery_file_dest,否则系统会报错。
恢复数据需登录到删除对象的用户。


实际操作如下:
$ sqlplus / as sysdba
查看是否开启回收站(默认开启,如不开启后面的闪回都不用操作了)
SQL> show parameter recycle
查看是否开启闪回(数据库级别的,默认关闭)
SQL> select name,flashback_on from v$database;

此时只是闪回删除的表操作,不需要开启数据库的闪回,切换到删除表的用户atist(这点需要注意:如果登录到的是sysdba是查看不到atist用户下的回收站的)
SQL> conn atist/密码
查看回收站内容
SQL> show recyclebin
查看到回收站有相关删除的表,准备还原,并且在还原的时候更改表名
SQL> flashback table table_name to before drop rename to table_name_old;
注:此时如果回车站有两个同名的表,默认恢复最后一次删除的表,如果想恢复第一次删除的表,可以根据RECYCLEBIN NAME来恢复:
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T_TEST         BIN$elnypGYGClLgVQAAAAAAAQ==$0 TABLE        2018-11-11:10:12:31
T_TEST         BIN$elnypGYEClLgVQAAAAAAAQ==$0 TABLE        2018-11-11:10:11:56
SQL> flashback table "BIN$elnypGYEClLgVQAAAAAAAQ==$0" to before drop;            #注意这里的表名为第一次删除的recyclebin name

查看表是否还原,再查看表的主键、约束、索引,如果表原来有的话,还原后这些的名称会有一定的变化,
这时候的名称是系统自动生成的,需要手动更改(这就是弊端,不过好过数据丢失。)

最后更改表名
SQL> alter table table_name_old rename to table_name;

猜你喜欢

转载自blog.csdn.net/debimeng/article/details/83956599