使用闪回查询flashback query 恢复Oracle行数据

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638   QQ号:47079569 邮箱:[email protected]

 

 

使用flashback 恢复数据可以使用多种方法完成,可以使用最后一条DROP 语句, SCN 或者实际的时间标记。

FLASHBACK TABLE SQUIRRELPATCH TO BEFORE DROP;
FLASHBACK TABLE SQUIRRELPATCH TO SCN 2202666520;
FLASHBACK TABLE SQUIRRELPATCH to timestamp to_timestamp (’21/03/2006   18:51:06′, ‘mm/dd/yyyy hh24:mi:ss’);

使用flashback ?AS? 查询,相当容易地选择某一时间的数据,只要不是很久之前的,对取证调查员来书哦,查阅某一时间的数据版本是强有力的,将数据恢复到之前最近的状态的最简便方法是使用Flashback Oracle回收站。

但是还存在精确的问题。 实际上Oracle 不记录完整的时间线,每五分钟加入一个新的SCN ,最后一个被取走,使用时间标记得到大约5分钟的精度。随着时间的保持,10g 仍旧比之前的版本更精确,这意味着误差的主要来源可能是计算机硬件和涉及协议(如NTP)的网络时间同步问题。关于时间误差和误差对Oracle Forensics影响的更多细节,请参考第 6.7节。

同时,只要剩下的还原段允许,Oracle 只能闪回到过去的一个点,这由重做保留期控制,通常五天左右,该查询应有助于确定,可用于闪回目标的最古老的时间。

SQL> select OLDEST_FLASHBACK_TIME from  V$FLASHBACK_DATABASE_LOG;

为恢复到比这更久的之前的状态,我们需要使用LogMiner (后面会提到)。关系模式倾向于为一件事物的每个实例保持单行,例如,一个雇员表中雇员的单行。 这对组织数据集是有用的,但对随着时间组织每一个元组的信息是无益的,例如,如果雇员离开了公司,然后又回来了,该数据可能会引起问题。

使用下列的关键词PURGE,数据可能被用户真正删除。

DROP TABLE test PURGE; –this will really delete table test.
PURGE RECYCLEBIN; –this will purge the users recyclebin
PURGE TABLE TEST; –this will delete table test from recyclebin
PURGE TABLE “BIN$04LhcpndanfgMAAAAAANPw==$0”; — purge by new name.
purge index in_test3_03;–you can purge indexes
PURGE TABLESPACE USERS; –purge by tablespace
PURGE TABLESPACE USERS USER SCOTT;–user within tablespace
PURGE DBA_RECYCLEBIN;–purge all objects in recyclebins

Flashback LogMiner 在在线重做日志和归档重做日志上是相互依赖的,所以应该注意保证这些自愿的安全,这些都应该被作为事件处理过程的一部分进行备份。

在重做日志上使用的LogMiner可用于从归档重做日志中高效地浏览和观察删除的历史数据。 

使用 LogMiner 查询归档重做日志:

运行LogMiner的准确的事件顺序如下:

1.    开启补充日志(可选)

2.       指定重做日志文件和它们的路径

3.      分配一个字典

4.       开始 LogMiner

5.       读取关于过去状态的数据,恢复数据库

6.       停止 LogMiner

对上述事件顺序的细节补充如下。

1.  为了使用LogMiner ,补充日志应该使用下列命令启用。

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
And then check it has worked with the following query.
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME..
YES

2.  指定在线重做日志的位置

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME =>
‘/export/home/u01/app/oracle/oradata/sales/redo01.log’, OPTIONS =>
DBMS_LOGMNR.NEW);
PL/SQL procedure successfully completed.
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME =>
‘/export/home/u01/app/oracle/oradata/sales/redo02.log’, OPTIONS =>
DBMS_LOGMNR.ADDFILE);
PL/SQL procedure successfully completed.
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME =>
‘/export/home/u01/app/oracle/oradata/sales/redo03.log’, OPTIONS =>
DBMS_LOGMNR.ADDFILE);
PL/SQL procedure successfully completed.

我在同一行发出这三个命令,因为我没有时间来试验回车,但是字节??? 会使新行在很多行上扩展命令,然后,我们需要的命令来告诉它字典从在线数据库直接取走的位置。

3.  使用在线数据字典目录开始LogMiner

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>
DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
PL/SQL procedure successfully completed

这意味着,在这种情况下的LogMiner将只在正确启动和打开数据库时正确工作,因为我们使用的是数据库在线字典的资源。使用在线目录的问题是只有数据库的当前版本能被查询,因为旧模式已丢失,所以,如果在生产环境下使用LogMiner备份随后的纯文本文件或重做日志本身的模式版本,推荐这种方法,现在 LogMiner 已启动并准备好进行查询。

4.  LogMiner进行查询的例子 – v$logmnr_contents

这是用 v$logmnr_contents进行查询的例子,表示LogMiner能从重做日志中提取所有的数据。

SQL> select scn,timestamp,username,table_name,operation from v$logmnr_contents;

509304 04-JAN-2005 14:00:57 WRH$_SQLBIND INSERT
509304 04-JAN-2005 14:00:57 WRH$_SQLBIND UPDATE
509304 04-JAN-2005 14:00:57 INTERNAL
509304 04-JAN-2005 14:00:57 WRH$_SQLBIND INSERT
509304 04-JAN-2005 14:00:57 WRH$_SQLBIND UPDATE
509304 04-JAN-2005 14:00:57 INTERNAL
509304 04-JAN-2005 14:00:57 WRH$_SQLBIND INSERT
509304 04-JAN-2005 14:00:57 WRH$_SQLBIND UPDATE

5. 结束LogMiner会话
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR

LogMiner 对查询数据的之前版本很有帮助,但它实际上不能显示用户获得这些状态所采取的行动,但是这些信息可以从记录在重做日志的DBEXTENDED 审核中获得,并随后显示。


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *