恢复已删除的记录

3

我不小心删除了表中的一些行并提交了。现在我想恢复它们。

我使用的数据库是Oracle 11g R2。

我使用以下查询来获取已删除的记录:

SELECT * FROM MY_TABLE AS OF TIMESTAMP ('13-MAR-11 8:50:58','DD-MON-YY HH24: MI: SS')

但是执行时却出现错误,提示信息如下:
Error at Command Line:3 Column:75
Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

但是我无法解决这个问题。

有人能帮忙吗?

2个回答

5

需要实际的时间戳(或日期),而你传递了一对值。

尝试:

SELECT * FROM MY_TABLE
AS OF TIMESTAMP TO_DATE('13-MAR-11 08:50:58','DD-MON-YY HH24:MI:SS')

(你的时间格式说明符也不正确,并且与你的日期字符串不匹配。)


非常好用,谢谢。我还有一个小问题。 假设我执行了两个删除操作,在每个操作之后都进行提交。那么我能否回到第一个删除点? 还是只能回到最后一个删除点? - KTB
1
你可以回到几个提交之前。主要因素是是否还存在于撤消表空间中的撤消块以回滚提交。你应该查看 undo_retention 参数和闪回查询文档(以及闪回数据库,甚至是总召回以进行更极端的方法)。 - Mat

2
例如:

举个例子:

    SELECT * FROM EMP AS OF TIMESTAMP 
   TO_TIMESTAMP('2005-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
   WHERE name = 'JOHN';

但是回滚查询可能会出现ORA-1555错误,还有另一种选择:

日志挖掘(Logminer)

如果启用了Oracle补充日志,则可以获取删除语句的撤消SQL。

-- switch again logfile to get a minimal redo activity alter system switch logfile;

-- mine the last written archived log 
exec dbms_logmnr.add_logfile('archivelog/redologfile', options =>dbms_logmnr.new); 
exec dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog); 
select operation, sql_redo from v$logmnr_contents where seg_name = 'EMP';

Oracle PRM-DUL

PRM-DUL是最后的选择。即使在Oracle块中删除行片段时只是用删除掩码标记了行标志,该行片段仍然可以通过扫描Oracle数据块来读取。PRM-DUL可以扫描整个表,找出每个被标记为删除的记录/行片段,并将其写入平面文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接