当前位置 > 主页 > 万和大讲堂 >


Oracle 数据库中数据丢失的几种恢复方法_南京Oracle认证培训分享

2016-08-31 16:40

  无论是开发、测试还是运维过程中,大家都可能会因为误操作、连错数据库、用错用户、语句条件有误等原因,导致错误删除、错误更新等问题。当你恨不得剁掉按回车的那个指头、捶胸顿足、或者吓得腿软时,肯定希望有办法来恢复这些数据。刚好,南京Oracle认证培训提供了一些强大的方法或机制,可以让你找到“后悔药”。


  根据oracle数据库的特点和提供的工具,主要方法有以下几种方法:


  ◆利用逻辑备份使用import工具丢失数据的表


  ◆利用物理备份来通过还原数据文件并进行不完全恢复


  ◆利用dbms_logmnr包从redo log文件中恢复


  ◆利用flashback特性恢复数据


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


  一、利用逻辑备份使用import工具恢复丢失的数据


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


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


  方法一:


  1、把这个表的数据备份到另一个表:


  2、删除该表的记录:


  3、执行下面的命令:



  这个命令中在关键字tables中指定需要导入的表名字,ignore=y表示忽略表已经存在的错误。有疑惑?请在线咨询南京Oracle认证培训


  4、导入结束后,检查表中的记录,并用适当的方法恢复当天的修改。


  方法二:


  1、 把需要恢复的表导入到另一个用户下面:



  2、检查数据以后,把原表记录删除:



  3、然后从另一用户表中插入回去:



  4、 数据量比较大时可以采用如下方法:



  二、利用物理备份来通过还原数据文件并进行不完全恢复


  如果数据库运行在归档模式下,那么可以通过使用以前的数据文件备份进行还原,然后利用归档日志进行前滚,直到回滚到错误操作的时间点前,然后重置日志文件打开数据库。


  可以通过下列方法确认是否是运行在归档模式:



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


  ▲假定在前一天晚上11点做了全库物理备份,那么可以考虑如下恢复:


  1、关闭数据库:


  由于数据库的不完全恢复必须在一个关闭的数据库上实施,利用一个旧的数据库的备份还原,然后用日志根据需要逐步前滚,而不能还原一个新的备份,再回退到某个时间点。


  通知各客户端数据库将关闭,然后发出:



  数据库已经关闭。


  已经卸载数据库。


  ORACLE 例程已经关闭。


  2、确定错误操作的时间:


  可以根据操作员的估计来确定不完全恢复需要前滚停止的时间,也可以利用LogMiner来分析日志文件(这个工具将在后面介绍),找出错误操作的准确时间。


  3、还原数据文件:


  先对当前的数据库文件进行备份,然后再用以前的最近一次备份覆盖现有数据文件。南京Oracle认证培训提醒大家注意:不覆盖现有的控制文件。


  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结束分析。


  3)使用dbms_logmnr里的存储过程start_logmnr启动分析;


  这样就可以通过下面的查询来获取日志文件的内容了。


  4)查询与dbms_logmnr相关的几个视图来获取日志文件内容;


  这样就可以找出要恢复所需的语句。南京Oracle认证培训提醒大家注意: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挖掘日志来恢复,无疑这比闪回查询要麻烦而且费时。


  五、总结


  比较以上几种恢复数据的方法的使用过程,我们可以看出:


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


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


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


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


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


  当然,南京Oracle认证培训希望大家最好是不需要用到这些恢复的办法。前提是,你必须做好以下的工作:


  为不同环境创建不同的数据库用户、不同密码(如果不能用户不同,一定要密码不同);


  将owner和应用用户分开,并做适度授权;


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


  想和兴趣相投的朋友们一起交流吗?那就来江苏万和计算机培训中心吧。而江苏万和作为南京专业的Oracle认证培训中心,也是Oracle等众多厂商的授权培训、考试机构,欢迎广大有志于此行业发展的学员们加入。


最近开班 more>
  • 全栈开发
  • 前端基础班
  • 软件测试
  • Java大数据开发工程师
  • 云原生精英班
  • 开发课程基础班第四期
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第一期
  • Java Web UI Python
  • CISP
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCM 12C
  • OCP 19C
  • RHCE 9.0
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • vip班
  • 考试计划
  • 脱产班
  • 脱产班
  • 脱产班
  • 双休班
  • 双休班
  • 双休班
  • 双休班
  • 业余班
  • 业余班
  • 10月16日
  • 9月23日
  • 9月2日
  • 9月30日
  • 8月26日
  • 10月8日
  • 9月23日
  • 9月16日
  • 9月9日
  • 随时开课
  • 9月21日
  • 10月17日
  • 9月18日
  • 9月2日
  • 11月2日
  • 10月26日
  • 9月7日
  • ——
  • 随时开课
  • 9月26日
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入