Oracle找回15分钟前数据,Oracle数据库误操作的数据恢复

在数据操作过程中,经常会出现一些误操作。比如,误删除数据,误删除表,误update表等。数据库里各种误操作都是可以恢复的。

这里只简单的讨论下关于几种恢复方式

1. 对于drop操作的恢复

1.1操作时间在15分钟以内

如果删除表的操作时间与当前时间间隔不超过15分钟,可以执行如下命令恢复:

Flashback table TABLE_NAME to before drop;

1.2操作时间在15分钟以上,且回收站没有被清空

首先确认被删除的表名,其次确认用户。在无法确认以上需求时,用下面语句查看所有被删除的表

SELECT owner, object_name, original_name, droptime

FROM DBA_RECYCLEBIN

WHERE operation = ‘DROP’

AND type = ‘TABLE’

AND original_name LIKE ‘%\&table_name%’;

–确定以上要求后,使用下面语句查看出被删除以后的对象名

SELECT owner, object_name, original_name, droptime

FROM DBA_RECYCLEBIN

WHERE

AND original_name = ‘\&table_name’

AND owner = ‘\&user’;

–得出表被删除后的对象名,开始恢复被删除表数据

CREATE TABLE

AS

SELECT * FROM sns.”"

1.3 表删除超过15分钟,且回收站被清空

这种情况下的恢复工作是非常非常麻烦的。这里分两种方式分别说下思路:

RMAN方式:

将RMAN备份恢复到别一个数据库上,从已经恢复的数据库中将表导出(EXP、expdp),再导入主库

EXP/IMP(EXPDP/IMPDP)方式:

imp user/password file=&path/file_name.dmp tables=’&table_name’ fromuser=’&from_user’ touser=’&TO_USER’

这样恢复,只能恢复到上次备份的状态。从最近一次备份到被删除时的数据,是无法恢复的。

2. 对于Delete操作的恢复

对于delete操作,如果开启了归档模式,会被记录在归档日志中。所以,我们可以通过归档日志中的记录来恢复。但是归档日志是二进制文件,我们看不懂其中的内容。所以要通过Oracle提供的特殊工具来分析日志、查看分析内容,恢复数据。这个工具就是logmnr。如果没有开启归档日志,很高兴的通知你,这个数据恢复不了了(如果没有其他备份)。

具体操作命令如下:

2.1 确认表名、用户名

可通过相关工具人员询问得知。如果提供信息的工作人员,对表不熟悉,只能提供一个大概的印象,那么,需要在数据库中进行确认,语句如下

SELECT owner, table_name

FROM dba_tables

WHERE table_name LIKE ‘%&table_name%’;

2.2 确认对应的归档日志

为什么要进行这一步操作呢?很简单,因为归档日志是会进行切换的。良好状态下,日志组切换频率为15分钟/次。语句如下:

–查看视图结构

desc V$ARCHIVED_LOG;

–确保日志格式能将时间完全显示

alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’;

通过时间字段查找操作日志记录的归档日志文件

select name,first_time from V$ARCHIVED_LOG where FIRST_TIME > sysdate -1;

2.3 安装logMiner,需要运行以下两脚本:

@’\$ORACLE_HOME/rdbms/admin/dbmslm.sql’;

@’\$ORACLE_HOME/rdbms/admin/dbmslmd.sql’;

实例:

SQL> @’\$ORACLE_HOME/rdbms/admin/dbmslm.sql’;

Package created.

Grant succeeded.

Synonym created.

SQL> @’\$ORACLE_HOME/rdbms/admin/dbmslmd.sql’;

Package created.

Synonym created.

2.4 检查utl_file_dir参数

Utl_file_dir是utl_file包用于进行I/O传输的。Logmnr工具调用到这个包。

Show parameter utl_file_dir;

Alter system set utl_file_dir=’/u01/logmnr’ scope=both;

shutdown immediate;

startup;

2.5 创建数据字典文件

sqlplus / as sysdba;

Execute dbms_logmnr_d.build(dictionary_filename => ‘dict.ora’,dictionary_location => ‘/u01/logmnr’);

2.6 装载日志文件

execute dbms_logmnr.add_logfile(LogFileName => ‘/data1/oracle/archivelog/epmdb/1_4449.dbf’,Options =dbms_logmnr.new);

execute dbms_logmnr.add_logfile(LogFileName => ‘/data1/oracle/archivelog/epmdb/1_4450.dbf’,Options =dbms_logmnr.addfile);

2.7开始分析日志

execute dbms_logmnr.start_logmnr(startTime => to_date(’ \&start_time′,’yyyy-mm-dd hh24:mi:ss’),endTime =to_date(’\&end——time′,’yyyy-mm-dd hh24:mi:ss’),DictFileName =’/data1/dict.ora’);

2.8 获取分析日志

create table &data_recovery as select * from v$logmnr_contents;

select timestamp, seg_name, operation, sql_redo, sql_undo

from &data_recovery

where username = ‘&user_name’

and seg_name = ‘&table_name’

and operation = ‘DELETE’

2.9 通过上面查询出来的undo语句将数据还原!

3. 对于update操作的恢复

与第二部分中的恢复过程类似。

不过,2.8 中select 语句中的operation = ‘UPDATE‘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值