请选择 进入手机版 | 继续访问电脑版

湖南新梦想

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 277|回复: 0

Oracle数据库数据丢失?这几种方法教你来恢复~(二)

[复制链接]

2493

主题

2892

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10294
发表于 2021-9-23 16:12:07 | 显示全部楼层 |阅读模式
      三、利用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的数据。如果要使其他会话也能获取到这些数据,可以通过另外建表来实现,如:
  createtableundo_sqlasselect*fromv$logmnr_contents。
  再对undo_sql进行授权,其他用户就可以访问v$logmnr_contents的数据了。
  5)使用dbms_logmnr里的存储过程end_logmnr结束分析。
  使用完成以后用下面的命令来结束分析活动:execdbms_logmnr.end_logmnr;
  这样就释放了分配给logminer的资源(内存和数据结构)。
  从上面的过程可知,如果是更新的数据量比较大,而日志文件比较小,就可能会导致日志文件的切换。如果没有及时去挖掘日志文件(没有运行在归档模式),那么可能会由于日志文件的循环使用而导致数据不可恢复。如果运行在归档模式,也可能由于需要分析的日志文件比较多而时间较长。
  四、利用flashback新特性恢复数据
  Oracle9i开始提供了闪回查询(FlashbackQuery)功能,对于误删除或者误更新并且已经commit了的情况提供了简便快捷的恢复方法;而在Oracle提供闪回查询之前,碰到这种情况只能通过备份来进行基于时间点的恢复或者使用logmnr挖掘日志来恢复,无疑这比闪回查询要麻烦而且费时。
  使用这个FlashbackQuery特性的前提条件:
  1.数据库必须处于AutomaticUndoManagement状态。
  2.最大可以闪回查询的时间段由UNDO_RETENTION初始化参数(单位为秒)指定
  可以通过ALTERSYSTEMSETUNDO_RETENTION=<seconds>;来动态修改参数值。
  ▲如何使用FlashbackQuery来恢复数据呢?
  1)通过SQL
  使用SELECT语句的ASOF来进行闪回查询,语法如下:
  使用ASOF关键字来对表,视图或者物化视图进行FlashbackQuery,如果指定了SCN,那么expr部分必须是一个数字,如果指定了TIMESTAMP,那么expr必须是一个timestamp类型的值。查询结果将返回在指定的SCN或者时间点上的数据。
  下面我们使用scott方案来作一个实验。
  如果想在update的子查询部分使用ASOF,那么该查询只能返回一条记录,否则将会报错。
  可以通过添加一个临时表作为中转,然后再作更新,如下:
  2)通过DBMS_FLASHBACK包来恢复
  DBMS_FLASHBACK包提供了以下几个函数:
  ENABLE_AT_TIME:设置当前SESSION的闪回查询时间
  ENABLE_AT_SYSTEM_CHANGE_NUMBER:设置当前SESSION的闪回查询SCN
  GET_SYSTEM_CHANGE_NUMBER:取得当前数据库的SCN
  DISABLE:关闭当前SESSION的闪回查询
  当将一个SESSION设置为闪回查询模式之后,后续的查询都会基于那个时间点或者SCN的数据库状态,如果SESSION结束,那么即使没有明确指定DISABLE,闪回查询也会自动失效。
  当SESSION运行在闪回查询状态时,不允许进行任何DML和DDL操作。如果要用DML操作来进行数据恢复就必须使用PL/SQL游标。
  ▲示例:
  通过上面的例子可以看出,只要这个修改的时间不早于sysdate-(UNDO_RETENTION指定的秒数),就可通过这种方式来恢复数据。
  对于问题中的批量数据,可以写个过程来完成获取到更改前的数据:
  然后再用这个临时表里的数据来更新TFUNDASSET就可以了。
(完)



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|湖南新梦想 ( 湘ICP备18019834号-2 )

GMT+8, 2022-5-18 10:43 , Processed in 0.041404 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表