您的当前位置:首页正文

Oracle数据库数据丢失恢复的几种方法总结

2023-09-02 来源:九壹网
Oracle数据库数据丢失恢复的⼏种⽅法总结

根据oracle数据库的特点和提供的⼯具,主要⽅法有以下⼏种⽅法:1. 利⽤逻辑备份使⽤import⼯具丢失数据的表

2. 利⽤物理备份来通过还原数据⽂件并进⾏不完全恢复3. 利⽤dbms_logmnr包从redo log⽂件中恢复4. 利⽤flashback特性恢复数据前提

为了⽅便使⽤⽅法的介绍,上述恢复⽅法都将基于以下场景进⾏:系统管理员在前⼀天晚上11点⽤export对数据库做了全库逻辑备份,然后对所有数据⽂件进⾏了热备份。第⼆天上午10点,系统管理员在修改表TFUNDASSET的数据时,由于修改语句的条件写错了,导致⼀批记录(⼏千条)的ztm字段被修改成了错误的值,⽽且已经提交。这个表是资产表,相对⽽⾔数据变化不频繁。

⼀、利⽤逻辑备份使⽤import⼯具恢复丢失的数据

export/import是oracle提供的⽤于对数据库进⾏逻辑备份的⼯具。该⼯具适⽤于备份那些数据量不⼤、业务量不多的数据库系统。因为如果在前⼀天晚上11点⽤export做了逻辑备份,那么当今天上午10点数据库意外崩溃时,从备份起到数据库崩溃的这段时间⾥的数据修改操作(包括DDL和DML)都会丢失。如果丢失数据内的表上的数据是相对⽐较稳定,也就是说该表上基本没有DML操作,例如标准代码表、分区表⾥的历史数据,那么采⽤import来导⼊该表可以⽐较完整的恢复数据。如果该表是经常变化的业务表,那么这些丢失的数据只能根据业务情况从纸质记录恢复,或者其他途径恢复。

▲⽰例如下:这个表是⼀个资产表。相对来说,今天系统运⾏中修改的数据较少,丢失的数据量可以承受或者可以从别的途径恢复。那就可以⽤import来恢复。⽅法⼀:

1、把这个表的数据备份到另⼀个表:2、删除该表的记录:3、执⾏下⾯的命令:

这个命令中在关键字tables中指定需要导⼊的表名字,ignore=y表⽰忽略表已经存在的错误。4、导⼊结束后,检查表中的记录,并⽤适当的⽅法恢复当天的修改。⽅法⼆:

1、 把需要恢复的表导⼊到另⼀个⽤户下⾯:2、检查数据以后,把原表记录删除:3、然后从另⼀⽤户表中插⼊回去:4、 数据量⽐较⼤时可以采⽤如下⽅法:

⼆、利⽤物理备份来通过还原数据⽂件并进⾏不完全恢复

如果数据库运⾏在归档模式下,那么可以通过使⽤以前的数据⽂件备份进⾏还原,然后利⽤归档⽇志进⾏前滚,直到回滚到错误操作的时间点前,然后重置⽇志⽂件打开数据库。可以通过下列⽅法确认是否是运⾏在归档模式:

如果是如上所⽰,那么就是运⾏在归档模式了。

▲假定在前⼀天晚上11点做了全库物理备份,那么可以考虑如下恢复:1、关闭数据库:

由于数据库的不完全恢复必须在⼀个关闭的数据库上实施,利⽤⼀个旧的数据库的备份还原,然后⽤⽇志根据需要逐步前滚,⽽不能还原⼀个新的备份,再回退到某个时间点。通知各客户端数据库将关闭,然后发出:

数据库已经关闭。已经卸载数据库。ORACLE 例程已经关闭。2、确定错误操作的时间:

可以根据操作员的估计来确定不完全恢复需要前滚停⽌的时间,也可以利⽤LogMiner来分析⽇志⽂件(这个⼯具将在后⾯介绍),找出错误操作的准确时间。3、还原数据⽂件:

先对当前的数据库⽂件进⾏备份,然后再⽤以前的最近⼀次备份覆盖现有数据⽂件。注意:不覆盖现有的控制⽂件。4、基于时间点恢复,启动数据库到装配状态:

这样数据库就恢复到了2015年10⽉20⽇的9点58分零秒。然后再利⽤业务资料补充这段时间内的数据。三、利⽤dbms_logmnr包从log⽂件中恢复

这个包是由Oracle提供,与dbms_logmnr_d包配合使⽤可以⽅便地分析联机⽇志⽂件和归档⽇志⽂件,从这些⽇志⽂件中提取出所有对数据库的更改操作。

在使⽤这个包之前,需要先做⼀些设置和修改:

1、打开initorcl.ora,修改初始化参数utl_file_dir,设置dbms_logmnr_d包将要使⽤的数据字典⽂件的放置⽬录。然后重启数据库使参数⽣效。

2、以sys⽤户连接到数据库执⾏dbmslmd.sql脚本重建dbms_logmnr_d这个包。应⽤Logminer分析重做⽇志⽂件的操作主要有以下步骤:

● 使⽤dbms_logmnr_d⾥的存储过程build创建⼀个外部数据字典⽂件; ● 使⽤dbms_logmnr⾥的存储过程add_logfile添加要分析的⽇志⽂件; ● 使⽤dbms_logmnr⾥的存储过程start_logmnr启动分析; ● 查询与dbms_logmnr相关的⼏个视图来获取⽇志⽂件内容; ● 使⽤dbms_logmnr⾥的存储过程end_logmnr结束分析。▲下⾯详细讲述使⽤的过程

1、使⽤dbms_logmnr_d⾥的存储过程build创建⼀个外部数据字典⽂件:

2、使⽤dbms_logmnr⾥的存储过程add_logfile添加要分析的⽇志⽂件到待分析⽂件列表:

如果没有运⾏在归档模式,那么由于重做⽇志⽂件的循环使⽤可能导致⽇志⽂件被覆盖⽽⽆法获取到所要寻找的恢复条⽬。如果运⾏在归档模式,则可以通过查看$ORACLE_HOME\\admin\\orcl\\bdump⽬录下的alert_orcl.log⾥⽇志⽂件归档的时间和错误操作的时间来确定加⼊哪些归档⽇志⽂件到待分析的⽂件列表中去。

注意:执⾏以上过程时logfilename参数需要写⽇志⽂件的全路径,否则会报错。重复以上操作直到把所有需要分析的⽂件都加到列表中去。这样就可以启动进⾏分析。

3、使⽤dbms_logmnr⾥的存储过程start_logmnr启动分析;这样就可以通过下⾯的查询来获取⽇志⽂件的内容了。4、查询与dbms_logmnr相关的⼏个视图来获取⽇志⽂件内容;

这样就可以找出要恢复所需的语句。注意:v$logmnr_contents只对执⾏dbms_logmnr.start_logmnr的会话有效,如果通过其他会话或者使⽤dbms_logmnr.end_logmnr终⽌了分析,都将不能访问v$logmnr_contents的数据。如果要使其他会话也能获取到这些数据,可以通过另外建表来实现,如:

create table undo_sql as select * from v$logmnr_contents。

再对undo_sql进⾏授权,其他⽤户就可以访问v$logmnr_contents的数据了。5、使⽤dbms_logmnr⾥的存储过程end_logmnr结束分析。

使⽤完成以后⽤下⾯的命令来结束分析活动:exec dbms_logmnr.end_logmnr;这样就释放了分配给logminer的资源(内存和数据结构)。

从上⾯的过程可知,如果是更新的数据量⽐较⼤,⽽⽇志⽂件⽐较⼩,就可能会导致⽇志⽂件的切换。如果没有及时去挖掘⽇志⽂件(没有运⾏在归档模式),那么可能会由于⽇志⽂件的循环使⽤⽽导致数据不可恢复。如果运⾏在归档模式,也可能由于需要分析的⽇志⽂件⽐较多⽽时间较长。四、利⽤flashback新特性恢复数据

Oracle9i 开始提供了闪回查询(Flashback Query)功能,对于误删除或者误更新并且已经commit了的情况提供了简便快捷的恢复⽅法;⽽在Oracle 提供闪回查询之前,碰到这种情况只能通过备份来进⾏基于时间点的恢复或者使⽤logmnr挖掘⽇志来恢复,⽆疑这⽐闪回查询要⿇烦⽽且费时。使⽤这个Flashback Query特性的前提条件:

1. 数据库必须处于Automatic Undo Management 状态。

2. 最⼤可以闪回查询的时间段由UNDO_RETENTION 初始化参数(单位为秒)指定可以通过ALTER SYSTEM SET UNDO_RETENTION = ;来动态修改参数值。▲如何使⽤Flashback Query来恢复数据呢?1. 通过SQL

使⽤SELECT 语句的AS OF 来进⾏闪回查询,语法如下:

使⽤AS OF 关键字来对表,视图或者物化视图进⾏Flashback Query,如果指定了SCN,那么expr 部分必须是⼀个数字,如果指定了TIMESTAMP,那么expr 必须是⼀个timestamp类型的值。查询结果将返回在指定的SCN 或者时间点上的数据。下⾯我们使⽤scott ⽅案来作⼀个实验。

如果想在update 的⼦查询部分使⽤AS OF,那么该查询只能返回⼀条记录,否则将会报错。可以通过添加⼀个临时表作为中转,然后再作更新,如下:2.通过DBMS_FLASHBACK包来恢复DBMS_FLASHBACK 包提供了以下⼏个函数:

ENABLE_AT_TIME:设置当前SESSION 的闪回查询时间

ENABLE_AT_SYSTEM_CHANGE_NUMBER:设置当前SESSION 的闪回查询SCNGET_SYSTEM_CHANGE_NUMBER:取得当前数据库的SCNDISABLE:关闭当前SESSION 的闪回查询

当将⼀个SESSION 设置为闪回查询模式之后,后续的查询都会基于那个时间点或者SCN 的数据库状态,如果SESSION 结束,那么即使没有明确指定DISABLE,闪回查询也会⾃动失效。

当SESSION 运⾏在闪回查询状态时,不允许进⾏任何DML 和DDL 操作。如果要⽤DML操作来进⾏数据恢复就必须使⽤PL/SQL 游标。▲⽰例:

通过上⾯的例⼦可以看出,只要这个修改的时间不早于sysdate- (UNDO_RETENTION指定的秒数),就可通过这种⽅式来恢复数据。

对于问题中的批量数据,可以写个过程来完成获取到更改前的数据:然后再⽤这个临时表⾥的数据来更新TFUNDASSET就可以了。五、总结

⽐较以上⼏种恢复数据的⽅法的使⽤过程,我们可以看出:

● exp/imp只适合于数据变化不⼤的表的数据丢失的情况,即使⽤这种⽅法处理后也需要从业务办理资料中修正数据,否则导致数据丢失;

● 采⽤基于时间点的不完全恢复可以恢复丢失的数据,但是需要关关闭数据库,减少系统可⽤时间,⽽且也会丢失恢复时间点以后的数据;

● 使⽤LogMiner可以较好的恢复数据,但是要求数据库尽可能运⾏在归档模式,否则也可能导致数据丢失。好处是不⽤关闭系统,能够从⽇志⽂件中得到所有的数据。

● 使⽤Flashback最⽅便和简洁,可以直接得到修改前的数据,但是需要依赖系统设置,并且需要占⽤⼤量的回滚表空间。

因此选择什么样的⽅法来恢复数据,取决于你的系统环境和具体情况,不能⽣搬硬套。采⽤正确的⽅法才能最⼤程度的减少数据的丢失。

当然,最好是不需要⽤到这些恢复的办法。前提是,你必须做好以下的⼯作:

1、 为不同环境创建不同的数据库⽤户、不同密码(如果不能⽤户不同,⼀定要密码不同);2、 将owner和应⽤⽤户分开,并做适度授权;

3、 在做DML前,先⽤同样的条件做查询,看根据结果集是否符合预期。

以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流。

因篇幅问题不能全部显示,请点此查看更多更全内容